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

Comparing libev/ev.c (file contents):
Revision 1.432 by root, Mon May 14 19:09:58 2012 UTC vs.
Revision 1.436 by root, Tue May 29 20:44:39 2012 UTC

1105#endif 1105#endif
1106 1106
1107static void (*syserr_cb)(const char *msg) EV_THROW; 1107static void (*syserr_cb)(const char *msg) EV_THROW;
1108 1108
1109void ecb_cold 1109void ecb_cold
1110ev_set_syserr_cb (void (*cb)(const char *msg)) EV_THROW 1110ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW
1111{ 1111{
1112 syserr_cb = cb; 1112 syserr_cb = cb;
1113} 1113}
1114 1114
1115static void noinline ecb_cold 1115static void noinline ecb_cold
1133 abort (); 1133 abort ();
1134 } 1134 }
1135} 1135}
1136 1136
1137static void * 1137static void *
1138ev_realloc_emul (void *ptr, long size) 1138ev_realloc_emul (void *ptr, long size) EV_THROW
1139{ 1139{
1140#if __GLIBC__ 1140#if __GLIBC__
1141 return realloc (ptr, size); 1141 return realloc (ptr, size);
1142#else 1142#else
1143 /* some systems, notably openbsd and darwin, fail to properly 1143 /* some systems, notably openbsd and darwin, fail to properly
1154} 1154}
1155 1155
1156static void *(*alloc)(void *ptr, long size) EV_THROW = ev_realloc_emul; 1156static void *(*alloc)(void *ptr, long size) EV_THROW = ev_realloc_emul;
1157 1157
1158void ecb_cold 1158void ecb_cold
1159ev_set_allocator (void *(*cb)(void *ptr, long size)) EV_THROW 1159ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW
1160{ 1160{
1161 alloc = cb; 1161 alloc = cb;
1162} 1162}
1163 1163
1164inline_speed void * 1164inline_speed void *
1849 1849
1850 if (expect_true (*flag)) 1850 if (expect_true (*flag))
1851 return; 1851 return;
1852 1852
1853 *flag = 1; 1853 *flag = 1;
1854
1855 ECB_MEMORY_FENCE_RELEASE; /* make sure flag is visible before the wakeup */ 1854 ECB_MEMORY_FENCE_RELEASE; /* make sure flag is visible before the wakeup */
1856 1855
1857 pipe_write_skipped = 1; 1856 pipe_write_skipped = 1;
1858 1857
1859 ECB_MEMORY_FENCE; /* make sure pipe_write_skipped is visible before we check pipe_write_wanted */ 1858 ECB_MEMORY_FENCE; /* make sure pipe_write_skipped is visible before we check pipe_write_wanted */
1860 1859
1861 if (pipe_write_wanted) 1860 if (pipe_write_wanted)
1862 { 1861 {
1863 int old_errno; 1862 int old_errno;
1864 1863
1865 pipe_write_skipped = 0; /* just an optimisation, no fence needed */ 1864 pipe_write_skipped = 0;
1865 ECB_MEMORY_FENCE_RELEASE;
1866 1866
1867 old_errno = errno; /* save errno because write will clobber it */ 1867 old_errno = errno; /* save errno because write will clobber it */
1868 1868
1869#if EV_USE_EVENTFD 1869#if EV_USE_EVENTFD
1870 if (evfd >= 0) 1870 if (evfd >= 0)
1929#if EV_SIGNAL_ENABLE 1929#if EV_SIGNAL_ENABLE
1930 if (sig_pending) 1930 if (sig_pending)
1931 { 1931 {
1932 sig_pending = 0; 1932 sig_pending = 0;
1933 1933
1934 ECB_MEMORY_FENCE_RELEASE; 1934 ECB_MEMORY_FENCE;
1935 1935
1936 for (i = EV_NSIG - 1; i--; ) 1936 for (i = EV_NSIG - 1; i--; )
1937 if (expect_false (signals [i].pending)) 1937 if (expect_false (signals [i].pending))
1938 ev_feed_signal_event (EV_A_ i + 1); 1938 ev_feed_signal_event (EV_A_ i + 1);
1939 } 1939 }
1942#if EV_ASYNC_ENABLE 1942#if EV_ASYNC_ENABLE
1943 if (async_pending) 1943 if (async_pending)
1944 { 1944 {
1945 async_pending = 0; 1945 async_pending = 0;
1946 1946
1947 ECB_MEMORY_FENCE_RELEASE; 1947 ECB_MEMORY_FENCE;
1948 1948
1949 for (i = asynccnt; i--; ) 1949 for (i = asynccnt; i--; )
1950 if (asyncs [i]->sent) 1950 if (asyncs [i]->sent)
1951 { 1951 {
1952 asyncs [i]->sent = 0; 1952 asyncs [i]->sent = 0;
1953 ECB_MEMORY_FENCE_RELEASE;
1953 ev_feed_event (EV_A_ asyncs [i], EV_ASYNC); 1954 ev_feed_event (EV_A_ asyncs [i], EV_ASYNC);
1954 } 1955 }
1955 } 1956 }
1956#endif 1957#endif
1957} 1958}
2002 if (expect_false (signals [signum].loop != EV_A)) 2003 if (expect_false (signals [signum].loop != EV_A))
2003 return; 2004 return;
2004#endif 2005#endif
2005 2006
2006 signals [signum].pending = 0; 2007 signals [signum].pending = 0;
2008 MEMORY_FENCE_RELEASE;
2007 2009
2008 for (w = signals [signum].head; w; w = w->next) 2010 for (w = signals [signum].head; w; w = w->next)
2009 ev_feed_event (EV_A_ (W)w, EV_SIGNAL); 2011 ev_feed_event (EV_A_ (W)w, EV_SIGNAL);
2010} 2012}
2011 2013
2355 EV_INVOKE_PENDING; 2357 EV_INVOKE_PENDING;
2356 } 2358 }
2357#endif 2359#endif
2358 2360
2359#if EV_CHILD_ENABLE 2361#if EV_CHILD_ENABLE
2360 if (ev_is_active (&childev)) 2362 if (ev_is_default_loop (EV_A) && ev_is_active (&childev))
2361 { 2363 {
2362 ev_ref (EV_A); /* child watcher */ 2364 ev_ref (EV_A); /* child watcher */
2363 ev_signal_stop (EV_A_ &childev); 2365 ev_signal_stop (EV_A_ &childev);
2364 } 2366 }
2365#endif 2367#endif
2812{ 2814{
2813 EV_FREQUENT_CHECK; 2815 EV_FREQUENT_CHECK;
2814 2816
2815 while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now) 2817 while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now)
2816 { 2818 {
2817 int feed_count = 0;
2818
2819 do 2819 do
2820 { 2820 {
2821 ev_periodic *w = (ev_periodic *)ANHE_w (periodics [HEAP0]); 2821 ev_periodic *w = (ev_periodic *)ANHE_w (periodics [HEAP0]);
2822 2822
2823 /*assert (("libev: inactive timer on periodic heap detected", ev_is_active (w)));*/ 2823 /*assert (("libev: inactive timer on periodic heap detected", ev_is_active (w)));*/

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines