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

Comparing libev/ev.c (file contents):
Revision 1.407 by root, Wed Jan 25 01:32:12 2012 UTC vs.
Revision 1.417 by root, Mon Apr 2 20:22:30 2012 UTC

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")
580 #elif defined __s390__ || defined __s390x__
581 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory")
582 #elif defined __mips__
583 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory")
565 #endif 584 #endif
566 #endif 585 #endif
567#endif 586#endif
568 587
569#ifndef ECB_MEMORY_FENCE 588#ifndef ECB_MEMORY_FENCE
570 #if ECB_GCC_VERSION(4,4) || defined(__INTEL_COMPILER) || defined(__clang__) 589 #if ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__
571 #define ECB_MEMORY_FENCE __sync_synchronize () 590 #define ECB_MEMORY_FENCE __sync_synchronize ()
572 /*#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); }) */
573 /*#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 ); }) */
574 #elif _MSC_VER >= 1400 /* VC++ 2005 */ 593 #elif _MSC_VER >= 1400 /* VC++ 2005 */
575 #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) 594 #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier)
576 #define ECB_MEMORY_FENCE _ReadWriteBarrier () 595 #define ECB_MEMORY_FENCE _ReadWriteBarrier ()
577 #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 */
578 #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () 597 #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier ()
579 #elif defined(_WIN32) 598 #elif defined _WIN32
580 #include <WinNT.h> 599 #include <WinNT.h>
581 #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ 600 #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */
582 #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 601 #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110
583 #include <mbarrier.h> 602 #include <mbarrier.h>
584 #define ECB_MEMORY_FENCE __machine_rw_barrier () 603 #define ECB_MEMORY_FENCE __machine_rw_barrier ()
585 #define ECB_MEMORY_FENCE_ACQUIRE __machine_r_barrier () 604 #define ECB_MEMORY_FENCE_ACQUIRE __machine_r_barrier ()
586 #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 ()
587 #endif 608 #endif
588#endif 609#endif
589 610
590#ifndef ECB_MEMORY_FENCE 611#ifndef ECB_MEMORY_FENCE
591 #if !ECB_AVOID_PTHREADS 612 #if !ECB_AVOID_PTHREADS
603 static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER; 624 static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER;
604 #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)
605 #endif 626 #endif
606#endif 627#endif
607 628
608#if !defined(ECB_MEMORY_FENCE_ACQUIRE) && defined(ECB_MEMORY_FENCE) 629#if !defined ECB_MEMORY_FENCE_ACQUIRE && defined ECB_MEMORY_FENCE
609 #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE 630 #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE
610#endif 631#endif
611 632
612#if !defined(ECB_MEMORY_FENCE_RELEASE) && defined(ECB_MEMORY_FENCE) 633#if !defined ECB_MEMORY_FENCE_RELEASE && defined ECB_MEMORY_FENCE
613 #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE 634 #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE
614#endif 635#endif
615 636
616/*****************************************************************************/ 637/*****************************************************************************/
617 638
854 875
855#if ECB_GCC_VERSION(4,5) 876#if ECB_GCC_VERSION(4,5)
856 #define ecb_unreachable() __builtin_unreachable () 877 #define ecb_unreachable() __builtin_unreachable ()
857#else 878#else
858 /* this seems to work fine, but gcc always emits a warning for it :/ */ 879 /* this seems to work fine, but gcc always emits a warning for it :/ */
859 ecb_function_ void ecb_unreachable (void) ecb_noreturn; 880 ecb_inline void ecb_unreachable (void) ecb_noreturn;
860 ecb_function_ void ecb_unreachable (void) { } 881 ecb_inline void ecb_unreachable (void) { }
861#endif 882#endif
862 883
863/* try to tell the compiler that some condition is definitely true */ 884/* try to tell the compiler that some condition is definitely true */
864#define ecb_assume(cond) do { if (!(cond)) ecb_unreachable (); } while (0) 885#define ecb_assume(cond) do { if (!(cond)) ecb_unreachable (); } while (0)
865 886
866ecb_function_ unsigned char ecb_byteorder_helper (void) ecb_const; 887ecb_inline unsigned char ecb_byteorder_helper (void) ecb_const;
867ecb_function_ unsigned char 888ecb_inline unsigned char
868ecb_byteorder_helper (void) 889ecb_byteorder_helper (void)
869{ 890{
870 const uint32_t u = 0x11223344; 891 const uint32_t u = 0x11223344;
871 return *(unsigned char *)&u; 892 return *(unsigned char *)&u;
872} 893}
873 894
874ecb_function_ ecb_bool ecb_big_endian (void) ecb_const; 895ecb_inline ecb_bool ecb_big_endian (void) ecb_const;
875ecb_function_ ecb_bool ecb_big_endian (void) { return ecb_byteorder_helper () == 0x11; } 896ecb_inline ecb_bool ecb_big_endian (void) { return ecb_byteorder_helper () == 0x11; }
876ecb_function_ ecb_bool ecb_little_endian (void) ecb_const; 897ecb_inline ecb_bool ecb_little_endian (void) ecb_const;
877ecb_function_ ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44; } 898ecb_inline ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44; }
878 899
879#if ECB_GCC_VERSION(3,0) || ECB_C99 900#if ECB_GCC_VERSION(3,0) || ECB_C99
880 #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) 901 #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0))
881#else 902#else
882 #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) 903 #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n)))
1311#if EV_USE_NANOSLEEP 1332#if EV_USE_NANOSLEEP
1312 struct timespec ts; 1333 struct timespec ts;
1313 1334
1314 EV_TS_SET (ts, delay); 1335 EV_TS_SET (ts, delay);
1315 nanosleep (&ts, 0); 1336 nanosleep (&ts, 0);
1316#elif defined(_WIN32) 1337#elif defined _WIN32
1317 Sleep ((unsigned long)(delay * 1e3)); 1338 Sleep ((unsigned long)(delay * 1e3));
1318#else 1339#else
1319 struct timeval tv; 1340 struct timeval tv;
1320 1341
1321 /* 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 */
1854 /* win32 people keep sending patches that change this write() to send() */ 1875 /* win32 people keep sending patches that change this write() to send() */
1855 /* 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 */
1856 /* 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 */
1857 /* 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 */
1858 /* 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 */
1859 write (evpipe [1], &(evpipe [1]), 1); 1882 write (evpipe [1], &(evpipe [1]), 1);
1860 } 1883 }
1861 1884
1862 errno = old_errno; 1885 errno = old_errno;
1863 } 1886 }
3718} 3741}
3719 3742
3720inline_size int 3743inline_size int
3721infy_newfd (void) 3744infy_newfd (void)
3722{ 3745{
3723#if defined (IN_CLOEXEC) && defined (IN_NONBLOCK) 3746#if defined IN_CLOEXEC && defined IN_NONBLOCK
3724 int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK); 3747 int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK);
3725 if (fd >= 0) 3748 if (fd >= 0)
3726 return fd; 3749 return fd;
3727#endif 3750#endif
3728 return inotify_init (); 3751 return inotify_init ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines