… | |
… | |
325 | #ifndef EV_USE_PORT |
325 | #ifndef EV_USE_PORT |
326 | # define EV_USE_PORT 0 |
326 | # define EV_USE_PORT 0 |
327 | #endif |
327 | #endif |
328 | |
328 | |
329 | #ifndef EV_USE_LINUXAIO |
329 | #ifndef EV_USE_LINUXAIO |
|
|
330 | # if __linux /* libev currently assumes linux/aio_abi.h is always available on linux */ |
|
|
331 | # define EV_USE_LINUXAIO 1 |
|
|
332 | # else |
330 | # define EV_USE_LINUXAIO 0 |
333 | # define EV_USE_LINUXAIO 0 |
|
|
334 | # endif |
331 | #endif |
335 | #endif |
332 | |
336 | |
333 | #ifndef EV_USE_INOTIFY |
337 | #ifndef EV_USE_INOTIFY |
334 | # if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4)) |
338 | # if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4)) |
335 | # define EV_USE_INOTIFY EV_FEATURE_OS |
339 | # define EV_USE_INOTIFY EV_FEATURE_OS |
… | |
… | |
392 | /* aix's poll.h seems to cause lots of trouble */ |
396 | /* aix's poll.h seems to cause lots of trouble */ |
393 | #ifdef _AIX |
397 | #ifdef _AIX |
394 | /* AIX has a completely broken poll.h header */ |
398 | /* AIX has a completely broken poll.h header */ |
395 | # undef EV_USE_POLL |
399 | # undef EV_USE_POLL |
396 | # define EV_USE_POLL 0 |
400 | # define EV_USE_POLL 0 |
397 | #endif |
|
|
398 | |
|
|
399 | #if EV_USE_LINUXAIO |
|
|
400 | # include <linux/aio_abi.h> /* probably only needed for aio_context_t */ |
|
|
401 | #endif |
401 | #endif |
402 | |
402 | |
403 | /* on linux, we can use a (slow) syscall to avoid a dependency on pthread, */ |
403 | /* on linux, we can use a (slow) syscall to avoid a dependency on pthread, */ |
404 | /* which makes programs even slower. might work on other unices, too. */ |
404 | /* which makes programs even slower. might work on other unices, too. */ |
405 | #if EV_USE_CLOCK_SYSCALL |
405 | #if EV_USE_CLOCK_SYSCALL |
… | |
… | |
438 | # endif |
438 | # endif |
439 | #endif |
439 | #endif |
440 | |
440 | |
441 | #if EV_USE_LINUXAIO |
441 | #if EV_USE_LINUXAIO |
442 | # include <sys/syscall.h> |
442 | # include <sys/syscall.h> |
443 | # if !SYS_io_getevents |
443 | # if !SYS_io_getevents || !EV_USE_EPOLL /* ev_linxaio uses ev_poll.c:ev_epoll_create */ |
444 | # undef EV_USE_LINUXAIO |
444 | # undef EV_USE_LINUXAIO |
445 | # define EV_USE_LINUXAIO 0 |
445 | # define EV_USE_LINUXAIO 0 |
446 | # endif |
446 | # endif |
447 | #endif |
447 | #endif |
448 | |
448 | |
… | |
… | |
559 | |
559 | |
560 | #ifndef ECB_H |
560 | #ifndef ECB_H |
561 | #define ECB_H |
561 | #define ECB_H |
562 | |
562 | |
563 | /* 16 bits major, 16 bits minor */ |
563 | /* 16 bits major, 16 bits minor */ |
564 | #define ECB_VERSION 0x00010005 |
564 | #define ECB_VERSION 0x00010006 |
565 | |
565 | |
566 | #ifdef _WIN32 |
566 | #ifdef _WIN32 |
567 | typedef signed char int8_t; |
567 | typedef signed char int8_t; |
568 | typedef unsigned char uint8_t; |
568 | typedef unsigned char uint8_t; |
569 | typedef signed short int16_t; |
569 | typedef signed short int16_t; |
… | |
… | |
683 | #include <intrin.h> /* fence functions _ReadBarrier, also bit search functions _BitScanReverse */ |
683 | #include <intrin.h> /* fence functions _ReadBarrier, also bit search functions _BitScanReverse */ |
684 | #endif |
684 | #endif |
685 | |
685 | |
686 | #ifndef ECB_MEMORY_FENCE |
686 | #ifndef ECB_MEMORY_FENCE |
687 | #if ECB_GCC_VERSION(2,5) || defined __INTEL_COMPILER || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 |
687 | #if ECB_GCC_VERSION(2,5) || defined __INTEL_COMPILER || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 |
|
|
688 | #define ECB_MEMORY_FENCE_RELAXED __asm__ __volatile__ ("" : : : "memory") |
688 | #if __i386 || __i386__ |
689 | #if __i386 || __i386__ |
689 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") |
690 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") |
690 | #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") |
691 | #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") |
691 | #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("" : : : "memory") |
692 | #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("" : : : "memory") |
692 | #elif ECB_GCC_AMD64 |
693 | #elif ECB_GCC_AMD64 |
… | |
… | |
742 | #if ECB_GCC_VERSION(4,7) |
743 | #if ECB_GCC_VERSION(4,7) |
743 | /* see comment below (stdatomic.h) about the C11 memory model. */ |
744 | /* see comment below (stdatomic.h) about the C11 memory model. */ |
744 | #define ECB_MEMORY_FENCE __atomic_thread_fence (__ATOMIC_SEQ_CST) |
745 | #define ECB_MEMORY_FENCE __atomic_thread_fence (__ATOMIC_SEQ_CST) |
745 | #define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE) |
746 | #define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE) |
746 | #define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE) |
747 | #define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE) |
|
|
748 | #define ECB_MEMORY_FENCE_RELAXED __atomic_thread_fence (__ATOMIC_RELAXED) |
747 | |
749 | |
748 | #elif ECB_CLANG_EXTENSION(c_atomic) |
750 | #elif ECB_CLANG_EXTENSION(c_atomic) |
749 | /* see comment below (stdatomic.h) about the C11 memory model. */ |
751 | /* see comment below (stdatomic.h) about the C11 memory model. */ |
750 | #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) |
752 | #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) |
751 | #define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE) |
753 | #define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE) |
752 | #define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE) |
754 | #define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE) |
|
|
755 | #define ECB_MEMORY_FENCE_RELAXED __c11_atomic_thread_fence (__ATOMIC_RELAXED) |
753 | |
756 | |
754 | #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ |
757 | #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ |
755 | #define ECB_MEMORY_FENCE __sync_synchronize () |
758 | #define ECB_MEMORY_FENCE __sync_synchronize () |
756 | #elif _MSC_VER >= 1500 /* VC++ 2008 */ |
759 | #elif _MSC_VER >= 1500 /* VC++ 2008 */ |
757 | /* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */ |
760 | /* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */ |
… | |
… | |
767 | #elif defined _WIN32 |
770 | #elif defined _WIN32 |
768 | #include <WinNT.h> |
771 | #include <WinNT.h> |
769 | #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ |
772 | #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ |
770 | #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 |
773 | #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 |
771 | #include <mbarrier.h> |
774 | #include <mbarrier.h> |
772 | #define ECB_MEMORY_FENCE __machine_rw_barrier () |
775 | #define ECB_MEMORY_FENCE __machine_rw_barrier () |
773 | #define ECB_MEMORY_FENCE_ACQUIRE __machine_r_barrier () |
776 | #define ECB_MEMORY_FENCE_ACQUIRE __machine_acq_barrier () |
774 | #define ECB_MEMORY_FENCE_RELEASE __machine_w_barrier () |
777 | #define ECB_MEMORY_FENCE_RELEASE __machine_rel_barrier () |
|
|
778 | #define ECB_MEMORY_FENCE_RELAXED __compiler_barrier () |
775 | #elif __xlC__ |
779 | #elif __xlC__ |
776 | #define ECB_MEMORY_FENCE __sync () |
780 | #define ECB_MEMORY_FENCE __sync () |
777 | #endif |
781 | #endif |
778 | #endif |
782 | #endif |
779 | |
783 | |
780 | #ifndef ECB_MEMORY_FENCE |
784 | #ifndef ECB_MEMORY_FENCE |
781 | #if ECB_C11 && !defined __STDC_NO_ATOMICS__ |
785 | #if ECB_C11 && !defined __STDC_NO_ATOMICS__ |
782 | /* we assume that these memory fences work on all variables/all memory accesses, */ |
786 | /* we assume that these memory fences work on all variables/all memory accesses, */ |
783 | /* not just C11 atomics and atomic accesses */ |
787 | /* not just C11 atomics and atomic accesses */ |
784 | #include <stdatomic.h> |
788 | #include <stdatomic.h> |
785 | /* Unfortunately, neither gcc 4.7 nor clang 3.1 generate any instructions for */ |
|
|
786 | /* any fence other than seq_cst, which isn't very efficient for us. */ |
|
|
787 | /* Why that is, we don't know - either the C11 memory model is quite useless */ |
|
|
788 | /* for most usages, or gcc and clang have a bug */ |
|
|
789 | /* I *currently* lean towards the latter, and inefficiently implement */ |
|
|
790 | /* all three of ecb's fences as a seq_cst fence */ |
|
|
791 | /* Update, gcc-4.8 generates mfence for all c++ fences, but nothing */ |
|
|
792 | /* for all __atomic_thread_fence's except seq_cst */ |
|
|
793 | #define ECB_MEMORY_FENCE atomic_thread_fence (memory_order_seq_cst) |
789 | #define ECB_MEMORY_FENCE atomic_thread_fence (memory_order_seq_cst) |
|
|
790 | #define ECB_MEMORY_FENCE_ACQUIRE atomic_thread_fence (memory_order_acquire) |
|
|
791 | #define ECB_MEMORY_FENCE_RELEASE atomic_thread_fence (memory_order_release) |
794 | #endif |
792 | #endif |
795 | #endif |
793 | #endif |
796 | |
794 | |
797 | #ifndef ECB_MEMORY_FENCE |
795 | #ifndef ECB_MEMORY_FENCE |
798 | #if !ECB_AVOID_PTHREADS |
796 | #if !ECB_AVOID_PTHREADS |
… | |
… | |
816 | #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE |
814 | #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE |
817 | #endif |
815 | #endif |
818 | |
816 | |
819 | #if !defined ECB_MEMORY_FENCE_RELEASE && defined ECB_MEMORY_FENCE |
817 | #if !defined ECB_MEMORY_FENCE_RELEASE && defined ECB_MEMORY_FENCE |
820 | #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE |
818 | #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE |
|
|
819 | #endif |
|
|
820 | |
|
|
821 | #if !defined ECB_MEMORY_FENCE_RELAXED && defined ECB_MEMORY_FENCE |
|
|
822 | #define ECB_MEMORY_FENCE_RELAXED ECB_MEMORY_FENCE /* very heavy-handed */ |
821 | #endif |
823 | #endif |
822 | |
824 | |
823 | /*****************************************************************************/ |
825 | /*****************************************************************************/ |
824 | |
826 | |
825 | #if ECB_CPP |
827 | #if ECB_CPP |
… | |
… | |
1603 | # include "ev_win32.c" |
1605 | # include "ev_win32.c" |
1604 | #endif |
1606 | #endif |
1605 | |
1607 | |
1606 | /*****************************************************************************/ |
1608 | /*****************************************************************************/ |
1607 | |
1609 | |
|
|
1610 | #if EV_USE_LINUXAIO |
|
|
1611 | # include <linux/aio_abi.h> /* probably only needed for aio_context_t */ |
|
|
1612 | #endif |
|
|
1613 | |
1608 | /* define a suitable floor function (only used by periodics atm) */ |
1614 | /* define a suitable floor function (only used by periodics atm) */ |
1609 | |
1615 | |
1610 | #if EV_USE_FLOOR |
1616 | #if EV_USE_FLOOR |
1611 | # include <math.h> |
1617 | # include <math.h> |
1612 | # define ev_floor(v) floor (v) |
1618 | # define ev_floor(v) floor (v) |
… | |
… | |
1985 | { |
1991 | { |
1986 | *cur = array_nextsize (elem, *cur, cnt); |
1992 | *cur = array_nextsize (elem, *cur, cnt); |
1987 | return ev_realloc (base, elem * *cur); |
1993 | return ev_realloc (base, elem * *cur); |
1988 | } |
1994 | } |
1989 | |
1995 | |
1990 | #define array_needsize_noinit(base,count) |
1996 | #define array_needsize_noinit(base,offset,count) |
1991 | |
1997 | |
1992 | #define array_needsize_zerofill(base,count) \ |
1998 | #define array_needsize_zerofill(base,offset,count) \ |
1993 | memset ((void *)(base), 0, sizeof (*(base)) * (count)) |
1999 | memset ((void *)(base + offset), 0, sizeof (*(base)) * (count)) |
1994 | |
2000 | |
1995 | #define array_needsize(type,base,cur,cnt,init) \ |
2001 | #define array_needsize(type,base,cur,cnt,init) \ |
1996 | if (expect_false ((cnt) > (cur))) \ |
2002 | if (expect_false ((cnt) > (cur))) \ |
1997 | { \ |
2003 | { \ |
1998 | ecb_unused int ocur_ = (cur); \ |
2004 | ecb_unused int ocur_ = (cur); \ |
1999 | (base) = (type *)array_realloc \ |
2005 | (base) = (type *)array_realloc \ |
2000 | (sizeof (type), (base), &(cur), (cnt)); \ |
2006 | (sizeof (type), (base), &(cur), (cnt)); \ |
2001 | init ((base) + (ocur_), (cur) - ocur_); \ |
2007 | init ((base), ocur_, ((cur) - ocur_)); \ |
2002 | } |
2008 | } |
2003 | |
2009 | |
2004 | #if 0 |
2010 | #if 0 |
2005 | #define array_slim(type,stem) \ |
2011 | #define array_slim(type,stem) \ |
2006 | if (stem ## max < array_roundsize (stem ## cnt >> 2)) \ |
2012 | if (stem ## max < array_roundsize (stem ## cnt >> 2)) \ |
… | |
… | |
2141 | ev_io *w; |
2147 | ev_io *w; |
2142 | |
2148 | |
2143 | unsigned char o_events = anfd->events; |
2149 | unsigned char o_events = anfd->events; |
2144 | unsigned char o_reify = anfd->reify; |
2150 | unsigned char o_reify = anfd->reify; |
2145 | |
2151 | |
2146 | anfd->reify = 0; |
2152 | anfd->reify = 0; |
2147 | |
2153 | |
2148 | /*if (expect_true (o_reify & EV_ANFD_REIFY)) probably a deoptimisation */ |
2154 | /*if (expect_true (o_reify & EV_ANFD_REIFY)) probably a deoptimisation */ |
2149 | { |
2155 | { |
2150 | anfd->events = 0; |
2156 | anfd->events = 0; |
2151 | |
2157 | |
… | |
… | |
2729 | # include "ev_port.c" |
2735 | # include "ev_port.c" |
2730 | #endif |
2736 | #endif |
2731 | #if EV_USE_KQUEUE |
2737 | #if EV_USE_KQUEUE |
2732 | # include "ev_kqueue.c" |
2738 | # include "ev_kqueue.c" |
2733 | #endif |
2739 | #endif |
|
|
2740 | #if EV_USE_EPOLL |
|
|
2741 | # include "ev_epoll.c" |
|
|
2742 | #endif |
2734 | #if EV_USE_LINUXAIO |
2743 | #if EV_USE_LINUXAIO |
2735 | # include "ev_linuxaio.c" |
2744 | # include "ev_linuxaio.c" |
2736 | #endif |
|
|
2737 | #if EV_USE_EPOLL |
|
|
2738 | # include "ev_epoll.c" |
|
|
2739 | #endif |
2745 | #endif |
2740 | #if EV_USE_POLL |
2746 | #if EV_USE_POLL |
2741 | # include "ev_poll.c" |
2747 | # include "ev_poll.c" |
2742 | #endif |
2748 | #endif |
2743 | #if EV_USE_SELECT |
2749 | #if EV_USE_SELECT |
… | |
… | |
2803 | #ifdef __FreeBSD__ |
2809 | #ifdef __FreeBSD__ |
2804 | flags &= ~EVBACKEND_POLL; /* poll return value is unusable (http://forums.freebsd.org/archive/index.php/t-10270.html) */ |
2810 | flags &= ~EVBACKEND_POLL; /* poll return value is unusable (http://forums.freebsd.org/archive/index.php/t-10270.html) */ |
2805 | #endif |
2811 | #endif |
2806 | |
2812 | |
2807 | /* TODO: linuxaio is very experimental */ |
2813 | /* TODO: linuxaio is very experimental */ |
|
|
2814 | #if !EV_RECOMMEND_LINUXAIO |
2808 | flags &= ~EVBACKEND_LINUXAIO; |
2815 | flags &= ~EVBACKEND_LINUXAIO; |
|
|
2816 | #endif |
2809 | |
2817 | |
2810 | return flags; |
2818 | return flags; |
2811 | } |
2819 | } |
2812 | |
2820 | |
2813 | ecb_cold |
2821 | ecb_cold |
… | |
… | |
3741 | { |
3749 | { |
3742 | assert (("libev: pipe_w not active, but pipe not written", ev_is_active (&pipe_w))); |
3750 | assert (("libev: pipe_w not active, but pipe not written", ev_is_active (&pipe_w))); |
3743 | ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM); |
3751 | ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM); |
3744 | } |
3752 | } |
3745 | |
3753 | |
3746 | |
|
|
3747 | /* update ev_rt_now, do magic */ |
3754 | /* update ev_rt_now, do magic */ |
3748 | time_update (EV_A_ waittime + sleeptime); |
3755 | time_update (EV_A_ waittime + sleeptime); |
3749 | } |
3756 | } |
3750 | |
3757 | |
3751 | /* queue pending timers and reschedule them */ |
3758 | /* queue pending timers and reschedule them */ |
… | |
… | |
3915 | return; |
3922 | return; |
3916 | |
3923 | |
3917 | assert (("libev: ev_io_start called with negative fd", fd >= 0)); |
3924 | assert (("libev: ev_io_start called with negative fd", fd >= 0)); |
3918 | assert (("libev: ev_io_start called with illegal event mask", !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE)))); |
3925 | assert (("libev: ev_io_start called with illegal event mask", !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE)))); |
3919 | |
3926 | |
|
|
3927 | #if EV_VERIFY >= 2 |
|
|
3928 | assert (("libev: ev_io_start called on watcher with invalid fd", fd_valid (fd))); |
|
|
3929 | #endif |
3920 | EV_FREQUENT_CHECK; |
3930 | EV_FREQUENT_CHECK; |
3921 | |
3931 | |
3922 | ev_start (EV_A_ (W)w, 1); |
3932 | ev_start (EV_A_ (W)w, 1); |
3923 | array_needsize (ANFD, anfds, anfdmax, fd + 1, array_needsize_zerofill); |
3933 | array_needsize (ANFD, anfds, anfdmax, fd + 1, array_needsize_zerofill); |
3924 | wlist_add (&anfds[fd].head, (WL)w); |
3934 | wlist_add (&anfds[fd].head, (WL)w); |
… | |
… | |
3940 | if (expect_false (!ev_is_active (w))) |
3950 | if (expect_false (!ev_is_active (w))) |
3941 | return; |
3951 | return; |
3942 | |
3952 | |
3943 | assert (("libev: ev_io_stop called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); |
3953 | assert (("libev: ev_io_stop called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); |
3944 | |
3954 | |
|
|
3955 | #if EV_VERIFY >= 2 |
|
|
3956 | assert (("libev: ev_io_stop called on watcher with invalid fd", fd_valid (w->fd))); |
|
|
3957 | #endif |
3945 | EV_FREQUENT_CHECK; |
3958 | EV_FREQUENT_CHECK; |
3946 | |
3959 | |
3947 | wlist_del (&anfds[w->fd].head, (WL)w); |
3960 | wlist_del (&anfds[w->fd].head, (WL)w); |
3948 | ev_stop (EV_A_ (W)w); |
3961 | ev_stop (EV_A_ (W)w); |
3949 | |
3962 | |