Lines Matching refs:base
135 gettime(struct event_base *base, struct timeval *tp)
137 if (base->tv_cache.tv_sec) {
138 *tp = base->tv_cache;
161 struct event_base *base = event_base_new();
163 if (base != NULL)
164 current_base = base;
166 return (base);
173 struct event_base *base;
175 if ((base = calloc(1, sizeof(struct event_base))) == NULL)
179 gettime(base, &base->event_tv);
181 min_heap_ctor(&base->timeheap);
182 TAILQ_INIT(&base->eventqueue);
183 base->sig.ev_signal_pair[0] = -1;
184 base->sig.ev_signal_pair[1] = -1;
186 base->evbase = NULL;
187 for (i = 0; eventops[i] && !base->evbase; i++) {
188 base->evsel = eventops[i];
190 base->evbase = base->evsel->init(base);
193 if (base->evbase == NULL)
198 base->evsel->name);
201 event_base_priority_init(base, 1);
203 return (base);
207 event_base_free(struct event_base *base)
212 if (base == NULL && current_base)
213 base = current_base;
214 if (base == current_base)
218 assert(base);
220 for (ev = TAILQ_FIRST(&base->eventqueue); ev; ) {
228 while ((ev = min_heap_top(&base->timeheap)) != NULL) {
233 for (i = 0; i < base->nactivequeues; ++i) {
234 for (ev = TAILQ_FIRST(base->activequeues[i]); ev; ) {
245 event_debug(("%s: %d events were still set in base",
248 if (base->evsel->dealloc != NULL)
249 base->evsel->dealloc(base, base->evbase);
251 for (i = 0; i < base->nactivequeues; ++i)
252 assert(TAILQ_EMPTY(base->activequeues[i]));
254 assert(min_heap_empty(&base->timeheap));
255 min_heap_dtor(&base->timeheap);
257 for (i = 0; i < base->nactivequeues; ++i)
258 free(base->activequeues[i]);
259 free(base->activequeues);
261 assert(TAILQ_EMPTY(&base->eventqueue));
263 free(base);
266 /* reinitialized the event base after a fork */
268 event_reinit(struct event_base *base)
270 const struct eventop *evsel = base->evsel;
271 void *evbase = base->evbase;
280 if (base->sig.ev_signal_added) {
281 /* we cannot call event_del here because the base has
283 event_queue_remove(base, &base->sig.ev_signal,
285 if (base->sig.ev_signal.ev_flags & EVLIST_ACTIVE)
286 event_queue_remove(base, &base->sig.ev_signal,
288 base->sig.ev_signal_added = 0;
291 if (base->evsel->dealloc != NULL)
292 base->evsel->dealloc(base, base->evbase);
293 evbase = base->evbase = evsel->init(base);
294 if (base->evbase == NULL)
298 TAILQ_FOREACH(ev, &base->eventqueue, ev_next) {
313 event_base_priority_init(struct event_base *base, int npriorities)
317 if (base->event_count_active)
320 if (base->nactivequeues && npriorities != base->nactivequeues) {
321 for (i = 0; i < base->nactivequeues; ++i) {
322 free(base->activequeues[i]);
324 free(base->activequeues);
328 base->nactivequeues = npriorities;
329 base->activequeues = (struct event_list **)
330 calloc(base->nactivequeues, sizeof(struct event_list *));
331 if (base->activequeues == NULL)
334 for (i = 0; i < base->nactivequeues; ++i) {
335 base->activequeues[i] = malloc(sizeof(struct event_list));
336 if (base->activequeues[i] == NULL)
338 TAILQ_INIT(base->activequeues[i]);
345 event_haveevents(struct event_base *base)
347 return (base->event_count > 0);
357 event_process_active(struct event_base *base)
364 for (i = 0; i < base->nactivequeues; ++i) {
365 if (TAILQ_FIRST(base->activequeues[i]) != NULL) {
366 activeq = base->activequeues[i];
375 event_queue_remove(base, ev, EVLIST_ACTIVE);
386 if (base->event_break)
409 event_base_get_method(struct event_base *base)
411 assert(base);
412 return (base->evsel->name);
418 struct event_base *base = arg;
419 base->event_gotterm = 1;
465 event_base_loop(struct event_base *base, int flags)
467 const struct eventop *evsel = base->evsel;
468 void *evbase = base->evbase;
474 base->tv_cache.tv_sec = 0;
476 if (base->sig.ev_signal_added)
477 evsignal_base = base;
481 if (base->event_gotterm) {
482 base->event_gotterm = 0;
486 if (base->event_break) {
487 base->event_break = 0;
491 timeout_correct(base, &tv);
494 if (!base->event_count_active && !(flags & EVLOOP_NONBLOCK)) {
495 timeout_next(base, &tv_p);
505 if (!event_haveevents(base)) {
511 gettime(base, &base->event_tv);
514 base->tv_cache.tv_sec = 0;
516 res = evsel->dispatch(base, evbase, tv_p);
520 gettime(base, &base->tv_cache);
522 timeout_process(base);
524 if (base->event_count_active) {
525 event_process_active(base);
526 if (!base->event_count_active && (flags & EVLOOP_ONCE))
533 base->tv_cache.tv_sec = 0;
569 event_base_once(struct event_base *base, int fd, short events,
603 res = event_base_set(base, &eonce->ev);
618 /* Take the current base - caller needs to set the real base later */
638 event_base_set(struct event_base *base, struct event *ev)
640 /* Only innocent events may be assigned to a different base */
644 ev->ev_base = base;
645 ev->ev_pri = base->nactivequeues/2;
702 struct event_base *base = ev->ev_base;
703 const struct eventop *evsel = base->evsel;
704 void *evbase = base->evbase;
722 if (min_heap_reserve(&base->timeheap,
723 1 + min_heap_size(&base->timeheap)) == -1)
731 base, ev, EVLIST_INSERTED);
746 event_queue_remove(base, ev, EVLIST_TIMEOUT);
761 event_queue_remove(base, ev, EVLIST_ACTIVE);
764 gettime(base, &now);
771 event_queue_insert(base, ev, EVLIST_TIMEOUT);
780 struct event_base *base;
787 /* An event without a base has not been added */
791 base = ev->ev_base;
792 evsel = base->evsel;
793 evbase = base->evbase;
804 event_queue_remove(base, ev, EVLIST_TIMEOUT);
807 event_queue_remove(base, ev, EVLIST_ACTIVE);
810 event_queue_remove(base, ev, EVLIST_INSERTED);
833 timeout_next(struct event_base *base, struct timeval **tv_p)
839 if ((ev = min_heap_top(&base->timeheap)) == NULL) {
845 if (gettime(base, &now) == -1)
869 timeout_correct(struct event_base *base, struct timeval *tv)
879 gettime(base, tv);
880 if (evutil_timercmp(tv, &base->event_tv, >=)) {
881 base->event_tv = *tv;
887 evutil_timersub(&base->event_tv, tv, &off);
893 pev = base->timeheap.p;
894 size = base->timeheap.n;
900 base->event_tv = *tv;
904 timeout_process(struct event_base *base)
909 if (min_heap_empty(&base->timeheap))
912 gettime(base, &now);
914 while ((ev = min_heap_top(&base->timeheap))) {
928 event_queue_remove(struct event_base *base, struct event *ev, int queue)
935 base->event_count--;
940 TAILQ_REMOVE(&base->eventqueue, ev, ev_next);
943 base->event_count_active--;
944 TAILQ_REMOVE(base->activequeues[ev->ev_pri],
948 min_heap_erase(&base->timeheap, ev);
956 event_queue_insert(struct event_base *base, struct event *ev, int queue)
968 base->event_count++;
973 TAILQ_INSERT_TAIL(&base->eventqueue, ev, ev_next);
976 base->event_count_active++;
977 TAILQ_INSERT_TAIL(base->activequeues[ev->ev_pri],
981 min_heap_push(&base->timeheap, ev);