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

Comparing libev/ev.c (file contents):
Revision 1.482 by root, Sat Jul 28 04:15:15 2018 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
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;
1992{ 1994{
1993} 1995}
1994 1996
1995noinline 1997noinline
1996void 1998void
1997ev_feed_event (EV_P_ void *w, int revents) EV_THROW 1999ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT
1998{ 2000{
1999 W w_ = (W)w; 2001 W w_ = (W)w;
2000 int pri = ABSPRI (w_); 2002 int pri = ABSPRI (w_);
2001 2003
2002 if (expect_false (w_->pending)) 2004 if (expect_false (w_->pending))
2063 if (expect_true (!anfd->reify)) 2065 if (expect_true (!anfd->reify))
2064 fd_event_nocheck (EV_A_ fd, revents); 2066 fd_event_nocheck (EV_A_ fd, revents);
2065} 2067}
2066 2068
2067void 2069void
2068ev_feed_fd_event (EV_P_ int fd, int revents) EV_THROW 2070ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT
2069{ 2071{
2070 if (fd >= 0 && fd < anfdmax) 2072 if (fd >= 0 && fd < anfdmax)
2071 fd_event_nocheck (EV_A_ fd, revents); 2073 fd_event_nocheck (EV_A_ fd, revents);
2072} 2074}
2073 2075
2473#endif 2475#endif
2474 { 2476 {
2475#ifdef _WIN32 2477#ifdef _WIN32
2476 WSABUF buf; 2478 WSABUF buf;
2477 DWORD sent; 2479 DWORD sent;
2478 buf.buf = &buf; 2480 buf.buf = (char *)&buf;
2479 buf.len = 1; 2481 buf.len = 1;
2480 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);
2481#else 2483#else
2482 write (evpipe [1], &(evpipe [1]), 1); 2484 write (evpipe [1], &(evpipe [1]), 1);
2483#endif 2485#endif
2555} 2557}
2556 2558
2557/*****************************************************************************/ 2559/*****************************************************************************/
2558 2560
2559void 2561void
2560ev_feed_signal (int signum) EV_THROW 2562ev_feed_signal (int signum) EV_NOEXCEPT
2561{ 2563{
2562#if EV_MULTIPLICITY 2564#if EV_MULTIPLICITY
2563 EV_P; 2565 EV_P;
2564 ECB_MEMORY_FENCE_ACQUIRE; 2566 ECB_MEMORY_FENCE_ACQUIRE;
2565 EV_A = signals [signum - 1].loop; 2567 EV_A = signals [signum - 1].loop;
2582 ev_feed_signal (signum); 2584 ev_feed_signal (signum);
2583} 2585}
2584 2586
2585noinline 2587noinline
2586void 2588void
2587ev_feed_signal_event (EV_P_ int signum) EV_THROW 2589ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT
2588{ 2590{
2589 WL w; 2591 WL w;
2590 2592
2591 if (expect_false (signum <= 0 || signum >= EV_NSIG)) 2593 if (expect_false (signum <= 0 || signum >= EV_NSIG))
2592 return; 2594 return;
2709#if EV_USE_SELECT 2711#if EV_USE_SELECT
2710# include "ev_select.c" 2712# include "ev_select.c"
2711#endif 2713#endif
2712 2714
2713ecb_cold int 2715ecb_cold int
2714ev_version_major (void) EV_THROW 2716ev_version_major (void) EV_NOEXCEPT
2715{ 2717{
2716 return EV_VERSION_MAJOR; 2718 return EV_VERSION_MAJOR;
2717} 2719}
2718 2720
2719ecb_cold int 2721ecb_cold int
2720ev_version_minor (void) EV_THROW 2722ev_version_minor (void) EV_NOEXCEPT
2721{ 2723{
2722 return EV_VERSION_MINOR; 2724 return EV_VERSION_MINOR;
2723} 2725}
2724 2726
2725/* 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 */
2734#endif 2736#endif
2735} 2737}
2736 2738
2737ecb_cold 2739ecb_cold
2738unsigned int 2740unsigned int
2739ev_supported_backends (void) EV_THROW 2741ev_supported_backends (void) EV_NOEXCEPT
2740{ 2742{
2741 unsigned int flags = 0; 2743 unsigned int flags = 0;
2742 2744
2743 if (EV_USE_PORT ) flags |= EVBACKEND_PORT; 2745 if (EV_USE_PORT ) flags |= EVBACKEND_PORT;
2744 if (EV_USE_KQUEUE) flags |= EVBACKEND_KQUEUE; 2746 if (EV_USE_KQUEUE) flags |= EVBACKEND_KQUEUE;
2749 return flags; 2751 return flags;
2750} 2752}
2751 2753
2752ecb_cold 2754ecb_cold
2753unsigned int 2755unsigned int
2754ev_recommended_backends (void) EV_THROW 2756ev_recommended_backends (void) EV_NOEXCEPT
2755{ 2757{
2756 unsigned int flags = ev_supported_backends (); 2758 unsigned int flags = ev_supported_backends ();
2757 2759
2758#ifndef __NetBSD__ 2760#ifndef __NetBSD__
2759 /* kqueue is borked on everything but netbsd apparently */ 2761 /* kqueue is borked on everything but netbsd apparently */
2772 return flags; 2774 return flags;
2773} 2775}
2774 2776
2775ecb_cold 2777ecb_cold
2776unsigned int 2778unsigned int
2777ev_embeddable_backends (void) EV_THROW 2779ev_embeddable_backends (void) EV_NOEXCEPT
2778{ 2780{
2779 int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT; 2781 int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT;
2780 2782
2781 /* 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 */
2782 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 */
2784 2786
2785 return flags; 2787 return flags;
2786} 2788}
2787 2789
2788unsigned int 2790unsigned int
2789ev_backend (EV_P) EV_THROW 2791ev_backend (EV_P) EV_NOEXCEPT
2790{ 2792{
2791 return backend; 2793 return backend;
2792} 2794}
2793 2795
2794#if EV_FEATURE_API 2796#if EV_FEATURE_API
2795unsigned int 2797unsigned int
2796ev_iteration (EV_P) EV_THROW 2798ev_iteration (EV_P) EV_NOEXCEPT
2797{ 2799{
2798 return loop_count; 2800 return loop_count;
2799} 2801}
2800 2802
2801unsigned int 2803unsigned int
2802ev_depth (EV_P) EV_THROW 2804ev_depth (EV_P) EV_NOEXCEPT
2803{ 2805{
2804 return loop_depth; 2806 return loop_depth;
2805} 2807}
2806 2808
2807void 2809void
2808ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_THROW 2810ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT
2809{ 2811{
2810 io_blocktime = interval; 2812 io_blocktime = interval;
2811} 2813}
2812 2814
2813void 2815void
2814ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_THROW 2816ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT
2815{ 2817{
2816 timeout_blocktime = interval; 2818 timeout_blocktime = interval;
2817} 2819}
2818 2820
2819void 2821void
2820ev_set_userdata (EV_P_ void *data) EV_THROW 2822ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT
2821{ 2823{
2822 userdata = data; 2824 userdata = data;
2823} 2825}
2824 2826
2825void * 2827void *
2826ev_userdata (EV_P) EV_THROW 2828ev_userdata (EV_P) EV_NOEXCEPT
2827{ 2829{
2828 return userdata; 2830 return userdata;
2829} 2831}
2830 2832
2831void 2833void
2832ev_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
2833{ 2835{
2834 invoke_cb = invoke_pending_cb; 2836 invoke_cb = invoke_pending_cb;
2835} 2837}
2836 2838
2837void 2839void
2838ev_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
2839{ 2841{
2840 release_cb = release; 2842 release_cb = release;
2841 acquire_cb = acquire; 2843 acquire_cb = acquire;
2842} 2844}
2843#endif 2845#endif
2844 2846
2845/* initialise a loop structure, must be zero-initialised */ 2847/* initialise a loop structure, must be zero-initialised */
2846noinline ecb_cold 2848noinline ecb_cold
2847static void 2849static void
2848loop_init (EV_P_ unsigned int flags) EV_THROW 2850loop_init (EV_P_ unsigned int flags) EV_NOEXCEPT
2849{ 2851{
2850 if (!backend) 2852 if (!backend)
2851 { 2853 {
2852 origflags = flags; 2854 origflags = flags;
2853 2855
3094 3096
3095#if EV_MULTIPLICITY 3097#if EV_MULTIPLICITY
3096 3098
3097ecb_cold 3099ecb_cold
3098struct ev_loop * 3100struct ev_loop *
3099ev_loop_new (unsigned int flags) EV_THROW 3101ev_loop_new (unsigned int flags) EV_NOEXCEPT
3100{ 3102{
3101 EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop)); 3103 EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop));
3102 3104
3103 memset (EV_A, 0, sizeof (struct ev_loop)); 3105 memset (EV_A, 0, sizeof (struct ev_loop));
3104 loop_init (EV_A_ flags); 3106 loop_init (EV_A_ flags);
3151} 3153}
3152#endif 3154#endif
3153 3155
3154#if EV_FEATURE_API 3156#if EV_FEATURE_API
3155void ecb_cold 3157void ecb_cold
3156ev_verify (EV_P) EV_THROW 3158ev_verify (EV_P) EV_NOEXCEPT
3157{ 3159{
3158#if EV_VERIFY 3160#if EV_VERIFY
3159 int i; 3161 int i;
3160 WL w, w2; 3162 WL w, w2;
3161 3163
3242ecb_cold 3244ecb_cold
3243struct ev_loop * 3245struct ev_loop *
3244#else 3246#else
3245int 3247int
3246#endif 3248#endif
3247ev_default_loop (unsigned int flags) EV_THROW 3249ev_default_loop (unsigned int flags) EV_NOEXCEPT
3248{ 3250{
3249 if (!ev_default_loop_ptr) 3251 if (!ev_default_loop_ptr)
3250 { 3252 {
3251#if EV_MULTIPLICITY 3253#if EV_MULTIPLICITY
3252 EV_P = ev_default_loop_ptr = &default_loop_struct; 3254 EV_P = ev_default_loop_ptr = &default_loop_struct;
3271 3273
3272 return ev_default_loop_ptr; 3274 return ev_default_loop_ptr;
3273} 3275}
3274 3276
3275void 3277void
3276ev_loop_fork (EV_P) EV_THROW 3278ev_loop_fork (EV_P) EV_NOEXCEPT
3277{ 3279{
3278 postfork = 1; 3280 postfork = 1;
3279} 3281}
3280 3282
3281/*****************************************************************************/ 3283/*****************************************************************************/
3285{ 3287{
3286 EV_CB_INVOKE ((W)w, revents); 3288 EV_CB_INVOKE ((W)w, revents);
3287} 3289}
3288 3290
3289unsigned int 3291unsigned int
3290ev_pending_count (EV_P) EV_THROW 3292ev_pending_count (EV_P) EV_NOEXCEPT
3291{ 3293{
3292 int pri; 3294 int pri;
3293 unsigned int count = 0; 3295 unsigned int count = 0;
3294 3296
3295 for (pri = NUMPRI; pri--; ) 3297 for (pri = NUMPRI; pri--; )
3302void 3304void
3303ev_invoke_pending (EV_P) 3305ev_invoke_pending (EV_P)
3304{ 3306{
3305 pendingpri = NUMPRI; 3307 pendingpri = NUMPRI;
3306 3308
3307 while (pendingpri) /* pendingpri possibly gets modified in the inner loop */ 3309 do
3308 { 3310 {
3309 --pendingpri; 3311 --pendingpri;
3310 3312
3313 /* pendingpri possibly gets modified in the inner loop */
3311 while (pendingcnt [pendingpri]) 3314 while (pendingcnt [pendingpri])
3312 { 3315 {
3313 ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri]; 3316 ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri];
3314 3317
3315 p->w->pending = 0; 3318 p->w->pending = 0;
3316 EV_CB_INVOKE (p->w, p->events); 3319 EV_CB_INVOKE (p->w, p->events);
3317 EV_FREQUENT_CHECK; 3320 EV_FREQUENT_CHECK;
3318 } 3321 }
3319 } 3322 }
3323 while (pendingpri);
3320} 3324}
3321 3325
3322#if EV_IDLE_ENABLE 3326#if EV_IDLE_ENABLE
3323/* make idle watchers pending. this handles the "call-idle */ 3327/* make idle watchers pending. this handles the "call-idle */
3324/* only when higher priorities are idle" logic */ 3328/* only when higher priorities are idle" logic */
3733 3737
3734 return activecnt; 3738 return activecnt;
3735} 3739}
3736 3740
3737void 3741void
3738ev_break (EV_P_ int how) EV_THROW 3742ev_break (EV_P_ int how) EV_NOEXCEPT
3739{ 3743{
3740 loop_done = how; 3744 loop_done = how;
3741} 3745}
3742 3746
3743void 3747void
3744ev_ref (EV_P) EV_THROW 3748ev_ref (EV_P) EV_NOEXCEPT
3745{ 3749{
3746 ++activecnt; 3750 ++activecnt;
3747} 3751}
3748 3752
3749void 3753void
3750ev_unref (EV_P) EV_THROW 3754ev_unref (EV_P) EV_NOEXCEPT
3751{ 3755{
3752 --activecnt; 3756 --activecnt;
3753} 3757}
3754 3758
3755void 3759void
3756ev_now_update (EV_P) EV_THROW 3760ev_now_update (EV_P) EV_NOEXCEPT
3757{ 3761{
3758 time_update (EV_A_ 1e100); 3762 time_update (EV_A_ 1e100);
3759} 3763}
3760 3764
3761void 3765void
3762ev_suspend (EV_P) EV_THROW 3766ev_suspend (EV_P) EV_NOEXCEPT
3763{ 3767{
3764 ev_now_update (EV_A); 3768 ev_now_update (EV_A);
3765} 3769}
3766 3770
3767void 3771void
3768ev_resume (EV_P) EV_THROW 3772ev_resume (EV_P) EV_NOEXCEPT
3769{ 3773{
3770 ev_tstamp mn_prev = mn_now; 3774 ev_tstamp mn_prev = mn_now;
3771 3775
3772 ev_now_update (EV_A); 3776 ev_now_update (EV_A);
3773 timers_reschedule (EV_A_ mn_now - mn_prev); 3777 timers_reschedule (EV_A_ mn_now - mn_prev);
3812 w->pending = 0; 3816 w->pending = 0;
3813 } 3817 }
3814} 3818}
3815 3819
3816int 3820int
3817ev_clear_pending (EV_P_ void *w) EV_THROW 3821ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT
3818{ 3822{
3819 W w_ = (W)w; 3823 W w_ = (W)w;
3820 int pending = w_->pending; 3824 int pending = w_->pending;
3821 3825
3822 if (expect_true (pending)) 3826 if (expect_true (pending))
3856 3860
3857/*****************************************************************************/ 3861/*****************************************************************************/
3858 3862
3859noinline 3863noinline
3860void 3864void
3861ev_io_start (EV_P_ ev_io *w) EV_THROW 3865ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT
3862{ 3866{
3863 int fd = w->fd; 3867 int fd = w->fd;
3864 3868
3865 if (expect_false (ev_is_active (w))) 3869 if (expect_false (ev_is_active (w)))
3866 return; 3870 return;
3883 EV_FREQUENT_CHECK; 3887 EV_FREQUENT_CHECK;
3884} 3888}
3885 3889
3886noinline 3890noinline
3887void 3891void
3888ev_io_stop (EV_P_ ev_io *w) EV_THROW 3892ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT
3889{ 3893{
3890 clear_pending (EV_A_ (W)w); 3894 clear_pending (EV_A_ (W)w);
3891 if (expect_false (!ev_is_active (w))) 3895 if (expect_false (!ev_is_active (w)))
3892 return; 3896 return;
3893 3897
3903 EV_FREQUENT_CHECK; 3907 EV_FREQUENT_CHECK;
3904} 3908}
3905 3909
3906noinline 3910noinline
3907void 3911void
3908ev_timer_start (EV_P_ ev_timer *w) EV_THROW 3912ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT
3909{ 3913{
3910 if (expect_false (ev_is_active (w))) 3914 if (expect_false (ev_is_active (w)))
3911 return; 3915 return;
3912 3916
3913 ev_at (w) += mn_now; 3917 ev_at (w) += mn_now;
3928 /*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));*/
3929} 3933}
3930 3934
3931noinline 3935noinline
3932void 3936void
3933ev_timer_stop (EV_P_ ev_timer *w) EV_THROW 3937ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT
3934{ 3938{
3935 clear_pending (EV_A_ (W)w); 3939 clear_pending (EV_A_ (W)w);
3936 if (expect_false (!ev_is_active (w))) 3940 if (expect_false (!ev_is_active (w)))
3937 return; 3941 return;
3938 3942
3959 EV_FREQUENT_CHECK; 3963 EV_FREQUENT_CHECK;
3960} 3964}
3961 3965
3962noinline 3966noinline
3963void 3967void
3964ev_timer_again (EV_P_ ev_timer *w) EV_THROW 3968ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT
3965{ 3969{
3966 EV_FREQUENT_CHECK; 3970 EV_FREQUENT_CHECK;
3967 3971
3968 clear_pending (EV_A_ (W)w); 3972 clear_pending (EV_A_ (W)w);
3969 3973
3986 3990
3987 EV_FREQUENT_CHECK; 3991 EV_FREQUENT_CHECK;
3988} 3992}
3989 3993
3990ev_tstamp 3994ev_tstamp
3991ev_timer_remaining (EV_P_ ev_timer *w) EV_THROW 3995ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT
3992{ 3996{
3993 return ev_at (w) - (ev_is_active (w) ? mn_now : 0.); 3997 return ev_at (w) - (ev_is_active (w) ? mn_now : 0.);
3994} 3998}
3995 3999
3996#if EV_PERIODIC_ENABLE 4000#if EV_PERIODIC_ENABLE
3997noinline 4001noinline
3998void 4002void
3999ev_periodic_start (EV_P_ ev_periodic *w) EV_THROW 4003ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT
4000{ 4004{
4001 if (expect_false (ev_is_active (w))) 4005 if (expect_false (ev_is_active (w)))
4002 return; 4006 return;
4003 4007
4004 if (w->reschedule_cb) 4008 if (w->reschedule_cb)
4025 /*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));*/
4026} 4030}
4027 4031
4028noinline 4032noinline
4029void 4033void
4030ev_periodic_stop (EV_P_ ev_periodic *w) EV_THROW 4034ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT
4031{ 4035{
4032 clear_pending (EV_A_ (W)w); 4036 clear_pending (EV_A_ (W)w);
4033 if (expect_false (!ev_is_active (w))) 4037 if (expect_false (!ev_is_active (w)))
4034 return; 4038 return;
4035 4039
4054 EV_FREQUENT_CHECK; 4058 EV_FREQUENT_CHECK;
4055} 4059}
4056 4060
4057noinline 4061noinline
4058void 4062void
4059ev_periodic_again (EV_P_ ev_periodic *w) EV_THROW 4063ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT
4060{ 4064{
4061 /* TODO: use adjustheap and recalculation */ 4065 /* TODO: use adjustheap and recalculation */
4062 ev_periodic_stop (EV_A_ w); 4066 ev_periodic_stop (EV_A_ w);
4063 ev_periodic_start (EV_A_ w); 4067 ev_periodic_start (EV_A_ w);
4064} 4068}
4070 4074
4071#if EV_SIGNAL_ENABLE 4075#if EV_SIGNAL_ENABLE
4072 4076
4073noinline 4077noinline
4074void 4078void
4075ev_signal_start (EV_P_ ev_signal *w) EV_THROW 4079ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT
4076{ 4080{
4077 if (expect_false (ev_is_active (w))) 4081 if (expect_false (ev_is_active (w)))
4078 return; 4082 return;
4079 4083
4080 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));
4153 EV_FREQUENT_CHECK; 4157 EV_FREQUENT_CHECK;
4154} 4158}
4155 4159
4156noinline 4160noinline
4157void 4161void
4158ev_signal_stop (EV_P_ ev_signal *w) EV_THROW 4162ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT
4159{ 4163{
4160 clear_pending (EV_A_ (W)w); 4164 clear_pending (EV_A_ (W)w);
4161 if (expect_false (!ev_is_active (w))) 4165 if (expect_false (!ev_is_active (w)))
4162 return; 4166 return;
4163 4167
4194#endif 4198#endif
4195 4199
4196#if EV_CHILD_ENABLE 4200#if EV_CHILD_ENABLE
4197 4201
4198void 4202void
4199ev_child_start (EV_P_ ev_child *w) EV_THROW 4203ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT
4200{ 4204{
4201#if EV_MULTIPLICITY 4205#if EV_MULTIPLICITY
4202 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));
4203#endif 4207#endif
4204 if (expect_false (ev_is_active (w))) 4208 if (expect_false (ev_is_active (w)))
4211 4215
4212 EV_FREQUENT_CHECK; 4216 EV_FREQUENT_CHECK;
4213} 4217}
4214 4218
4215void 4219void
4216ev_child_stop (EV_P_ ev_child *w) EV_THROW 4220ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT
4217{ 4221{
4218 clear_pending (EV_A_ (W)w); 4222 clear_pending (EV_A_ (W)w);
4219 if (expect_false (!ev_is_active (w))) 4223 if (expect_false (!ev_is_active (w)))
4220 return; 4224 return;
4221 4225
4486#else 4490#else
4487# define EV_LSTAT(p,b) lstat (p, b) 4491# define EV_LSTAT(p,b) lstat (p, b)
4488#endif 4492#endif
4489 4493
4490void 4494void
4491ev_stat_stat (EV_P_ ev_stat *w) EV_THROW 4495ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT
4492{ 4496{
4493 if (lstat (w->path, &w->attr) < 0) 4497 if (lstat (w->path, &w->attr) < 0)
4494 w->attr.st_nlink = 0; 4498 w->attr.st_nlink = 0;
4495 else if (!w->attr.st_nlink) 4499 else if (!w->attr.st_nlink)
4496 w->attr.st_nlink = 1; 4500 w->attr.st_nlink = 1;
4536 ev_feed_event (EV_A_ w, EV_STAT); 4540 ev_feed_event (EV_A_ w, EV_STAT);
4537 } 4541 }
4538} 4542}
4539 4543
4540void 4544void
4541ev_stat_start (EV_P_ ev_stat *w) EV_THROW 4545ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT
4542{ 4546{
4543 if (expect_false (ev_is_active (w))) 4547 if (expect_false (ev_is_active (w)))
4544 return; 4548 return;
4545 4549
4546 ev_stat_stat (EV_A_ w); 4550 ev_stat_stat (EV_A_ w);
4567 4571
4568 EV_FREQUENT_CHECK; 4572 EV_FREQUENT_CHECK;
4569} 4573}
4570 4574
4571void 4575void
4572ev_stat_stop (EV_P_ ev_stat *w) EV_THROW 4576ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT
4573{ 4577{
4574 clear_pending (EV_A_ (W)w); 4578 clear_pending (EV_A_ (W)w);
4575 if (expect_false (!ev_is_active (w))) 4579 if (expect_false (!ev_is_active (w)))
4576 return; 4580 return;
4577 4581
4593} 4597}
4594#endif 4598#endif
4595 4599
4596#if EV_IDLE_ENABLE 4600#if EV_IDLE_ENABLE
4597void 4601void
4598ev_idle_start (EV_P_ ev_idle *w) EV_THROW 4602ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT
4599{ 4603{
4600 if (expect_false (ev_is_active (w))) 4604 if (expect_false (ev_is_active (w)))
4601 return; 4605 return;
4602 4606
4603 pri_adjust (EV_A_ (W)w); 4607 pri_adjust (EV_A_ (W)w);
4616 4620
4617 EV_FREQUENT_CHECK; 4621 EV_FREQUENT_CHECK;
4618} 4622}
4619 4623
4620void 4624void
4621ev_idle_stop (EV_P_ ev_idle *w) EV_THROW 4625ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT
4622{ 4626{
4623 clear_pending (EV_A_ (W)w); 4627 clear_pending (EV_A_ (W)w);
4624 if (expect_false (!ev_is_active (w))) 4628 if (expect_false (!ev_is_active (w)))
4625 return; 4629 return;
4626 4630
4640} 4644}
4641#endif 4645#endif
4642 4646
4643#if EV_PREPARE_ENABLE 4647#if EV_PREPARE_ENABLE
4644void 4648void
4645ev_prepare_start (EV_P_ ev_prepare *w) EV_THROW 4649ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT
4646{ 4650{
4647 if (expect_false (ev_is_active (w))) 4651 if (expect_false (ev_is_active (w)))
4648 return; 4652 return;
4649 4653
4650 EV_FREQUENT_CHECK; 4654 EV_FREQUENT_CHECK;
4655 4659
4656 EV_FREQUENT_CHECK; 4660 EV_FREQUENT_CHECK;
4657} 4661}
4658 4662
4659void 4663void
4660ev_prepare_stop (EV_P_ ev_prepare *w) EV_THROW 4664ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT
4661{ 4665{
4662 clear_pending (EV_A_ (W)w); 4666 clear_pending (EV_A_ (W)w);
4663 if (expect_false (!ev_is_active (w))) 4667 if (expect_false (!ev_is_active (w)))
4664 return; 4668 return;
4665 4669
4678} 4682}
4679#endif 4683#endif
4680 4684
4681#if EV_CHECK_ENABLE 4685#if EV_CHECK_ENABLE
4682void 4686void
4683ev_check_start (EV_P_ ev_check *w) EV_THROW 4687ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT
4684{ 4688{
4685 if (expect_false (ev_is_active (w))) 4689 if (expect_false (ev_is_active (w)))
4686 return; 4690 return;
4687 4691
4688 EV_FREQUENT_CHECK; 4692 EV_FREQUENT_CHECK;
4693 4697
4694 EV_FREQUENT_CHECK; 4698 EV_FREQUENT_CHECK;
4695} 4699}
4696 4700
4697void 4701void
4698ev_check_stop (EV_P_ ev_check *w) EV_THROW 4702ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT
4699{ 4703{
4700 clear_pending (EV_A_ (W)w); 4704 clear_pending (EV_A_ (W)w);
4701 if (expect_false (!ev_is_active (w))) 4705 if (expect_false (!ev_is_active (w)))
4702 return; 4706 return;
4703 4707
4717#endif 4721#endif
4718 4722
4719#if EV_EMBED_ENABLE 4723#if EV_EMBED_ENABLE
4720noinline 4724noinline
4721void 4725void
4722ev_embed_sweep (EV_P_ ev_embed *w) EV_THROW 4726ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT
4723{ 4727{
4724 ev_run (w->other, EVRUN_NOWAIT); 4728 ev_run (w->other, EVRUN_NOWAIT);
4725} 4729}
4726 4730
4727static void 4731static void
4775 ev_idle_stop (EV_A_ idle); 4779 ev_idle_stop (EV_A_ idle);
4776} 4780}
4777#endif 4781#endif
4778 4782
4779void 4783void
4780ev_embed_start (EV_P_ ev_embed *w) EV_THROW 4784ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT
4781{ 4785{
4782 if (expect_false (ev_is_active (w))) 4786 if (expect_false (ev_is_active (w)))
4783 return; 4787 return;
4784 4788
4785 { 4789 {
4806 4810
4807 EV_FREQUENT_CHECK; 4811 EV_FREQUENT_CHECK;
4808} 4812}
4809 4813
4810void 4814void
4811ev_embed_stop (EV_P_ ev_embed *w) EV_THROW 4815ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT
4812{ 4816{
4813 clear_pending (EV_A_ (W)w); 4817 clear_pending (EV_A_ (W)w);
4814 if (expect_false (!ev_is_active (w))) 4818 if (expect_false (!ev_is_active (w)))
4815 return; 4819 return;
4816 4820
4826} 4830}
4827#endif 4831#endif
4828 4832
4829#if EV_FORK_ENABLE 4833#if EV_FORK_ENABLE
4830void 4834void
4831ev_fork_start (EV_P_ ev_fork *w) EV_THROW 4835ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT
4832{ 4836{
4833 if (expect_false (ev_is_active (w))) 4837 if (expect_false (ev_is_active (w)))
4834 return; 4838 return;
4835 4839
4836 EV_FREQUENT_CHECK; 4840 EV_FREQUENT_CHECK;
4841 4845
4842 EV_FREQUENT_CHECK; 4846 EV_FREQUENT_CHECK;
4843} 4847}
4844 4848
4845void 4849void
4846ev_fork_stop (EV_P_ ev_fork *w) EV_THROW 4850ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT
4847{ 4851{
4848 clear_pending (EV_A_ (W)w); 4852 clear_pending (EV_A_ (W)w);
4849 if (expect_false (!ev_is_active (w))) 4853 if (expect_false (!ev_is_active (w)))
4850 return; 4854 return;
4851 4855
4864} 4868}
4865#endif 4869#endif
4866 4870
4867#if EV_CLEANUP_ENABLE 4871#if EV_CLEANUP_ENABLE
4868void 4872void
4869ev_cleanup_start (EV_P_ ev_cleanup *w) EV_THROW 4873ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT
4870{ 4874{
4871 if (expect_false (ev_is_active (w))) 4875 if (expect_false (ev_is_active (w)))
4872 return; 4876 return;
4873 4877
4874 EV_FREQUENT_CHECK; 4878 EV_FREQUENT_CHECK;
4881 ev_unref (EV_A); 4885 ev_unref (EV_A);
4882 EV_FREQUENT_CHECK; 4886 EV_FREQUENT_CHECK;
4883} 4887}
4884 4888
4885void 4889void
4886ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_THROW 4890ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT
4887{ 4891{
4888 clear_pending (EV_A_ (W)w); 4892 clear_pending (EV_A_ (W)w);
4889 if (expect_false (!ev_is_active (w))) 4893 if (expect_false (!ev_is_active (w)))
4890 return; 4894 return;
4891 4895
4905} 4909}
4906#endif 4910#endif
4907 4911
4908#if EV_ASYNC_ENABLE 4912#if EV_ASYNC_ENABLE
4909void 4913void
4910ev_async_start (EV_P_ ev_async *w) EV_THROW 4914ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT
4911{ 4915{
4912 if (expect_false (ev_is_active (w))) 4916 if (expect_false (ev_is_active (w)))
4913 return; 4917 return;
4914 4918
4915 w->sent = 0; 4919 w->sent = 0;
4924 4928
4925 EV_FREQUENT_CHECK; 4929 EV_FREQUENT_CHECK;
4926} 4930}
4927 4931
4928void 4932void
4929ev_async_stop (EV_P_ ev_async *w) EV_THROW 4933ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT
4930{ 4934{
4931 clear_pending (EV_A_ (W)w); 4935 clear_pending (EV_A_ (W)w);
4932 if (expect_false (!ev_is_active (w))) 4936 if (expect_false (!ev_is_active (w)))
4933 return; 4937 return;
4934 4938
4945 4949
4946 EV_FREQUENT_CHECK; 4950 EV_FREQUENT_CHECK;
4947} 4951}
4948 4952
4949void 4953void
4950ev_async_send (EV_P_ ev_async *w) EV_THROW 4954ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT
4951{ 4955{
4952 w->sent = 1; 4956 w->sent = 1;
4953 evpipe_write (EV_A_ &async_pending); 4957 evpipe_write (EV_A_ &async_pending);
4954} 4958}
4955#endif 4959#endif
4992 4996
4993 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));
4994} 4998}
4995 4999
4996void 5000void
4997ev_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
4998{ 5002{
4999 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));
5000 5004
5001 if (expect_false (!once)) 5005 if (expect_false (!once))
5002 { 5006 {
5025/*****************************************************************************/ 5029/*****************************************************************************/
5026 5030
5027#if EV_WALK_ENABLE 5031#if EV_WALK_ENABLE
5028ecb_cold 5032ecb_cold
5029void 5033void
5030ev_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
5031{ 5035{
5032 int i, j; 5036 int i, j;
5033 ev_watcher_list *wl, *wn; 5037 ev_watcher_list *wl, *wn;
5034 5038
5035 if (types & (EV_IO | EV_EMBED)) 5039 if (types & (EV_IO | EV_EMBED))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines