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

Comparing libev/ev.c (file contents):
Revision 1.480 by root, Thu Feb 18 04:48:05 2016 UTC vs.
Revision 1.486 by root, Thu Oct 25 03:11:04 2018 UTC

162# define EV_USE_EVENTFD 0 162# define EV_USE_EVENTFD 0
163# endif 163# endif
164 164
165#endif 165#endif
166 166
167/* OS X, in its infinite idiocy, actually HARDCODES
168 * a limit of 1024 into their select. Where people have brains,
169 * OS X engineers apparently have a vacuum. Or maybe they were
170 * ordered to have a vacuum, or they do anything for money.
171 * This might help. Or not.
172 * Note that this must be defined early, as other include files
173 * will rely on this define as well.
174 */
175#define _DARWIN_UNLIMITED_SELECT 1
176
167#include <stdlib.h> 177#include <stdlib.h>
168#include <string.h> 178#include <string.h>
169#include <fcntl.h> 179#include <fcntl.h>
170#include <stddef.h> 180#include <stddef.h>
171 181
208# ifndef EV_SELECT_IS_WINSOCKET 218# ifndef EV_SELECT_IS_WINSOCKET
209# define EV_SELECT_IS_WINSOCKET 1 219# define EV_SELECT_IS_WINSOCKET 1
210# endif 220# endif
211# undef EV_AVOID_STDIO 221# undef EV_AVOID_STDIO
212#endif 222#endif
213
214/* OS X, in its infinite idiocy, actually HARDCODES
215 * a limit of 1024 into their select. Where people have brains,
216 * OS X engineers apparently have a vacuum. Or maybe they were
217 * ordered to have a vacuum, or they do anything for money.
218 * This might help. Or not.
219 */
220#define _DARWIN_UNLIMITED_SELECT 1
221 223
222/* this block tries to deduce configuration from header-defined symbols and defaults */ 224/* this block tries to deduce configuration from header-defined symbols and defaults */
223 225
224/* try to deduce the maximum number of signals on this platform */ 226/* try to deduce the maximum number of signals on this platform */
225#if defined EV_NSIG 227#if defined EV_NSIG
363 365
364#ifndef EV_HEAP_CACHE_AT 366#ifndef EV_HEAP_CACHE_AT
365# define EV_HEAP_CACHE_AT EV_FEATURE_DATA 367# define EV_HEAP_CACHE_AT EV_FEATURE_DATA
366#endif 368#endif
367 369
368#ifdef ANDROID 370#ifdef __ANDROID__
369/* supposedly, android doesn't typedef fd_mask */ 371/* supposedly, android doesn't typedef fd_mask */
370# undef EV_USE_SELECT 372# undef EV_USE_SELECT
371# define EV_USE_SELECT 0 373# define EV_USE_SELECT 0
372/* supposedly, we need to include syscall.h, not sys/syscall.h, so just disable */ 374/* supposedly, we need to include syscall.h, not sys/syscall.h, so just disable */
373# undef EV_USE_CLOCK_SYSCALL 375# undef EV_USE_CLOCK_SYSCALL
1675{ 1677{
1676 write (STDERR_FILENO, msg, strlen (msg)); 1678 write (STDERR_FILENO, msg, strlen (msg));
1677} 1679}
1678#endif 1680#endif
1679 1681
1680static void (*syserr_cb)(const char *msg) EV_THROW; 1682static void (*syserr_cb)(const char *msg) EV_NOEXCEPT;
1681 1683
1682ecb_cold 1684ecb_cold
1683void 1685void
1684ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW 1686ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT
1685{ 1687{
1686 syserr_cb = cb; 1688 syserr_cb = cb;
1687} 1689}
1688 1690
1689noinline ecb_cold 1691noinline ecb_cold
1708 abort (); 1710 abort ();
1709 } 1711 }
1710} 1712}
1711 1713
1712static void * 1714static void *
1713ev_realloc_emul (void *ptr, long size) EV_THROW 1715ev_realloc_emul (void *ptr, long size) EV_NOEXCEPT
1714{ 1716{
1715 /* some systems, notably openbsd and darwin, fail to properly 1717 /* some systems, notably openbsd and darwin, fail to properly
1716 * implement realloc (x, 0) (as required by both ansi c-89 and 1718 * implement realloc (x, 0) (as required by both ansi c-89 and
1717 * the single unix specification, so work around them here. 1719 * the single unix specification, so work around them here.
1718 * recently, also (at least) fedora and debian started breaking it, 1720 * recently, also (at least) fedora and debian started breaking it,
1724 1726
1725 free (ptr); 1727 free (ptr);
1726 return 0; 1728 return 0;
1727} 1729}
1728 1730
1729static void *(*alloc)(void *ptr, long size) EV_THROW = ev_realloc_emul; 1731static void *(*alloc)(void *ptr, long size) EV_NOEXCEPT = ev_realloc_emul;
1730 1732
1731ecb_cold 1733ecb_cold
1732void 1734void
1733ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW 1735ev_set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT
1734{ 1736{
1735 alloc = cb; 1737 alloc = cb;
1736} 1738}
1737 1739
1738inline_speed void * 1740inline_speed void *
1855 1857
1856/*****************************************************************************/ 1858/*****************************************************************************/
1857 1859
1858#ifndef EV_HAVE_EV_TIME 1860#ifndef EV_HAVE_EV_TIME
1859ev_tstamp 1861ev_tstamp
1860ev_time (void) EV_THROW 1862ev_time (void) EV_NOEXCEPT
1861{ 1863{
1862#if EV_USE_REALTIME 1864#if EV_USE_REALTIME
1863 if (expect_true (have_realtime)) 1865 if (expect_true (have_realtime))
1864 { 1866 {
1865 struct timespec ts; 1867 struct timespec ts;
1889 return ev_time (); 1891 return ev_time ();
1890} 1892}
1891 1893
1892#if EV_MULTIPLICITY 1894#if EV_MULTIPLICITY
1893ev_tstamp 1895ev_tstamp
1894ev_now (EV_P) EV_THROW 1896ev_now (EV_P) EV_NOEXCEPT
1895{ 1897{
1896 return ev_rt_now; 1898 return ev_rt_now;
1897} 1899}
1898#endif 1900#endif
1899 1901
1900void 1902void
1901ev_sleep (ev_tstamp delay) EV_THROW 1903ev_sleep (ev_tstamp delay) EV_NOEXCEPT
1902{ 1904{
1903 if (delay > 0.) 1905 if (delay > 0.)
1904 { 1906 {
1905#if EV_USE_NANOSLEEP 1907#if EV_USE_NANOSLEEP
1906 struct timespec ts; 1908 struct timespec ts;
1907 1909
1908 EV_TS_SET (ts, delay); 1910 EV_TS_SET (ts, delay);
1909 nanosleep (&ts, 0); 1911 nanosleep (&ts, 0);
1910#elif defined _WIN32 1912#elif defined _WIN32
1913 /* maybe this should round up, as ms is very low resolution */
1914 /* compared to select (µs) or nanosleep (ns) */
1911 Sleep ((unsigned long)(delay * 1e3)); 1915 Sleep ((unsigned long)(delay * 1e3));
1912#else 1916#else
1913 struct timeval tv; 1917 struct timeval tv;
1914 1918
1915 /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */ 1919 /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */
1990{ 1994{
1991} 1995}
1992 1996
1993noinline 1997noinline
1994void 1998void
1995ev_feed_event (EV_P_ void *w, int revents) EV_THROW 1999ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT
1996{ 2000{
1997 W w_ = (W)w; 2001 W w_ = (W)w;
1998 int pri = ABSPRI (w_); 2002 int pri = ABSPRI (w_);
1999 2003
2000 if (expect_false (w_->pending)) 2004 if (expect_false (w_->pending))
2061 if (expect_true (!anfd->reify)) 2065 if (expect_true (!anfd->reify))
2062 fd_event_nocheck (EV_A_ fd, revents); 2066 fd_event_nocheck (EV_A_ fd, revents);
2063} 2067}
2064 2068
2065void 2069void
2066ev_feed_fd_event (EV_P_ int fd, int revents) EV_THROW 2070ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT
2067{ 2071{
2068 if (fd >= 0 && fd < anfdmax) 2072 if (fd >= 0 && fd < anfdmax)
2069 fd_event_nocheck (EV_A_ fd, revents); 2073 fd_event_nocheck (EV_A_ fd, revents);
2070} 2074}
2071 2075
2471#endif 2475#endif
2472 { 2476 {
2473#ifdef _WIN32 2477#ifdef _WIN32
2474 WSABUF buf; 2478 WSABUF buf;
2475 DWORD sent; 2479 DWORD sent;
2476 buf.buf = &buf; 2480 buf.buf = (char *)&buf;
2477 buf.len = 1; 2481 buf.len = 1;
2478 WSASend (EV_FD_TO_WIN32_HANDLE (evpipe [1]), &buf, 1, &sent, 0, 0, 0); 2482 WSASend (EV_FD_TO_WIN32_HANDLE (evpipe [1]), &buf, 1, &sent, 0, 0, 0);
2479#else 2483#else
2480 write (evpipe [1], &(evpipe [1]), 1); 2484 write (evpipe [1], &(evpipe [1]), 1);
2481#endif 2485#endif
2553} 2557}
2554 2558
2555/*****************************************************************************/ 2559/*****************************************************************************/
2556 2560
2557void 2561void
2558ev_feed_signal (int signum) EV_THROW 2562ev_feed_signal (int signum) EV_NOEXCEPT
2559{ 2563{
2560#if EV_MULTIPLICITY 2564#if EV_MULTIPLICITY
2561 EV_P; 2565 EV_P;
2562 ECB_MEMORY_FENCE_ACQUIRE; 2566 ECB_MEMORY_FENCE_ACQUIRE;
2563 EV_A = signals [signum - 1].loop; 2567 EV_A = signals [signum - 1].loop;
2580 ev_feed_signal (signum); 2584 ev_feed_signal (signum);
2581} 2585}
2582 2586
2583noinline 2587noinline
2584void 2588void
2585ev_feed_signal_event (EV_P_ int signum) EV_THROW 2589ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT
2586{ 2590{
2587 WL w; 2591 WL w;
2588 2592
2589 if (expect_false (signum <= 0 || signum >= EV_NSIG)) 2593 if (expect_false (signum <= 0 || signum >= EV_NSIG))
2590 return; 2594 return;
2707#if EV_USE_SELECT 2711#if EV_USE_SELECT
2708# include "ev_select.c" 2712# include "ev_select.c"
2709#endif 2713#endif
2710 2714
2711ecb_cold int 2715ecb_cold int
2712ev_version_major (void) EV_THROW 2716ev_version_major (void) EV_NOEXCEPT
2713{ 2717{
2714 return EV_VERSION_MAJOR; 2718 return EV_VERSION_MAJOR;
2715} 2719}
2716 2720
2717ecb_cold int 2721ecb_cold int
2718ev_version_minor (void) EV_THROW 2722ev_version_minor (void) EV_NOEXCEPT
2719{ 2723{
2720 return EV_VERSION_MINOR; 2724 return EV_VERSION_MINOR;
2721} 2725}
2722 2726
2723/* return true if we are running with elevated privileges and should ignore env variables */ 2727/* return true if we are running with elevated privileges and should ignore env variables */
2732#endif 2736#endif
2733} 2737}
2734 2738
2735ecb_cold 2739ecb_cold
2736unsigned int 2740unsigned int
2737ev_supported_backends (void) EV_THROW 2741ev_supported_backends (void) EV_NOEXCEPT
2738{ 2742{
2739 unsigned int flags = 0; 2743 unsigned int flags = 0;
2740 2744
2741 if (EV_USE_PORT ) flags |= EVBACKEND_PORT; 2745 if (EV_USE_PORT ) flags |= EVBACKEND_PORT;
2742 if (EV_USE_KQUEUE) flags |= EVBACKEND_KQUEUE; 2746 if (EV_USE_KQUEUE) flags |= EVBACKEND_KQUEUE;
2747 return flags; 2751 return flags;
2748} 2752}
2749 2753
2750ecb_cold 2754ecb_cold
2751unsigned int 2755unsigned int
2752ev_recommended_backends (void) EV_THROW 2756ev_recommended_backends (void) EV_NOEXCEPT
2753{ 2757{
2754 unsigned int flags = ev_supported_backends (); 2758 unsigned int flags = ev_supported_backends ();
2755 2759
2756#ifndef __NetBSD__ 2760#ifndef __NetBSD__
2757 /* kqueue is borked on everything but netbsd apparently */ 2761 /* kqueue is borked on everything but netbsd apparently */
2770 return flags; 2774 return flags;
2771} 2775}
2772 2776
2773ecb_cold 2777ecb_cold
2774unsigned int 2778unsigned int
2775ev_embeddable_backends (void) EV_THROW 2779ev_embeddable_backends (void) EV_NOEXCEPT
2776{ 2780{
2777 int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT; 2781 int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT;
2778 2782
2779 /* epoll embeddability broken on all linux versions up to at least 2.6.23 */ 2783 /* epoll embeddability broken on all linux versions up to at least 2.6.23 */
2780 if (ev_linux_version () < 0x020620) /* disable it on linux < 2.6.32 */ 2784 if (ev_linux_version () < 0x020620) /* disable it on linux < 2.6.32 */
2782 2786
2783 return flags; 2787 return flags;
2784} 2788}
2785 2789
2786unsigned int 2790unsigned int
2787ev_backend (EV_P) EV_THROW 2791ev_backend (EV_P) EV_NOEXCEPT
2788{ 2792{
2789 return backend; 2793 return backend;
2790} 2794}
2791 2795
2792#if EV_FEATURE_API 2796#if EV_FEATURE_API
2793unsigned int 2797unsigned int
2794ev_iteration (EV_P) EV_THROW 2798ev_iteration (EV_P) EV_NOEXCEPT
2795{ 2799{
2796 return loop_count; 2800 return loop_count;
2797} 2801}
2798 2802
2799unsigned int 2803unsigned int
2800ev_depth (EV_P) EV_THROW 2804ev_depth (EV_P) EV_NOEXCEPT
2801{ 2805{
2802 return loop_depth; 2806 return loop_depth;
2803} 2807}
2804 2808
2805void 2809void
2806ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_THROW 2810ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT
2807{ 2811{
2808 io_blocktime = interval; 2812 io_blocktime = interval;
2809} 2813}
2810 2814
2811void 2815void
2812ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_THROW 2816ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT
2813{ 2817{
2814 timeout_blocktime = interval; 2818 timeout_blocktime = interval;
2815} 2819}
2816 2820
2817void 2821void
2818ev_set_userdata (EV_P_ void *data) EV_THROW 2822ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT
2819{ 2823{
2820 userdata = data; 2824 userdata = data;
2821} 2825}
2822 2826
2823void * 2827void *
2824ev_userdata (EV_P) EV_THROW 2828ev_userdata (EV_P) EV_NOEXCEPT
2825{ 2829{
2826 return userdata; 2830 return userdata;
2827} 2831}
2828 2832
2829void 2833void
2830ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW 2834ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT
2831{ 2835{
2832 invoke_cb = invoke_pending_cb; 2836 invoke_cb = invoke_pending_cb;
2833} 2837}
2834 2838
2835void 2839void
2836ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_THROW, void (*acquire)(EV_P) EV_THROW) EV_THROW 2840ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT
2837{ 2841{
2838 release_cb = release; 2842 release_cb = release;
2839 acquire_cb = acquire; 2843 acquire_cb = acquire;
2840} 2844}
2841#endif 2845#endif
2842 2846
2843/* initialise a loop structure, must be zero-initialised */ 2847/* initialise a loop structure, must be zero-initialised */
2844noinline ecb_cold 2848noinline ecb_cold
2845static void 2849static void
2846loop_init (EV_P_ unsigned int flags) EV_THROW 2850loop_init (EV_P_ unsigned int flags) EV_NOEXCEPT
2847{ 2851{
2848 if (!backend) 2852 if (!backend)
2849 { 2853 {
2850 origflags = flags; 2854 origflags = flags;
2851 2855
3092 3096
3093#if EV_MULTIPLICITY 3097#if EV_MULTIPLICITY
3094 3098
3095ecb_cold 3099ecb_cold
3096struct ev_loop * 3100struct ev_loop *
3097ev_loop_new (unsigned int flags) EV_THROW 3101ev_loop_new (unsigned int flags) EV_NOEXCEPT
3098{ 3102{
3099 EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop)); 3103 EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop));
3100 3104
3101 memset (EV_A, 0, sizeof (struct ev_loop)); 3105 memset (EV_A, 0, sizeof (struct ev_loop));
3102 loop_init (EV_A_ flags); 3106 loop_init (EV_A_ flags);
3149} 3153}
3150#endif 3154#endif
3151 3155
3152#if EV_FEATURE_API 3156#if EV_FEATURE_API
3153void ecb_cold 3157void ecb_cold
3154ev_verify (EV_P) EV_THROW 3158ev_verify (EV_P) EV_NOEXCEPT
3155{ 3159{
3156#if EV_VERIFY 3160#if EV_VERIFY
3157 int i; 3161 int i;
3158 WL w, w2; 3162 WL w, w2;
3159 3163
3240ecb_cold 3244ecb_cold
3241struct ev_loop * 3245struct ev_loop *
3242#else 3246#else
3243int 3247int
3244#endif 3248#endif
3245ev_default_loop (unsigned int flags) EV_THROW 3249ev_default_loop (unsigned int flags) EV_NOEXCEPT
3246{ 3250{
3247 if (!ev_default_loop_ptr) 3251 if (!ev_default_loop_ptr)
3248 { 3252 {
3249#if EV_MULTIPLICITY 3253#if EV_MULTIPLICITY
3250 EV_P = ev_default_loop_ptr = &default_loop_struct; 3254 EV_P = ev_default_loop_ptr = &default_loop_struct;
3269 3273
3270 return ev_default_loop_ptr; 3274 return ev_default_loop_ptr;
3271} 3275}
3272 3276
3273void 3277void
3274ev_loop_fork (EV_P) EV_THROW 3278ev_loop_fork (EV_P) EV_NOEXCEPT
3275{ 3279{
3276 postfork = 1; 3280 postfork = 1;
3277} 3281}
3278 3282
3279/*****************************************************************************/ 3283/*****************************************************************************/
3283{ 3287{
3284 EV_CB_INVOKE ((W)w, revents); 3288 EV_CB_INVOKE ((W)w, revents);
3285} 3289}
3286 3290
3287unsigned int 3291unsigned int
3288ev_pending_count (EV_P) EV_THROW 3292ev_pending_count (EV_P) EV_NOEXCEPT
3289{ 3293{
3290 int pri; 3294 int pri;
3291 unsigned int count = 0; 3295 unsigned int count = 0;
3292 3296
3293 for (pri = NUMPRI; pri--; ) 3297 for (pri = NUMPRI; pri--; )
3300void 3304void
3301ev_invoke_pending (EV_P) 3305ev_invoke_pending (EV_P)
3302{ 3306{
3303 pendingpri = NUMPRI; 3307 pendingpri = NUMPRI;
3304 3308
3305 while (pendingpri) /* pendingpri possibly gets modified in the inner loop */ 3309 do
3306 { 3310 {
3307 --pendingpri; 3311 --pendingpri;
3308 3312
3313 /* pendingpri possibly gets modified in the inner loop */
3309 while (pendingcnt [pendingpri]) 3314 while (pendingcnt [pendingpri])
3310 { 3315 {
3311 ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri]; 3316 ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri];
3312 3317
3313 p->w->pending = 0; 3318 p->w->pending = 0;
3314 EV_CB_INVOKE (p->w, p->events); 3319 EV_CB_INVOKE (p->w, p->events);
3315 EV_FREQUENT_CHECK; 3320 EV_FREQUENT_CHECK;
3316 } 3321 }
3317 } 3322 }
3323 while (pendingpri);
3318} 3324}
3319 3325
3320#if EV_IDLE_ENABLE 3326#if EV_IDLE_ENABLE
3321/* make idle watchers pending. this handles the "call-idle */ 3327/* make idle watchers pending. this handles the "call-idle */
3322/* only when higher priorities are idle" logic */ 3328/* only when higher priorities are idle" logic */
3731 3737
3732 return activecnt; 3738 return activecnt;
3733} 3739}
3734 3740
3735void 3741void
3736ev_break (EV_P_ int how) EV_THROW 3742ev_break (EV_P_ int how) EV_NOEXCEPT
3737{ 3743{
3738 loop_done = how; 3744 loop_done = how;
3739} 3745}
3740 3746
3741void 3747void
3742ev_ref (EV_P) EV_THROW 3748ev_ref (EV_P) EV_NOEXCEPT
3743{ 3749{
3744 ++activecnt; 3750 ++activecnt;
3745} 3751}
3746 3752
3747void 3753void
3748ev_unref (EV_P) EV_THROW 3754ev_unref (EV_P) EV_NOEXCEPT
3749{ 3755{
3750 --activecnt; 3756 --activecnt;
3751} 3757}
3752 3758
3753void 3759void
3754ev_now_update (EV_P) EV_THROW 3760ev_now_update (EV_P) EV_NOEXCEPT
3755{ 3761{
3756 time_update (EV_A_ 1e100); 3762 time_update (EV_A_ 1e100);
3757} 3763}
3758 3764
3759void 3765void
3760ev_suspend (EV_P) EV_THROW 3766ev_suspend (EV_P) EV_NOEXCEPT
3761{ 3767{
3762 ev_now_update (EV_A); 3768 ev_now_update (EV_A);
3763} 3769}
3764 3770
3765void 3771void
3766ev_resume (EV_P) EV_THROW 3772ev_resume (EV_P) EV_NOEXCEPT
3767{ 3773{
3768 ev_tstamp mn_prev = mn_now; 3774 ev_tstamp mn_prev = mn_now;
3769 3775
3770 ev_now_update (EV_A); 3776 ev_now_update (EV_A);
3771 timers_reschedule (EV_A_ mn_now - mn_prev); 3777 timers_reschedule (EV_A_ mn_now - mn_prev);
3810 w->pending = 0; 3816 w->pending = 0;
3811 } 3817 }
3812} 3818}
3813 3819
3814int 3820int
3815ev_clear_pending (EV_P_ void *w) EV_THROW 3821ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT
3816{ 3822{
3817 W w_ = (W)w; 3823 W w_ = (W)w;
3818 int pending = w_->pending; 3824 int pending = w_->pending;
3819 3825
3820 if (expect_true (pending)) 3826 if (expect_true (pending))
3854 3860
3855/*****************************************************************************/ 3861/*****************************************************************************/
3856 3862
3857noinline 3863noinline
3858void 3864void
3859ev_io_start (EV_P_ ev_io *w) EV_THROW 3865ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT
3860{ 3866{
3861 int fd = w->fd; 3867 int fd = w->fd;
3862 3868
3863 if (expect_false (ev_is_active (w))) 3869 if (expect_false (ev_is_active (w)))
3864 return; 3870 return;
3881 EV_FREQUENT_CHECK; 3887 EV_FREQUENT_CHECK;
3882} 3888}
3883 3889
3884noinline 3890noinline
3885void 3891void
3886ev_io_stop (EV_P_ ev_io *w) EV_THROW 3892ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT
3887{ 3893{
3888 clear_pending (EV_A_ (W)w); 3894 clear_pending (EV_A_ (W)w);
3889 if (expect_false (!ev_is_active (w))) 3895 if (expect_false (!ev_is_active (w)))
3890 return; 3896 return;
3891 3897
3901 EV_FREQUENT_CHECK; 3907 EV_FREQUENT_CHECK;
3902} 3908}
3903 3909
3904noinline 3910noinline
3905void 3911void
3906ev_timer_start (EV_P_ ev_timer *w) EV_THROW 3912ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT
3907{ 3913{
3908 if (expect_false (ev_is_active (w))) 3914 if (expect_false (ev_is_active (w)))
3909 return; 3915 return;
3910 3916
3911 ev_at (w) += mn_now; 3917 ev_at (w) += mn_now;
3926 /*assert (("libev: internal timer heap corruption", timers [ev_active (w)] == (WT)w));*/ 3932 /*assert (("libev: internal timer heap corruption", timers [ev_active (w)] == (WT)w));*/
3927} 3933}
3928 3934
3929noinline 3935noinline
3930void 3936void
3931ev_timer_stop (EV_P_ ev_timer *w) EV_THROW 3937ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT
3932{ 3938{
3933 clear_pending (EV_A_ (W)w); 3939 clear_pending (EV_A_ (W)w);
3934 if (expect_false (!ev_is_active (w))) 3940 if (expect_false (!ev_is_active (w)))
3935 return; 3941 return;
3936 3942
3957 EV_FREQUENT_CHECK; 3963 EV_FREQUENT_CHECK;
3958} 3964}
3959 3965
3960noinline 3966noinline
3961void 3967void
3962ev_timer_again (EV_P_ ev_timer *w) EV_THROW 3968ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT
3963{ 3969{
3964 EV_FREQUENT_CHECK; 3970 EV_FREQUENT_CHECK;
3965 3971
3966 clear_pending (EV_A_ (W)w); 3972 clear_pending (EV_A_ (W)w);
3967 3973
3984 3990
3985 EV_FREQUENT_CHECK; 3991 EV_FREQUENT_CHECK;
3986} 3992}
3987 3993
3988ev_tstamp 3994ev_tstamp
3989ev_timer_remaining (EV_P_ ev_timer *w) EV_THROW 3995ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT
3990{ 3996{
3991 return ev_at (w) - (ev_is_active (w) ? mn_now : 0.); 3997 return ev_at (w) - (ev_is_active (w) ? mn_now : 0.);
3992} 3998}
3993 3999
3994#if EV_PERIODIC_ENABLE 4000#if EV_PERIODIC_ENABLE
3995noinline 4001noinline
3996void 4002void
3997ev_periodic_start (EV_P_ ev_periodic *w) EV_THROW 4003ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT
3998{ 4004{
3999 if (expect_false (ev_is_active (w))) 4005 if (expect_false (ev_is_active (w)))
4000 return; 4006 return;
4001 4007
4002 if (w->reschedule_cb) 4008 if (w->reschedule_cb)
4023 /*assert (("libev: internal periodic heap corruption", ANHE_w (periodics [ev_active (w)]) == (WT)w));*/ 4029 /*assert (("libev: internal periodic heap corruption", ANHE_w (periodics [ev_active (w)]) == (WT)w));*/
4024} 4030}
4025 4031
4026noinline 4032noinline
4027void 4033void
4028ev_periodic_stop (EV_P_ ev_periodic *w) EV_THROW 4034ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT
4029{ 4035{
4030 clear_pending (EV_A_ (W)w); 4036 clear_pending (EV_A_ (W)w);
4031 if (expect_false (!ev_is_active (w))) 4037 if (expect_false (!ev_is_active (w)))
4032 return; 4038 return;
4033 4039
4052 EV_FREQUENT_CHECK; 4058 EV_FREQUENT_CHECK;
4053} 4059}
4054 4060
4055noinline 4061noinline
4056void 4062void
4057ev_periodic_again (EV_P_ ev_periodic *w) EV_THROW 4063ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT
4058{ 4064{
4059 /* TODO: use adjustheap and recalculation */ 4065 /* TODO: use adjustheap and recalculation */
4060 ev_periodic_stop (EV_A_ w); 4066 ev_periodic_stop (EV_A_ w);
4061 ev_periodic_start (EV_A_ w); 4067 ev_periodic_start (EV_A_ w);
4062} 4068}
4068 4074
4069#if EV_SIGNAL_ENABLE 4075#if EV_SIGNAL_ENABLE
4070 4076
4071noinline 4077noinline
4072void 4078void
4073ev_signal_start (EV_P_ ev_signal *w) EV_THROW 4079ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT
4074{ 4080{
4075 if (expect_false (ev_is_active (w))) 4081 if (expect_false (ev_is_active (w)))
4076 return; 4082 return;
4077 4083
4078 assert (("libev: ev_signal_start called with illegal signal number", w->signum > 0 && w->signum < EV_NSIG)); 4084 assert (("libev: ev_signal_start called with illegal signal number", w->signum > 0 && w->signum < EV_NSIG));
4151 EV_FREQUENT_CHECK; 4157 EV_FREQUENT_CHECK;
4152} 4158}
4153 4159
4154noinline 4160noinline
4155void 4161void
4156ev_signal_stop (EV_P_ ev_signal *w) EV_THROW 4162ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT
4157{ 4163{
4158 clear_pending (EV_A_ (W)w); 4164 clear_pending (EV_A_ (W)w);
4159 if (expect_false (!ev_is_active (w))) 4165 if (expect_false (!ev_is_active (w)))
4160 return; 4166 return;
4161 4167
4192#endif 4198#endif
4193 4199
4194#if EV_CHILD_ENABLE 4200#if EV_CHILD_ENABLE
4195 4201
4196void 4202void
4197ev_child_start (EV_P_ ev_child *w) EV_THROW 4203ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT
4198{ 4204{
4199#if EV_MULTIPLICITY 4205#if EV_MULTIPLICITY
4200 assert (("libev: child watchers are only supported in the default loop", loop == ev_default_loop_ptr)); 4206 assert (("libev: child watchers are only supported in the default loop", loop == ev_default_loop_ptr));
4201#endif 4207#endif
4202 if (expect_false (ev_is_active (w))) 4208 if (expect_false (ev_is_active (w)))
4209 4215
4210 EV_FREQUENT_CHECK; 4216 EV_FREQUENT_CHECK;
4211} 4217}
4212 4218
4213void 4219void
4214ev_child_stop (EV_P_ ev_child *w) EV_THROW 4220ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT
4215{ 4221{
4216 clear_pending (EV_A_ (W)w); 4222 clear_pending (EV_A_ (W)w);
4217 if (expect_false (!ev_is_active (w))) 4223 if (expect_false (!ev_is_active (w)))
4218 return; 4224 return;
4219 4225
4484#else 4490#else
4485# define EV_LSTAT(p,b) lstat (p, b) 4491# define EV_LSTAT(p,b) lstat (p, b)
4486#endif 4492#endif
4487 4493
4488void 4494void
4489ev_stat_stat (EV_P_ ev_stat *w) EV_THROW 4495ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT
4490{ 4496{
4491 if (lstat (w->path, &w->attr) < 0) 4497 if (lstat (w->path, &w->attr) < 0)
4492 w->attr.st_nlink = 0; 4498 w->attr.st_nlink = 0;
4493 else if (!w->attr.st_nlink) 4499 else if (!w->attr.st_nlink)
4494 w->attr.st_nlink = 1; 4500 w->attr.st_nlink = 1;
4534 ev_feed_event (EV_A_ w, EV_STAT); 4540 ev_feed_event (EV_A_ w, EV_STAT);
4535 } 4541 }
4536} 4542}
4537 4543
4538void 4544void
4539ev_stat_start (EV_P_ ev_stat *w) EV_THROW 4545ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT
4540{ 4546{
4541 if (expect_false (ev_is_active (w))) 4547 if (expect_false (ev_is_active (w)))
4542 return; 4548 return;
4543 4549
4544 ev_stat_stat (EV_A_ w); 4550 ev_stat_stat (EV_A_ w);
4565 4571
4566 EV_FREQUENT_CHECK; 4572 EV_FREQUENT_CHECK;
4567} 4573}
4568 4574
4569void 4575void
4570ev_stat_stop (EV_P_ ev_stat *w) EV_THROW 4576ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT
4571{ 4577{
4572 clear_pending (EV_A_ (W)w); 4578 clear_pending (EV_A_ (W)w);
4573 if (expect_false (!ev_is_active (w))) 4579 if (expect_false (!ev_is_active (w)))
4574 return; 4580 return;
4575 4581
4591} 4597}
4592#endif 4598#endif
4593 4599
4594#if EV_IDLE_ENABLE 4600#if EV_IDLE_ENABLE
4595void 4601void
4596ev_idle_start (EV_P_ ev_idle *w) EV_THROW 4602ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT
4597{ 4603{
4598 if (expect_false (ev_is_active (w))) 4604 if (expect_false (ev_is_active (w)))
4599 return; 4605 return;
4600 4606
4601 pri_adjust (EV_A_ (W)w); 4607 pri_adjust (EV_A_ (W)w);
4614 4620
4615 EV_FREQUENT_CHECK; 4621 EV_FREQUENT_CHECK;
4616} 4622}
4617 4623
4618void 4624void
4619ev_idle_stop (EV_P_ ev_idle *w) EV_THROW 4625ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT
4620{ 4626{
4621 clear_pending (EV_A_ (W)w); 4627 clear_pending (EV_A_ (W)w);
4622 if (expect_false (!ev_is_active (w))) 4628 if (expect_false (!ev_is_active (w)))
4623 return; 4629 return;
4624 4630
4638} 4644}
4639#endif 4645#endif
4640 4646
4641#if EV_PREPARE_ENABLE 4647#if EV_PREPARE_ENABLE
4642void 4648void
4643ev_prepare_start (EV_P_ ev_prepare *w) EV_THROW 4649ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT
4644{ 4650{
4645 if (expect_false (ev_is_active (w))) 4651 if (expect_false (ev_is_active (w)))
4646 return; 4652 return;
4647 4653
4648 EV_FREQUENT_CHECK; 4654 EV_FREQUENT_CHECK;
4653 4659
4654 EV_FREQUENT_CHECK; 4660 EV_FREQUENT_CHECK;
4655} 4661}
4656 4662
4657void 4663void
4658ev_prepare_stop (EV_P_ ev_prepare *w) EV_THROW 4664ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT
4659{ 4665{
4660 clear_pending (EV_A_ (W)w); 4666 clear_pending (EV_A_ (W)w);
4661 if (expect_false (!ev_is_active (w))) 4667 if (expect_false (!ev_is_active (w)))
4662 return; 4668 return;
4663 4669
4676} 4682}
4677#endif 4683#endif
4678 4684
4679#if EV_CHECK_ENABLE 4685#if EV_CHECK_ENABLE
4680void 4686void
4681ev_check_start (EV_P_ ev_check *w) EV_THROW 4687ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT
4682{ 4688{
4683 if (expect_false (ev_is_active (w))) 4689 if (expect_false (ev_is_active (w)))
4684 return; 4690 return;
4685 4691
4686 EV_FREQUENT_CHECK; 4692 EV_FREQUENT_CHECK;
4691 4697
4692 EV_FREQUENT_CHECK; 4698 EV_FREQUENT_CHECK;
4693} 4699}
4694 4700
4695void 4701void
4696ev_check_stop (EV_P_ ev_check *w) EV_THROW 4702ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT
4697{ 4703{
4698 clear_pending (EV_A_ (W)w); 4704 clear_pending (EV_A_ (W)w);
4699 if (expect_false (!ev_is_active (w))) 4705 if (expect_false (!ev_is_active (w)))
4700 return; 4706 return;
4701 4707
4715#endif 4721#endif
4716 4722
4717#if EV_EMBED_ENABLE 4723#if EV_EMBED_ENABLE
4718noinline 4724noinline
4719void 4725void
4720ev_embed_sweep (EV_P_ ev_embed *w) EV_THROW 4726ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT
4721{ 4727{
4722 ev_run (w->other, EVRUN_NOWAIT); 4728 ev_run (w->other, EVRUN_NOWAIT);
4723} 4729}
4724 4730
4725static void 4731static void
4773 ev_idle_stop (EV_A_ idle); 4779 ev_idle_stop (EV_A_ idle);
4774} 4780}
4775#endif 4781#endif
4776 4782
4777void 4783void
4778ev_embed_start (EV_P_ ev_embed *w) EV_THROW 4784ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT
4779{ 4785{
4780 if (expect_false (ev_is_active (w))) 4786 if (expect_false (ev_is_active (w)))
4781 return; 4787 return;
4782 4788
4783 { 4789 {
4804 4810
4805 EV_FREQUENT_CHECK; 4811 EV_FREQUENT_CHECK;
4806} 4812}
4807 4813
4808void 4814void
4809ev_embed_stop (EV_P_ ev_embed *w) EV_THROW 4815ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT
4810{ 4816{
4811 clear_pending (EV_A_ (W)w); 4817 clear_pending (EV_A_ (W)w);
4812 if (expect_false (!ev_is_active (w))) 4818 if (expect_false (!ev_is_active (w)))
4813 return; 4819 return;
4814 4820
4824} 4830}
4825#endif 4831#endif
4826 4832
4827#if EV_FORK_ENABLE 4833#if EV_FORK_ENABLE
4828void 4834void
4829ev_fork_start (EV_P_ ev_fork *w) EV_THROW 4835ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT
4830{ 4836{
4831 if (expect_false (ev_is_active (w))) 4837 if (expect_false (ev_is_active (w)))
4832 return; 4838 return;
4833 4839
4834 EV_FREQUENT_CHECK; 4840 EV_FREQUENT_CHECK;
4839 4845
4840 EV_FREQUENT_CHECK; 4846 EV_FREQUENT_CHECK;
4841} 4847}
4842 4848
4843void 4849void
4844ev_fork_stop (EV_P_ ev_fork *w) EV_THROW 4850ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT
4845{ 4851{
4846 clear_pending (EV_A_ (W)w); 4852 clear_pending (EV_A_ (W)w);
4847 if (expect_false (!ev_is_active (w))) 4853 if (expect_false (!ev_is_active (w)))
4848 return; 4854 return;
4849 4855
4862} 4868}
4863#endif 4869#endif
4864 4870
4865#if EV_CLEANUP_ENABLE 4871#if EV_CLEANUP_ENABLE
4866void 4872void
4867ev_cleanup_start (EV_P_ ev_cleanup *w) EV_THROW 4873ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT
4868{ 4874{
4869 if (expect_false (ev_is_active (w))) 4875 if (expect_false (ev_is_active (w)))
4870 return; 4876 return;
4871 4877
4872 EV_FREQUENT_CHECK; 4878 EV_FREQUENT_CHECK;
4879 ev_unref (EV_A); 4885 ev_unref (EV_A);
4880 EV_FREQUENT_CHECK; 4886 EV_FREQUENT_CHECK;
4881} 4887}
4882 4888
4883void 4889void
4884ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_THROW 4890ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT
4885{ 4891{
4886 clear_pending (EV_A_ (W)w); 4892 clear_pending (EV_A_ (W)w);
4887 if (expect_false (!ev_is_active (w))) 4893 if (expect_false (!ev_is_active (w)))
4888 return; 4894 return;
4889 4895
4903} 4909}
4904#endif 4910#endif
4905 4911
4906#if EV_ASYNC_ENABLE 4912#if EV_ASYNC_ENABLE
4907void 4913void
4908ev_async_start (EV_P_ ev_async *w) EV_THROW 4914ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT
4909{ 4915{
4910 if (expect_false (ev_is_active (w))) 4916 if (expect_false (ev_is_active (w)))
4911 return; 4917 return;
4912 4918
4913 w->sent = 0; 4919 w->sent = 0;
4922 4928
4923 EV_FREQUENT_CHECK; 4929 EV_FREQUENT_CHECK;
4924} 4930}
4925 4931
4926void 4932void
4927ev_async_stop (EV_P_ ev_async *w) EV_THROW 4933ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT
4928{ 4934{
4929 clear_pending (EV_A_ (W)w); 4935 clear_pending (EV_A_ (W)w);
4930 if (expect_false (!ev_is_active (w))) 4936 if (expect_false (!ev_is_active (w)))
4931 return; 4937 return;
4932 4938
4943 4949
4944 EV_FREQUENT_CHECK; 4950 EV_FREQUENT_CHECK;
4945} 4951}
4946 4952
4947void 4953void
4948ev_async_send (EV_P_ ev_async *w) EV_THROW 4954ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT
4949{ 4955{
4950 w->sent = 1; 4956 w->sent = 1;
4951 evpipe_write (EV_A_ &async_pending); 4957 evpipe_write (EV_A_ &async_pending);
4952} 4958}
4953#endif 4959#endif
4990 4996
4991 once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->io)); 4997 once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->io));
4992} 4998}
4993 4999
4994void 5000void
4995ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_THROW 5001ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT
4996{ 5002{
4997 struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once)); 5003 struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once));
4998 5004
4999 if (expect_false (!once)) 5005 if (expect_false (!once))
5000 { 5006 {
5023/*****************************************************************************/ 5029/*****************************************************************************/
5024 5030
5025#if EV_WALK_ENABLE 5031#if EV_WALK_ENABLE
5026ecb_cold 5032ecb_cold
5027void 5033void
5028ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_THROW 5034ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT
5029{ 5035{
5030 int i, j; 5036 int i, j;
5031 ev_watcher_list *wl, *wn; 5037 ev_watcher_list *wl, *wn;
5032 5038
5033 if (types & (EV_IO | EV_EMBED)) 5039 if (types & (EV_IO | EV_EMBED))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines