Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(476)

Side by Side Diff: third_party/libevent/event.c

Issue 412006: posix: upgrade libevent from 1.4.7 to 1.4.13 (Closed)
Patch Set: better readme Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2000-2004 Niels Provos <provos@citi.umich.edu> 2 * Copyright (c) 2000-2004 Niels Provos <provos@citi.umich.edu>
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 19 matching lines...) Expand all
30 30
31 #ifdef WIN32 31 #ifdef WIN32
32 #define WIN32_LEAN_AND_MEAN 32 #define WIN32_LEAN_AND_MEAN
33 #include <windows.h> 33 #include <windows.h>
34 #undef WIN32_LEAN_AND_MEAN 34 #undef WIN32_LEAN_AND_MEAN
35 #endif 35 #endif
36 #include <sys/types.h> 36 #include <sys/types.h>
37 #ifdef HAVE_SYS_TIME_H 37 #ifdef HAVE_SYS_TIME_H
38 #include <sys/time.h> 38 #include <sys/time.h>
39 #else 39 #else
40 #include <sys/_time.h> 40 #include <sys/_libevent_time.h>
41 #endif 41 #endif
42 #include <sys/queue.h> 42 #include <sys/queue.h>
43 #include <stdio.h> 43 #include <stdio.h>
44 #include <stdlib.h> 44 #include <stdlib.h>
45 #ifndef WIN32 45 #ifndef WIN32
46 #include <unistd.h> 46 #include <unistd.h>
47 #endif 47 #endif
48 #include <errno.h> 48 #include <errno.h>
49 #include <signal.h> 49 #include <signal.h>
50 #include <string.h> 50 #include <string.h>
(...skipping 21 matching lines...) Expand all
72 extern const struct eventop kqops; 72 extern const struct eventop kqops;
73 #endif 73 #endif
74 #ifdef HAVE_DEVPOLL 74 #ifdef HAVE_DEVPOLL
75 extern const struct eventop devpollops; 75 extern const struct eventop devpollops;
76 #endif 76 #endif
77 #ifdef WIN32 77 #ifdef WIN32
78 extern const struct eventop win32ops; 78 extern const struct eventop win32ops;
79 #endif 79 #endif
80 80
81 /* In order of preference */ 81 /* In order of preference */
82 const struct eventop *eventops[] = { 82 static const struct eventop *eventops[] = {
83 #ifdef HAVE_EVENT_PORTS 83 #ifdef HAVE_EVENT_PORTS
84 &evportops, 84 &evportops,
85 #endif 85 #endif
86 #ifdef HAVE_WORKING_KQUEUE 86 #ifdef HAVE_WORKING_KQUEUE
87 &kqops, 87 &kqops,
88 #endif 88 #endif
89 #ifdef HAVE_EPOLL 89 #ifdef HAVE_EPOLL
90 &epollops, 90 &epollops,
91 #endif 91 #endif
92 #ifdef HAVE_DEVPOLL 92 #ifdef HAVE_DEVPOLL
93 &devpollops, 93 &devpollops,
94 #endif 94 #endif
95 #ifdef HAVE_POLL 95 #ifdef HAVE_POLL
96 &pollops, 96 &pollops,
97 #endif 97 #endif
98 #ifdef HAVE_SELECT 98 #ifdef HAVE_SELECT
99 &selectops, 99 &selectops,
100 #endif 100 #endif
101 #ifdef WIN32 101 #ifdef WIN32
102 &win32ops, 102 &win32ops,
103 #endif 103 #endif
104 NULL 104 NULL
105 }; 105 };
106 106
107 /* Global state */ 107 /* Global state */
108 struct event_base *current_base = NULL; 108 struct event_base *current_base = NULL;
109 extern struct event_base *evsignal_base; 109 extern struct event_base *evsignal_base;
110 static int use_monotonic; 110 static int use_monotonic;
111 static int use_monotonic_initialized;
112 111
113 /* Prototypes */ 112 /* Prototypes */
114 static void event_queue_insert(struct event_base *, struct event *, int); 113 static void event_queue_insert(struct event_base *, struct event *, int);
115 static void event_queue_remove(struct event_base *, struct event *, int); 114 static void event_queue_remove(struct event_base *, struct event *, int);
116 static int event_haveevents(struct event_base *); 115 static int event_haveevents(struct event_base *);
117 116
118 static void event_process_active(struct event_base *); 117 static void event_process_active(struct event_base *);
119 118
120 static int timeout_next(struct event_base *, struct timeval **); 119 static int timeout_next(struct event_base *, struct timeval **);
121 static void timeout_process(struct event_base *); 120 static void timeout_process(struct event_base *);
122 static void timeout_correct(struct event_base *, struct timeval *); 121 static void timeout_correct(struct event_base *, struct timeval *);
123 122
124 static void 123 static void
125 detect_monotonic(void) 124 detect_monotonic(void)
126 { 125 {
127 #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) 126 #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
128 if (use_monotonic_initialized)
129 return;
130
131 struct timespec ts; 127 struct timespec ts;
132 128
133 if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) 129 if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0)
134 use_monotonic = 1; 130 use_monotonic = 1;
135 use_monotonic_initialized = 1;
136 #endif 131 #endif
137 } 132 }
138 133
139 static int 134 static int
140 gettime(struct event_base *base, struct timeval *tp) 135 gettime(struct event_base *base, struct timeval *tp)
141 { 136 {
142 if (base->tv_cache.tv_sec) { 137 if (base->tv_cache.tv_sec) {
143 *tp = base->tv_cache; 138 *tp = base->tv_cache;
144 return (0); 139 return (0);
145 } 140 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 base->evbase = NULL; 186 base->evbase = NULL;
192 for (i = 0; eventops[i] && !base->evbase; i++) { 187 for (i = 0; eventops[i] && !base->evbase; i++) {
193 base->evsel = eventops[i]; 188 base->evsel = eventops[i];
194 189
195 base->evbase = base->evsel->init(base); 190 base->evbase = base->evsel->init(base);
196 } 191 }
197 192
198 if (base->evbase == NULL) 193 if (base->evbase == NULL)
199 event_errx(1, "%s: no event mechanism available", __func__); 194 event_errx(1, "%s: no event mechanism available", __func__);
200 195
201 » if (getenv("EVENT_SHOW_METHOD")) 196 » if (evutil_getenv("EVENT_SHOW_METHOD"))
202 event_msgx("libevent using: %s\n", 197 event_msgx("libevent using: %s\n",
203 base->evsel->name); 198 base->evsel->name);
204 199
205 /* allocate a single active event queue */ 200 /* allocate a single active event queue */
206 event_base_priority_init(base, 1); 201 event_base_priority_init(base, 1);
207 202
208 return (base); 203 return (base);
209 } 204 }
210 205
211 void 206 void
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 void *evbase = base->evbase; 271 void *evbase = base->evbase;
277 int res = 0; 272 int res = 0;
278 struct event *ev; 273 struct event *ev;
279 274
280 /* check if this event mechanism requires reinit */ 275 /* check if this event mechanism requires reinit */
281 if (!evsel->need_reinit) 276 if (!evsel->need_reinit)
282 return (0); 277 return (0);
283 278
284 /* prevent internal delete */ 279 /* prevent internal delete */
285 if (base->sig.ev_signal_added) { 280 if (base->sig.ev_signal_added) {
281 /* we cannot call event_del here because the base has
282 * not been reinitialized yet. */
286 event_queue_remove(base, &base->sig.ev_signal, 283 event_queue_remove(base, &base->sig.ev_signal,
287 EVLIST_INSERTED); 284 EVLIST_INSERTED);
285 if (base->sig.ev_signal.ev_flags & EVLIST_ACTIVE)
286 event_queue_remove(base, &base->sig.ev_signal,
287 EVLIST_ACTIVE);
288 base->sig.ev_signal_added = 0; 288 base->sig.ev_signal_added = 0;
289 } 289 }
290 290
291 if (base->evsel->dealloc != NULL) 291 if (base->evsel->dealloc != NULL)
292 base->evsel->dealloc(base, base->evbase); 292 base->evsel->dealloc(base, base->evbase);
293 evbase = base->evbase = evsel->init(base); 293 evbase = base->evbase = evsel->init(base);
294 if (base->evbase == NULL) 294 if (base->evbase == NULL)
295 event_errx(1, "%s: could not reinitialize event mechanism", 295 event_errx(1, "%s: could not reinitialize event mechanism",
296 __func__); 296 __func__);
297 297
(...skipping 21 matching lines...) Expand all
319 319
320 if (base->nactivequeues && npriorities != base->nactivequeues) { 320 if (base->nactivequeues && npriorities != base->nactivequeues) {
321 for (i = 0; i < base->nactivequeues; ++i) { 321 for (i = 0; i < base->nactivequeues; ++i) {
322 free(base->activequeues[i]); 322 free(base->activequeues[i]);
323 } 323 }
324 free(base->activequeues); 324 free(base->activequeues);
325 } 325 }
326 326
327 /* Allocate our priority queues */ 327 /* Allocate our priority queues */
328 base->nactivequeues = npriorities; 328 base->nactivequeues = npriorities;
329 » base->activequeues = (struct event_list **)calloc(base->nactivequeues, 329 » base->activequeues = (struct event_list **)
330 » npriorities * sizeof(struct event_list *)); 330 » calloc(base->nactivequeues, sizeof(struct event_list *));
331 if (base->activequeues == NULL) 331 if (base->activequeues == NULL)
332 event_err(1, "%s: calloc", __func__); 332 event_err(1, "%s: calloc", __func__);
333 333
334 for (i = 0; i < base->nactivequeues; ++i) { 334 for (i = 0; i < base->nactivequeues; ++i) {
335 base->activequeues[i] = malloc(sizeof(struct event_list)); 335 base->activequeues[i] = malloc(sizeof(struct event_list));
336 if (base->activequeues[i] == NULL) 336 if (base->activequeues[i] == NULL)
337 event_err(1, "%s: malloc", __func__); 337 event_err(1, "%s: malloc", __func__);
338 TAILQ_INIT(base->activequeues[i]); 338 TAILQ_INIT(base->activequeues[i]);
339 } 339 }
340 340
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 463
464 int 464 int
465 event_base_loop(struct event_base *base, int flags) 465 event_base_loop(struct event_base *base, int flags)
466 { 466 {
467 const struct eventop *evsel = base->evsel; 467 const struct eventop *evsel = base->evsel;
468 void *evbase = base->evbase; 468 void *evbase = base->evbase;
469 struct timeval tv; 469 struct timeval tv;
470 struct timeval *tv_p; 470 struct timeval *tv_p;
471 int res, done; 471 int res, done;
472 472
473 /* clear time cache */
474 base->tv_cache.tv_sec = 0;
475
473 if (base->sig.ev_signal_added) 476 if (base->sig.ev_signal_added)
474 evsignal_base = base; 477 evsignal_base = base;
475 done = 0; 478 done = 0;
476 while (!done) { 479 while (!done) {
477 /* Terminate the loop if we have been asked to */ 480 /* Terminate the loop if we have been asked to */
478 if (base->event_gotterm) { 481 if (base->event_gotterm) {
479 base->event_gotterm = 0; 482 base->event_gotterm = 0;
480 break; 483 break;
481 } 484 }
482 485
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 timeout_process(base); 522 timeout_process(base);
520 523
521 if (base->event_count_active) { 524 if (base->event_count_active) {
522 event_process_active(base); 525 event_process_active(base);
523 if (!base->event_count_active && (flags & EVLOOP_ONCE)) 526 if (!base->event_count_active && (flags & EVLOOP_ONCE))
524 done = 1; 527 done = 1;
525 } else if (flags & EVLOOP_NONBLOCK) 528 } else if (flags & EVLOOP_NONBLOCK)
526 done = 1; 529 done = 1;
527 } 530 }
528 531
532 /* clear time cache */
533 base->tv_cache.tv_sec = 0;
534
529 event_debug(("%s: asked to terminate loop.", __func__)); 535 event_debug(("%s: asked to terminate loop.", __func__));
530 return (0); 536 return (0);
531 } 537 }
532 538
533 /* Sets up an event for processing once */ 539 /* Sets up an event for processing once */
534 540
535 struct event_once { 541 struct event_once {
536 struct event ev; 542 struct event ev;
537 543
538 void (*cb)(int, short, void *); 544 void (*cb)(int, short, void *);
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 gettime(base, &now); 764 gettime(base, &now);
759 evutil_timeradd(&now, tv, &ev->ev_timeout); 765 evutil_timeradd(&now, tv, &ev->ev_timeout);
760 766
761 event_debug(( 767 event_debug((
762 "event_add: timeout in %ld seconds, call %p", 768 "event_add: timeout in %ld seconds, call %p",
763 tv->tv_sec, ev->ev_callback)); 769 tv->tv_sec, ev->ev_callback));
764 770
765 event_queue_insert(base, ev, EVLIST_TIMEOUT); 771 event_queue_insert(base, ev, EVLIST_TIMEOUT);
766 } 772 }
767 773
768 » return (0); 774 » return (res);
769 } 775 }
770 776
771 int 777 int
772 event_del(struct event *ev) 778 event_del(struct event *ev)
773 { 779 {
774 struct event_base *base; 780 struct event_base *base;
775 const struct eventop *evsel; 781 const struct eventop *evsel;
776 void *evbase; 782 void *evbase;
777 783
778 event_debug(("event_del: %p, callback %p", 784 event_debug(("event_del: %p, callback %p",
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 /* 889 /*
884 * We can modify the key element of the node without destroying 890 * We can modify the key element of the node without destroying
885 * the key, beause we apply it to all in the right order. 891 * the key, beause we apply it to all in the right order.
886 */ 892 */
887 pev = base->timeheap.p; 893 pev = base->timeheap.p;
888 size = base->timeheap.n; 894 size = base->timeheap.n;
889 for (; size-- > 0; ++pev) { 895 for (; size-- > 0; ++pev) {
890 struct timeval *ev_tv = &(**pev).ev_timeout; 896 struct timeval *ev_tv = &(**pev).ev_timeout;
891 evutil_timersub(ev_tv, &off, ev_tv); 897 evutil_timersub(ev_tv, &off, ev_tv);
892 } 898 }
899 /* Now remember what the new time turned out to be. */
900 base->event_tv = *tv;
893 } 901 }
894 902
895 void 903 void
896 timeout_process(struct event_base *base) 904 timeout_process(struct event_base *base)
897 { 905 {
898 struct timeval now; 906 struct timeval now;
899 struct event *ev; 907 struct event *ev;
900 908
901 if (min_heap_empty(&base->timeheap)) 909 if (min_heap_empty(&base->timeheap))
902 return; 910 return;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 /* 997 /*
990 * No thread-safe interface needed - the information should be the same 998 * No thread-safe interface needed - the information should be the same
991 * for all threads. 999 * for all threads.
992 */ 1000 */
993 1001
994 const char * 1002 const char *
995 event_get_method(void) 1003 event_get_method(void)
996 { 1004 {
997 return (current_base->evsel->name); 1005 return (current_base->evsel->name);
998 } 1006 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698