ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev.c
(Generate patch)

Comparing libev/ev.c (file contents):
Revision 1.392 by root, Thu Aug 4 14:37:49 2011 UTC vs.
Revision 1.402 by sf-exg, Tue Dec 20 10:34:10 2011 UTC

183# include EV_H 183# include EV_H
184#else 184#else
185# include "ev.h" 185# include "ev.h"
186#endif 186#endif
187 187
188EV_CPP(extern "C" {)
189
190#ifndef _WIN32 188#ifndef _WIN32
191# include <sys/time.h> 189# include <sys/time.h>
192# include <sys/wait.h> 190# include <sys/wait.h>
193# include <unistd.h> 191# include <unistd.h>
194#else 192#else
537 535
538/* ECB_NO_THREADS - ecb is not used by multiple threads, ever */ 536/* ECB_NO_THREADS - ecb is not used by multiple threads, ever */
539/* ECB_NO_SMP - ecb might be used in multiple threads, but only on a single cpu */ 537/* ECB_NO_SMP - ecb might be used in multiple threads, but only on a single cpu */
540 538
541#if ECB_NO_THREADS || ECB_NO_SMP 539#if ECB_NO_THREADS || ECB_NO_SMP
542 #define ECB_MEMORY_FENCE do { } while (0) 540 #define ECB_MEMORY_FENCE do { } while (0)
543 #define ECB_MEMORY_FENCE_ACQUIRE do { } while (0)
544 #define ECB_MEMORY_FENCE_RELEASE do { } while (0)
545#endif 541#endif
546 542
547#ifndef ECB_MEMORY_FENCE 543#ifndef ECB_MEMORY_FENCE
548 #if ECB_GCC_VERSION(2,5) 544 #if ECB_GCC_VERSION(2,5) || defined(__INTEL_COMPILER) || defined(__clang__)
549 #if __x86 545 #if __i386__
550 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") 546 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory")
551 #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE /* non-lock xchg might be enough */ 547 #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE /* non-lock xchg might be enough */
552 #define ECB_MEMORY_FENCE_RELEASE do { } while (0) /* unlikely to change in future cpus */ 548 #define ECB_MEMORY_FENCE_RELEASE do { } while (0) /* unlikely to change in future cpus */
553 #elif __amd64 549 #elif __amd64
554 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory") 550 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory")
555 #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("lfence" : : : "memory") 551 #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("lfence" : : : "memory")
556 #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("sfence") /* play safe - not needed in any current cpu */ 552 #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("sfence") /* play safe - not needed in any current cpu */
557 #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ 553 #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__
558 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory") 554 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory")
559 #elif defined(__ARM_ARCH_6__ ) || defined(__ARM_ARCH_6J__ ) \ 555 #elif defined(__ARM_ARCH_6__ ) || defined(__ARM_ARCH_6J__ ) \
560 || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) \ 556 || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__)
557 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mcr p15,0,%0,c7,c10,5" : : "r" (0) : "memory")
561 || defined(__ARM_ARCH_7__ ) || defined(__ARM_ARCH_7A__ ) \ 558 #elif defined(__ARM_ARCH_7__ ) || defined(__ARM_ARCH_7A__ ) \
562 || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7R__ ) 559 || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7R__ )
563 #define ECB_MEMORY_FENCE \ 560 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb" : : : "memory")
564 do { \
565 int null = 0; \
566 __asm__ __volatile__ ("mcr p15,0,%0,c6,c10,5", : "=&r" (null) : : "memory"); \
567 while (0)
568 #endif 561 #endif
569 #endif 562 #endif
570#endif 563#endif
571 564
572#ifndef ECB_MEMORY_FENCE 565#ifndef ECB_MEMORY_FENCE
573 #if ECB_GCC_VERSION(4,4) || defined(__INTEL_COMPILER) 566 #if ECB_GCC_VERSION(4,4) || defined(__INTEL_COMPILER) || defined(__clang__)
574 #define ECB_MEMORY_FENCE __sync_synchronize () 567 #define ECB_MEMORY_FENCE __sync_synchronize ()
575 /*#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */ 568 /*#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */
576 /*#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) */ 569 /*#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) */
577 #elif _MSC_VER >= 1400 /* VC++ 2005 */ 570 #elif _MSC_VER >= 1400 /* VC++ 2005 */
578 #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) 571 #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier)
848 #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) 841 #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0))
849#else 842#else
850 #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) 843 #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n)))
851#endif 844#endif
852 845
846#if __cplusplus
847 template<typename T>
848 static inline T ecb_div_rd (T val, T div)
849 {
850 return val < 0 ? - ((-val + div - 1) / div) : (val ) / div;
851 }
852 template<typename T>
853 static inline T ecb_div_ru (T val, T div)
854 {
855 return val < 0 ? - ((-val ) / div) : (val + div - 1) / div;
856 }
857#else
858 #define ecb_div_rd(val,div) ((val) < 0 ? - ((-(val) + (div) - 1) / (div)) : ((val) ) / (div))
859 #define ecb_div_ru(val,div) ((val) < 0 ? - ((-(val) ) / (div)) : ((val) + (div) - 1) / (div))
860#endif
861
853#if ecb_cplusplus_does_not_suck 862#if ecb_cplusplus_does_not_suck
854 /* does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) */ 863 /* does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) */
855 template<typename T, int N> 864 template<typename T, int N>
856 static inline int ecb_array_length (const T (&arr)[N]) 865 static inline int ecb_array_length (const T (&arr)[N])
857 { 866 {
864#endif 873#endif
865 874
866/* ECB.H END */ 875/* ECB.H END */
867 876
868#if ECB_MEMORY_FENCE_NEEDS_PTHREADS 877#if ECB_MEMORY_FENCE_NEEDS_PTHREADS
878/* if your architecture doesn't need memory fences, e.g. because it is
879 * single-cpu/core, or if you use libev in a project that doesn't use libev
880 * from multiple threads, then you can define ECB_AVOID_PTHREADS when compiling
881 * libev, in which cases the memory fences become nops.
882 * alternatively, you can remove this #error and link against libpthread,
883 * which will then provide the memory fences.
884 */
885# error "memory fences not defined for your architecture, please report"
886#endif
887
869# undef ECB_MEMORY_FENCE 888#ifndef ECB_MEMORY_FENCE
870# undef ECB_MEMORY_FENCE_ACQUIRE 889# define ECB_MEMORY_FENCE do { } while (0)
871# undef ECB_MEMORY_FENCE_RELEASE 890# define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE
891# define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE
872#endif 892#endif
873 893
874#define expect_false(cond) ecb_expect_false (cond) 894#define expect_false(cond) ecb_expect_false (cond)
875#define expect_true(cond) ecb_expect_true (cond) 895#define expect_true(cond) ecb_expect_true (cond)
876#define noinline ecb_noinline 896#define noinline ecb_noinline
1173 #undef VAR 1193 #undef VAR
1174 }; 1194 };
1175 #include "ev_wrap.h" 1195 #include "ev_wrap.h"
1176 1196
1177 static struct ev_loop default_loop_struct; 1197 static struct ev_loop default_loop_struct;
1178 struct ev_loop *ev_default_loop_ptr; 1198 EV_API_DECL struct ev_loop *ev_default_loop_ptr = 0; /* needs to be initialised to make it a definition despite extern */
1179 1199
1180#else 1200#else
1181 1201
1182 ev_tstamp ev_rt_now; 1202 EV_API_DECL ev_tstamp ev_rt_now = 0; /* needs to be initialised to make it a definition despite extern */
1183 #define VAR(name,decl) static decl; 1203 #define VAR(name,decl) static decl;
1184 #include "ev_vars.h" 1204 #include "ev_vars.h"
1185 #undef VAR 1205 #undef VAR
1186 1206
1187 static int ev_default_loop_ptr; 1207 static int ev_default_loop_ptr;
1281 1301
1282 do 1302 do
1283 ncur <<= 1; 1303 ncur <<= 1;
1284 while (cnt > ncur); 1304 while (cnt > ncur);
1285 1305
1286 /* if size is large, round to MALLOC_ROUND - 4 * longs to accomodate malloc overhead */ 1306 /* if size is large, round to MALLOC_ROUND - 4 * longs to accommodate malloc overhead */
1287 if (elem * ncur > MALLOC_ROUND - sizeof (void *) * 4) 1307 if (elem * ncur > MALLOC_ROUND - sizeof (void *) * 4)
1288 { 1308 {
1289 ncur *= elem; 1309 ncur *= elem;
1290 ncur = (ncur + elem + (MALLOC_ROUND - 1) + sizeof (void *) * 4) & ~(MALLOC_ROUND - 1); 1310 ncur = (ncur + elem + (MALLOC_ROUND - 1) + sizeof (void *) * 4) & ~(MALLOC_ROUND - 1);
1291 ncur = ncur - sizeof (void *) * 4; 1311 ncur = ncur - sizeof (void *) * 4;
2971#endif 2991#endif
2972 assert ((loop_done = EVBREAK_RECURSE, 1)); /* assert for side effect */ 2992 assert ((loop_done = EVBREAK_RECURSE, 1)); /* assert for side effect */
2973 backend_poll (EV_A_ waittime); 2993 backend_poll (EV_A_ waittime);
2974 assert ((loop_done = EVBREAK_CANCEL, 1)); /* assert for side effect */ 2994 assert ((loop_done = EVBREAK_CANCEL, 1)); /* assert for side effect */
2975 2995
2976 pipe_write_wanted = 0; /* just an optimsiation, no fence needed */ 2996 pipe_write_wanted = 0; /* just an optimisation, no fence needed */
2977 2997
2978 if (pipe_write_skipped) 2998 if (pipe_write_skipped)
2979 { 2999 {
2980 assert (("libev: pipe_w not active, but pipe not written", ev_is_active (&pipe_w))); 3000 assert (("libev: pipe_w not active, but pipe not written", ev_is_active (&pipe_w)));
2981 ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM); 3001 ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM);
4394 4414
4395#if EV_MULTIPLICITY 4415#if EV_MULTIPLICITY
4396 #include "ev_wrap.h" 4416 #include "ev_wrap.h"
4397#endif 4417#endif
4398 4418
4399EV_CPP(})
4400

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines