@@ -120,6 +120,7 @@ struct eloop_timeout {
120120};
121121
122122struct eloop {
123+ TAILQ_ENTRY (eloop ) next ;
123124 TAILQ_HEAD (event_head , eloop_event ) events ;
124125 size_t nevents ;
125126 struct event_head free_events ;
@@ -152,6 +153,8 @@ struct eloop {
152153 bool events_invalid ;
153154};
154155
156+ TAILQ_HEAD (eloop_head , eloop ) eloops = TAILQ_HEAD_INITIALIZER (eloops );
157+
155158#ifdef HAVE_REALLOCARRAY
156159#define eloop_realloca reallocarray
157160#else
@@ -572,6 +575,17 @@ eloop_exit(struct eloop *eloop, int code)
572575 eloop -> exitnow = true;
573576}
574577
578+ void
579+ eloop_exitall (int code )
580+ {
581+ struct eloop * eloop ;
582+
583+ TAILQ_FOREACH (eloop , & eloops , next ) {
584+ eloop -> exitcode = code ;
585+ eloop -> exitnow = true;
586+ }
587+ }
588+
575589#if defined(USE_KQUEUE ) || defined(USE_EPOLL )
576590static int
577591eloop_open (struct eloop * eloop )
@@ -580,6 +594,8 @@ eloop_open(struct eloop *eloop)
580594
581595#if defined(HAVE_KQUEUE1 )
582596 fd = kqueue1 (O_CLOEXEC );
597+ #elif defined(KQUEUE_CLOEXEC )
598+ fd = kqueuex (KQUEUE_CLOEXEC );
583599#elif defined(USE_KQUEUE )
584600 int flags ;
585601
@@ -850,6 +866,7 @@ eloop_new(void)
850866 }
851867#endif
852868
869+ TAILQ_INSERT_TAIL (& eloops , eloop , next );
853870 return eloop ;
854871}
855872
@@ -886,6 +903,7 @@ eloop_free(struct eloop *eloop)
886903 close (eloop -> fd );
887904#endif
888905 free (eloop -> fds );
906+ TAILQ_REMOVE (& eloops , eloop , next );
889907 free (eloop );
890908}
891909
0 commit comments