… | |
… | |
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 | |
|
|
188 | #if EV_NO_THREADS |
|
|
189 | # undef EV_NO_SMP |
|
|
190 | # define EV_NO_SMP 1 |
|
|
191 | # undef ECB_NO_THREADS |
|
|
192 | # define ECB_NO_THREADS 1 |
|
|
193 | #endif |
|
|
194 | #if EV_NO_SMP |
|
|
195 | # undef EV_NO_SMP |
|
|
196 | # define ECB_NO_SMP 1 |
|
|
197 | #endif |
|
|
198 | |
188 | #ifndef _WIN32 |
199 | #ifndef _WIN32 |
189 | # include <sys/time.h> |
200 | # include <sys/time.h> |
190 | # include <sys/wait.h> |
201 | # include <sys/wait.h> |
191 | # include <unistd.h> |
202 | # include <unistd.h> |
192 | #else |
203 | #else |
… | |
… | |
534 | /*****************************************************************************/ |
545 | /*****************************************************************************/ |
535 | |
546 | |
536 | /* ECB_NO_THREADS - ecb is not used by multiple threads, ever */ |
547 | /* ECB_NO_THREADS - ecb is not used by multiple threads, ever */ |
537 | /* ECB_NO_SMP - ecb might be used in multiple threads, but only on a single cpu */ |
548 | /* ECB_NO_SMP - ecb might be used in multiple threads, but only on a single cpu */ |
538 | |
549 | |
|
|
550 | #if ECB_NO_THREADS |
|
|
551 | # define ECB_NO_SMP 1 |
|
|
552 | #endif |
|
|
553 | |
539 | #if ECB_NO_THREADS || ECB_NO_SMP |
554 | #if ECB_NO_THREADS || ECB_NO_SMP |
540 | #define ECB_MEMORY_FENCE do { } while (0) |
555 | #define ECB_MEMORY_FENCE do { } while (0) |
541 | #endif |
556 | #endif |
542 | |
557 | |
543 | #ifndef ECB_MEMORY_FENCE |
558 | #ifndef ECB_MEMORY_FENCE |
544 | #if ECB_GCC_VERSION(2,5) || defined(__INTEL_COMPILER) || defined(__clang__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 |
559 | #if ECB_GCC_VERSION(2,5) || defined(__INTEL_COMPILER) || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 |
545 | #if __i386 || __i386__ |
560 | #if __i386 || __i386__ |
546 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") |
561 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") |
547 | #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE /* non-lock xchg might be enough */ |
562 | #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE /* non-lock xchg might be enough */ |
548 | #define ECB_MEMORY_FENCE_RELEASE do { } while (0) /* unlikely to change in future cpus */ |
563 | #define ECB_MEMORY_FENCE_RELEASE do { } while (0) /* unlikely to change in future cpus */ |
549 | #elif __amd64 || __amd64__ || __x86_64 || __x86_64__ |
564 | #elif __amd64 || __amd64__ || __x86_64 || __x86_64__ |
… | |
… | |
558 | #elif defined(__ARM_ARCH_7__ ) || defined(__ARM_ARCH_7A__ ) \ |
573 | #elif defined(__ARM_ARCH_7__ ) || defined(__ARM_ARCH_7A__ ) \ |
559 | || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7R__ ) |
574 | || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7R__ ) |
560 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb" : : : "memory") |
575 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb" : : : "memory") |
561 | #elif __sparc || __sparc__ |
576 | #elif __sparc || __sparc__ |
562 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad | #StoreStore | #StoreLoad | " : : : "memory") |
577 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad | #StoreStore | #StoreLoad | " : : : "memory") |
563 | #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad" : : : "memory") |
578 | #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad" : : : "memory") |
564 | #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("membar #LoadStore | #StoreStore") |
579 | #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("membar #LoadStore | #StoreStore") |
|
|
580 | #elif defined(__s390__) || defined(__s390x__) |
|
|
581 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory") |
565 | #endif |
582 | #endif |
566 | #endif |
583 | #endif |
567 | #endif |
584 | #endif |
568 | |
585 | |
569 | #ifndef ECB_MEMORY_FENCE |
586 | #ifndef ECB_MEMORY_FENCE |
… | |
… | |
854 | |
871 | |
855 | #if ECB_GCC_VERSION(4,5) |
872 | #if ECB_GCC_VERSION(4,5) |
856 | #define ecb_unreachable() __builtin_unreachable () |
873 | #define ecb_unreachable() __builtin_unreachable () |
857 | #else |
874 | #else |
858 | /* this seems to work fine, but gcc always emits a warning for it :/ */ |
875 | /* this seems to work fine, but gcc always emits a warning for it :/ */ |
859 | ecb_function_ void ecb_unreachable (void) ecb_noreturn; |
876 | ecb_inline void ecb_unreachable (void) ecb_noreturn; |
860 | ecb_function_ void ecb_unreachable (void) { } |
877 | ecb_inline void ecb_unreachable (void) { } |
861 | #endif |
878 | #endif |
862 | |
879 | |
863 | /* try to tell the compiler that some condition is definitely true */ |
880 | /* try to tell the compiler that some condition is definitely true */ |
864 | #define ecb_assume(cond) do { if (!(cond)) ecb_unreachable (); } while (0) |
881 | #define ecb_assume(cond) do { if (!(cond)) ecb_unreachable (); } while (0) |
865 | |
882 | |
866 | ecb_function_ unsigned char ecb_byteorder_helper (void) ecb_const; |
883 | ecb_inline unsigned char ecb_byteorder_helper (void) ecb_const; |
867 | ecb_function_ unsigned char |
884 | ecb_inline unsigned char |
868 | ecb_byteorder_helper (void) |
885 | ecb_byteorder_helper (void) |
869 | { |
886 | { |
870 | const uint32_t u = 0x11223344; |
887 | const uint32_t u = 0x11223344; |
871 | return *(unsigned char *)&u; |
888 | return *(unsigned char *)&u; |
872 | } |
889 | } |
873 | |
890 | |
874 | ecb_function_ ecb_bool ecb_big_endian (void) ecb_const; |
891 | ecb_inline ecb_bool ecb_big_endian (void) ecb_const; |
875 | ecb_function_ ecb_bool ecb_big_endian (void) { return ecb_byteorder_helper () == 0x11; } |
892 | ecb_inline ecb_bool ecb_big_endian (void) { return ecb_byteorder_helper () == 0x11; } |
876 | ecb_function_ ecb_bool ecb_little_endian (void) ecb_const; |
893 | ecb_inline ecb_bool ecb_little_endian (void) ecb_const; |
877 | ecb_function_ ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44; } |
894 | ecb_inline ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44; } |
878 | |
895 | |
879 | #if ECB_GCC_VERSION(3,0) || ECB_C99 |
896 | #if ECB_GCC_VERSION(3,0) || ECB_C99 |
880 | #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) |
897 | #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) |
881 | #else |
898 | #else |
882 | #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) |
899 | #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) |
… | |
… | |
3299 | void noinline |
3316 | void noinline |
3300 | ev_timer_again (EV_P_ ev_timer *w) |
3317 | ev_timer_again (EV_P_ ev_timer *w) |
3301 | { |
3318 | { |
3302 | EV_FREQUENT_CHECK; |
3319 | EV_FREQUENT_CHECK; |
3303 | |
3320 | |
3304 | clear_pending (EV_A_ w); |
3321 | clear_pending (EV_A_ (W)w); |
3305 | |
3322 | |
3306 | if (ev_is_active (w)) |
3323 | if (ev_is_active (w)) |
3307 | { |
3324 | { |
3308 | if (w->repeat) |
3325 | if (w->repeat) |
3309 | { |
3326 | { |