… | |
… | |
59 | # endif |
59 | # endif |
60 | # ifndef EV_USE_MONOTONIC |
60 | # ifndef EV_USE_MONOTONIC |
61 | # define EV_USE_MONOTONIC 1 |
61 | # define EV_USE_MONOTONIC 1 |
62 | # endif |
62 | # endif |
63 | # endif |
63 | # endif |
64 | # elif !defined(EV_USE_CLOCK_SYSCALL) |
64 | # elif !defined EV_USE_CLOCK_SYSCALL |
65 | # define EV_USE_CLOCK_SYSCALL 0 |
65 | # define EV_USE_CLOCK_SYSCALL 0 |
66 | # endif |
66 | # endif |
67 | |
67 | |
68 | # if HAVE_CLOCK_GETTIME |
68 | # if HAVE_CLOCK_GETTIME |
69 | # ifndef EV_USE_MONOTONIC |
69 | # ifndef EV_USE_MONOTONIC |
… | |
… | |
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 |
… | |
… | |
208 | #define _DARWIN_UNLIMITED_SELECT 1 |
219 | #define _DARWIN_UNLIMITED_SELECT 1 |
209 | |
220 | |
210 | /* this block tries to deduce configuration from header-defined symbols and defaults */ |
221 | /* this block tries to deduce configuration from header-defined symbols and defaults */ |
211 | |
222 | |
212 | /* try to deduce the maximum number of signals on this platform */ |
223 | /* try to deduce the maximum number of signals on this platform */ |
213 | #if defined (EV_NSIG) |
224 | #if defined EV_NSIG |
214 | /* use what's provided */ |
225 | /* use what's provided */ |
215 | #elif defined (NSIG) |
226 | #elif defined NSIG |
216 | # define EV_NSIG (NSIG) |
227 | # define EV_NSIG (NSIG) |
217 | #elif defined(_NSIG) |
228 | #elif defined _NSIG |
218 | # define EV_NSIG (_NSIG) |
229 | # define EV_NSIG (_NSIG) |
219 | #elif defined (SIGMAX) |
230 | #elif defined SIGMAX |
220 | # define EV_NSIG (SIGMAX+1) |
231 | # define EV_NSIG (SIGMAX+1) |
221 | #elif defined (SIG_MAX) |
232 | #elif defined SIG_MAX |
222 | # define EV_NSIG (SIG_MAX+1) |
233 | # define EV_NSIG (SIG_MAX+1) |
223 | #elif defined (_SIG_MAX) |
234 | #elif defined _SIG_MAX |
224 | # define EV_NSIG (_SIG_MAX+1) |
235 | # define EV_NSIG (_SIG_MAX+1) |
225 | #elif defined (MAXSIG) |
236 | #elif defined MAXSIG |
226 | # define EV_NSIG (MAXSIG+1) |
237 | # define EV_NSIG (MAXSIG+1) |
227 | #elif defined (MAX_SIG) |
238 | #elif defined MAX_SIG |
228 | # define EV_NSIG (MAX_SIG+1) |
239 | # define EV_NSIG (MAX_SIG+1) |
229 | #elif defined (SIGARRAYSIZE) |
240 | #elif defined SIGARRAYSIZE |
230 | # define EV_NSIG (SIGARRAYSIZE) /* Assume ary[SIGARRAYSIZE] */ |
241 | # define EV_NSIG (SIGARRAYSIZE) /* Assume ary[SIGARRAYSIZE] */ |
231 | #elif defined (_sys_nsig) |
242 | #elif defined _sys_nsig |
232 | # define EV_NSIG (_sys_nsig) /* Solaris 2.5 */ |
243 | # define EV_NSIG (_sys_nsig) /* Solaris 2.5 */ |
233 | #else |
244 | #else |
234 | # error "unable to find value for NSIG, please report" |
245 | # error "unable to find value for NSIG, please report" |
235 | /* to make it compile regardless, just remove the above line, */ |
246 | /* to make it compile regardless, just remove the above line, */ |
236 | /* but consider reporting it, too! :) */ |
247 | /* but consider reporting it, too! :) */ |
… | |
… | |
248 | # define EV_USE_CLOCK_SYSCALL 0 |
259 | # define EV_USE_CLOCK_SYSCALL 0 |
249 | # endif |
260 | # endif |
250 | #endif |
261 | #endif |
251 | |
262 | |
252 | #ifndef EV_USE_MONOTONIC |
263 | #ifndef EV_USE_MONOTONIC |
253 | # if defined (_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0 |
264 | # if defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0 |
254 | # define EV_USE_MONOTONIC EV_FEATURE_OS |
265 | # define EV_USE_MONOTONIC EV_FEATURE_OS |
255 | # else |
266 | # else |
256 | # define EV_USE_MONOTONIC 0 |
267 | # define EV_USE_MONOTONIC 0 |
257 | # endif |
268 | # endif |
258 | #endif |
269 | #endif |
… | |
… | |
384 | # define EV_USE_INOTIFY 0 |
395 | # define EV_USE_INOTIFY 0 |
385 | #endif |
396 | #endif |
386 | |
397 | |
387 | #if !EV_USE_NANOSLEEP |
398 | #if !EV_USE_NANOSLEEP |
388 | /* hp-ux has it in sys/time.h, which we unconditionally include above */ |
399 | /* hp-ux has it in sys/time.h, which we unconditionally include above */ |
389 | # if !defined(_WIN32) && !defined(__hpux) |
400 | # if !defined _WIN32 && !defined __hpux |
390 | # include <sys/select.h> |
401 | # include <sys/select.h> |
391 | # endif |
402 | # endif |
392 | #endif |
403 | #endif |
393 | |
404 | |
394 | #if EV_USE_INOTIFY |
405 | #if EV_USE_INOTIFY |
… | |
… | |
522 | * or so. |
533 | * or so. |
523 | * we try to detect these and simply assume they are not gcc - if they have |
534 | * we try to detect these and simply assume they are not gcc - if they have |
524 | * an issue with that they should have done it right in the first place. |
535 | * an issue with that they should have done it right in the first place. |
525 | */ |
536 | */ |
526 | #ifndef ECB_GCC_VERSION |
537 | #ifndef ECB_GCC_VERSION |
527 | #if !defined(__GNUC_MINOR__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__llvm__) || defined(__clang__) |
538 | #if !defined __GNUC_MINOR__ || defined __INTEL_COMPILER || defined __SUNPRO_C || defined __SUNPRO_CC || defined __llvm__ || defined __clang__ |
528 | #define ECB_GCC_VERSION(major,minor) 0 |
539 | #define ECB_GCC_VERSION(major,minor) 0 |
529 | #else |
540 | #else |
530 | #define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) |
541 | #define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) |
531 | #endif |
542 | #endif |
532 | #endif |
543 | #endif |
… | |
… | |
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__ |
550 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory") |
565 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory") |
551 | #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("lfence" : : : "memory") |
566 | #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("lfence" : : : "memory") |
552 | #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("sfence") /* play safe - not needed in any current cpu */ |
567 | #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("sfence") /* play safe - not needed in any current cpu */ |
553 | #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ |
568 | #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ |
554 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory") |
569 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory") |
555 | #elif defined(__ARM_ARCH_6__ ) || defined(__ARM_ARCH_6J__ ) \ |
570 | #elif defined __ARM_ARCH_6__ || defined __ARM_ARCH_6J__ \ |
556 | || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) |
571 | || 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") |
572 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mcr p15,0,%0,c7,c10,5" : : "r" (0) : "memory") |
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") |
565 | #elif defined(__s390__) || defined(__s390x__) |
580 | #elif defined __s390__ || defined __s390x__ |
566 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory") |
581 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory") |
|
|
582 | #elif defined __mips__ |
|
|
583 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory") |
567 | #endif |
584 | #endif |
568 | #endif |
585 | #endif |
569 | #endif |
586 | #endif |
570 | |
587 | |
571 | #ifndef ECB_MEMORY_FENCE |
588 | #ifndef ECB_MEMORY_FENCE |
572 | #if ECB_GCC_VERSION(4,4) || defined(__INTEL_COMPILER) || defined(__clang__) |
589 | #if ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ |
573 | #define ECB_MEMORY_FENCE __sync_synchronize () |
590 | #define ECB_MEMORY_FENCE __sync_synchronize () |
574 | /*#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */ |
591 | /*#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */ |
575 | /*#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) */ |
592 | /*#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) */ |
576 | #elif _MSC_VER >= 1400 /* VC++ 2005 */ |
593 | #elif _MSC_VER >= 1400 /* VC++ 2005 */ |
577 | #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) |
594 | #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) |
578 | #define ECB_MEMORY_FENCE _ReadWriteBarrier () |
595 | #define ECB_MEMORY_FENCE _ReadWriteBarrier () |
579 | #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ |
596 | #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ |
580 | #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () |
597 | #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () |
581 | #elif defined(_WIN32) |
598 | #elif defined _WIN32 |
582 | #include <WinNT.h> |
599 | #include <WinNT.h> |
583 | #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ |
600 | #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ |
584 | #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 |
601 | #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 |
585 | #include <mbarrier.h> |
602 | #include <mbarrier.h> |
586 | #define ECB_MEMORY_FENCE __machine_rw_barrier () |
603 | #define ECB_MEMORY_FENCE __machine_rw_barrier () |
587 | #define ECB_MEMORY_FENCE_ACQUIRE __machine_r_barrier () |
604 | #define ECB_MEMORY_FENCE_ACQUIRE __machine_r_barrier () |
588 | #define ECB_MEMORY_FENCE_RELEASE __machine_w_barrier () |
605 | #define ECB_MEMORY_FENCE_RELEASE __machine_w_barrier () |
|
|
606 | #elif __xlC__ |
|
|
607 | #define ECB_MEMORY_FENCE __sync () |
589 | #endif |
608 | #endif |
590 | #endif |
609 | #endif |
591 | |
610 | |
592 | #ifndef ECB_MEMORY_FENCE |
611 | #ifndef ECB_MEMORY_FENCE |
593 | #if !ECB_AVOID_PTHREADS |
612 | #if !ECB_AVOID_PTHREADS |
… | |
… | |
605 | static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER; |
624 | static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER; |
606 | #define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0) |
625 | #define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0) |
607 | #endif |
626 | #endif |
608 | #endif |
627 | #endif |
609 | |
628 | |
610 | #if !defined(ECB_MEMORY_FENCE_ACQUIRE) && defined(ECB_MEMORY_FENCE) |
629 | #if !defined ECB_MEMORY_FENCE_ACQUIRE && defined ECB_MEMORY_FENCE |
611 | #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE |
630 | #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE |
612 | #endif |
631 | #endif |
613 | |
632 | |
614 | #if !defined(ECB_MEMORY_FENCE_RELEASE) && defined(ECB_MEMORY_FENCE) |
633 | #if !defined ECB_MEMORY_FENCE_RELEASE && defined ECB_MEMORY_FENCE |
615 | #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE |
634 | #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE |
616 | #endif |
635 | #endif |
617 | |
636 | |
618 | /*****************************************************************************/ |
637 | /*****************************************************************************/ |
619 | |
638 | |
… | |
… | |
1313 | #if EV_USE_NANOSLEEP |
1332 | #if EV_USE_NANOSLEEP |
1314 | struct timespec ts; |
1333 | struct timespec ts; |
1315 | |
1334 | |
1316 | EV_TS_SET (ts, delay); |
1335 | EV_TS_SET (ts, delay); |
1317 | nanosleep (&ts, 0); |
1336 | nanosleep (&ts, 0); |
1318 | #elif defined(_WIN32) |
1337 | #elif defined _WIN32 |
1319 | Sleep ((unsigned long)(delay * 1e3)); |
1338 | Sleep ((unsigned long)(delay * 1e3)); |
1320 | #else |
1339 | #else |
1321 | struct timeval tv; |
1340 | struct timeval tv; |
1322 | |
1341 | |
1323 | /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */ |
1342 | /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */ |
… | |
… | |
1856 | /* win32 people keep sending patches that change this write() to send() */ |
1875 | /* win32 people keep sending patches that change this write() to send() */ |
1857 | /* and then run away. but send() is wrong, it wants a socket handle on win32 */ |
1876 | /* and then run away. but send() is wrong, it wants a socket handle on win32 */ |
1858 | /* so when you think this write should be a send instead, please find out */ |
1877 | /* so when you think this write should be a send instead, please find out */ |
1859 | /* where your send() is from - it's definitely not the microsoft send, and */ |
1878 | /* where your send() is from - it's definitely not the microsoft send, and */ |
1860 | /* tell me. thank you. */ |
1879 | /* tell me. thank you. */ |
|
|
1880 | /* it might be that your problem is that your environment needs EV_USE_WSASOCKET */ |
|
|
1881 | /* check the ev documentation on how to use this flag */ |
1861 | write (evpipe [1], &(evpipe [1]), 1); |
1882 | write (evpipe [1], &(evpipe [1]), 1); |
1862 | } |
1883 | } |
1863 | |
1884 | |
1864 | errno = old_errno; |
1885 | errno = old_errno; |
1865 | } |
1886 | } |
… | |
… | |
3720 | } |
3741 | } |
3721 | |
3742 | |
3722 | inline_size int |
3743 | inline_size int |
3723 | infy_newfd (void) |
3744 | infy_newfd (void) |
3724 | { |
3745 | { |
3725 | #if defined (IN_CLOEXEC) && defined (IN_NONBLOCK) |
3746 | #if defined IN_CLOEXEC && defined IN_NONBLOCK |
3726 | int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK); |
3747 | int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK); |
3727 | if (fd >= 0) |
3748 | if (fd >= 0) |
3728 | return fd; |
3749 | return fd; |
3729 | #endif |
3750 | #endif |
3730 | return inotify_init (); |
3751 | return inotify_init (); |