| OLD | NEW | 
|---|
| 1 /*      $OpenBSD: select.c,v 1.2 2002/06/25 15:50:15 mickey Exp $       */ | 1 /*      $OpenBSD: select.c,v 1.2 2002/06/25 15:50:15 mickey Exp $       */ | 
| 2 | 2 | 
| 3 /* | 3 /* | 
| 4  * Copyright 2000-2002 Niels Provos <provos@citi.umich.edu> | 4  * Copyright 2000-2002 Niels Provos <provos@citi.umich.edu> | 
| 5  * All rights reserved. | 5  * All rights reserved. | 
| 6  * | 6  * | 
| 7  * Redistribution and use in source and binary forms, with or without | 7  * Redistribution and use in source and binary forms, with or without | 
| 8  * modification, are permitted provided that the following conditions | 8  * modification, are permitted provided that the following conditions | 
| 9  * are met: | 9  * are met: | 
| 10  * 1. Redistributions of source code must retain the above copyright | 10  * 1. Redistributions of source code must retain the above copyright | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 64 #include "log.h" | 64 #include "log.h" | 
| 65 | 65 | 
| 66 struct event_base *evsignal_base = NULL; | 66 struct event_base *evsignal_base = NULL; | 
| 67 | 67 | 
| 68 static void evsignal_handler(int sig); | 68 static void evsignal_handler(int sig); | 
| 69 | 69 | 
| 70 /* Callback for when the signal handler write a byte to our signaling socket */ | 70 /* Callback for when the signal handler write a byte to our signaling socket */ | 
| 71 static void | 71 static void | 
| 72 evsignal_cb(int fd, short what, void *arg) | 72 evsignal_cb(int fd, short what, void *arg) | 
| 73 { | 73 { | 
| 74 »       static char signals[100]; | 74 »       static char signals[1]; | 
| 75 #ifdef WIN32 | 75 #ifdef WIN32 | 
| 76         SSIZE_T n; | 76         SSIZE_T n; | 
| 77 #else | 77 #else | 
| 78         ssize_t n; | 78         ssize_t n; | 
| 79 #endif | 79 #endif | 
| 80 | 80 | 
| 81         n = recv(fd, signals, sizeof(signals), 0); | 81         n = recv(fd, signals, sizeof(signals), 0); | 
| 82         if (n == -1) | 82         if (n == -1) | 
| 83                 event_err(1, "%s: read", __func__); | 83                 event_err(1, "%s: read", __func__); | 
| 84 } | 84 } | 
| 85 | 85 | 
| 86 #ifdef HAVE_SETFD | 86 #ifdef HAVE_SETFD | 
| 87 #define FD_CLOSEONEXEC(x) do { \ | 87 #define FD_CLOSEONEXEC(x) do { \ | 
| 88         if (fcntl(x, F_SETFD, 1) == -1) \ | 88         if (fcntl(x, F_SETFD, 1) == -1) \ | 
| 89                 event_warn("fcntl(%d, F_SETFD)", x); \ | 89                 event_warn("fcntl(%d, F_SETFD)", x); \ | 
| 90 } while (0) | 90 } while (0) | 
| 91 #else | 91 #else | 
| 92 #define FD_CLOSEONEXEC(x) | 92 #define FD_CLOSEONEXEC(x) | 
| 93 #endif | 93 #endif | 
| 94 | 94 | 
| 95 void | 95 int | 
| 96 evsignal_init(struct event_base *base) | 96 evsignal_init(struct event_base *base) | 
| 97 { | 97 { | 
| 98         int i; | 98         int i; | 
| 99 | 99 | 
| 100         /* | 100         /* | 
| 101          * Our signal handler is going to write to one end of the socket | 101          * Our signal handler is going to write to one end of the socket | 
| 102          * pair to wake up our event loop.  The event loop then scans for | 102          * pair to wake up our event loop.  The event loop then scans for | 
| 103          * signals that got delivered. | 103          * signals that got delivered. | 
| 104          */ | 104          */ | 
| 105         if (evutil_socketpair( | 105         if (evutil_socketpair( | 
| 106 »       »           AF_UNIX, SOCK_STREAM, 0, base->sig.ev_signal_pair) == -1) | 106 »       »           AF_UNIX, SOCK_STREAM, 0, base->sig.ev_signal_pair) == -1) { | 
|  | 107 #ifdef WIN32 | 
|  | 108 »       »       /* Make this nonfatal on win32, where sometimes people | 
|  | 109 »       »          have localhost firewalled. */ | 
|  | 110 »       »       event_warn("%s: socketpair", __func__); | 
|  | 111 #else | 
| 107                 event_err(1, "%s: socketpair", __func__); | 112                 event_err(1, "%s: socketpair", __func__); | 
|  | 113 #endif | 
|  | 114                 return -1; | 
|  | 115         } | 
| 108 | 116 | 
| 109         FD_CLOSEONEXEC(base->sig.ev_signal_pair[0]); | 117         FD_CLOSEONEXEC(base->sig.ev_signal_pair[0]); | 
| 110         FD_CLOSEONEXEC(base->sig.ev_signal_pair[1]); | 118         FD_CLOSEONEXEC(base->sig.ev_signal_pair[1]); | 
| 111         base->sig.sh_old = NULL; | 119         base->sig.sh_old = NULL; | 
| 112         base->sig.sh_old_max = 0; | 120         base->sig.sh_old_max = 0; | 
| 113         base->sig.evsignal_caught = 0; | 121         base->sig.evsignal_caught = 0; | 
| 114         memset(&base->sig.evsigcaught, 0, sizeof(sig_atomic_t)*NSIG); | 122         memset(&base->sig.evsigcaught, 0, sizeof(sig_atomic_t)*NSIG); | 
| 115         /* initialize the queues for all events */ | 123         /* initialize the queues for all events */ | 
| 116         for (i = 0; i < NSIG; ++i) | 124         for (i = 0; i < NSIG; ++i) | 
| 117                 TAILQ_INIT(&base->sig.evsigevents[i]); | 125                 TAILQ_INIT(&base->sig.evsigevents[i]); | 
| 118 | 126 | 
| 119         evutil_make_socket_nonblocking(base->sig.ev_signal_pair[0]); | 127         evutil_make_socket_nonblocking(base->sig.ev_signal_pair[0]); | 
| 120 | 128 | 
| 121         event_set(&base->sig.ev_signal, base->sig.ev_signal_pair[1], | 129         event_set(&base->sig.ev_signal, base->sig.ev_signal_pair[1], | 
| 122                 EV_READ | EV_PERSIST, evsignal_cb, &base->sig.ev_signal); | 130                 EV_READ | EV_PERSIST, evsignal_cb, &base->sig.ev_signal); | 
| 123         base->sig.ev_signal.ev_base = base; | 131         base->sig.ev_signal.ev_base = base; | 
| 124         base->sig.ev_signal.ev_flags |= EVLIST_INTERNAL; | 132         base->sig.ev_signal.ev_flags |= EVLIST_INTERNAL; | 
|  | 133 | 
|  | 134         return 0; | 
| 125 } | 135 } | 
| 126 | 136 | 
| 127 /* Helper: set the signal handler for evsignal to handler in base, so that | 137 /* Helper: set the signal handler for evsignal to handler in base, so that | 
| 128  * we can restore the original handler when we clear the current one. */ | 138  * we can restore the original handler when we clear the current one. */ | 
| 129 int | 139 int | 
| 130 _evsignal_set_handler(struct event_base *base, | 140 _evsignal_set_handler(struct event_base *base, | 
| 131                       int evsignal, void (*handler)(int)) | 141                       int evsignal, void (*handler)(int)) | 
| 132 { | 142 { | 
| 133 #ifdef HAVE_SIGACTION | 143 #ifdef HAVE_SIGACTION | 
| 134         struct sigaction sa; | 144         struct sigaction sa; | 
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 303         struct evsignal_info *sig = &base->sig; | 313         struct evsignal_info *sig = &base->sig; | 
| 304         struct event *ev, *next_ev; | 314         struct event *ev, *next_ev; | 
| 305         sig_atomic_t ncalls; | 315         sig_atomic_t ncalls; | 
| 306         int i; | 316         int i; | 
| 307 | 317 | 
| 308         base->sig.evsignal_caught = 0; | 318         base->sig.evsignal_caught = 0; | 
| 309         for (i = 1; i < NSIG; ++i) { | 319         for (i = 1; i < NSIG; ++i) { | 
| 310                 ncalls = sig->evsigcaught[i]; | 320                 ncalls = sig->evsigcaught[i]; | 
| 311                 if (ncalls == 0) | 321                 if (ncalls == 0) | 
| 312                         continue; | 322                         continue; | 
|  | 323                 sig->evsigcaught[i] -= ncalls; | 
| 313 | 324 | 
| 314                 for (ev = TAILQ_FIRST(&sig->evsigevents[i]); | 325                 for (ev = TAILQ_FIRST(&sig->evsigevents[i]); | 
| 315                     ev != NULL; ev = next_ev) { | 326                     ev != NULL; ev = next_ev) { | 
| 316                         next_ev = TAILQ_NEXT(ev, ev_signal_next); | 327                         next_ev = TAILQ_NEXT(ev, ev_signal_next); | 
| 317                         if (!(ev->ev_events & EV_PERSIST)) | 328                         if (!(ev->ev_events & EV_PERSIST)) | 
| 318                                 event_del(ev); | 329                                 event_del(ev); | 
| 319                         event_active(ev, EV_SIGNAL, ncalls); | 330                         event_active(ev, EV_SIGNAL, ncalls); | 
| 320                 } | 331                 } | 
| 321 | 332 | 
| 322                 sig->evsigcaught[i] = 0; |  | 
| 323         } | 333         } | 
| 324 } | 334 } | 
| 325 | 335 | 
| 326 void | 336 void | 
| 327 evsignal_dealloc(struct event_base *base) | 337 evsignal_dealloc(struct event_base *base) | 
| 328 { | 338 { | 
| 329         int i = 0; | 339         int i = 0; | 
| 330         if (base->sig.ev_signal_added) { | 340         if (base->sig.ev_signal_added) { | 
| 331                 event_del(&base->sig.ev_signal); | 341                 event_del(&base->sig.ev_signal); | 
| 332                 base->sig.ev_signal_added = 0; | 342                 base->sig.ev_signal_added = 0; | 
| 333         } | 343         } | 
| 334         for (i = 0; i < NSIG; ++i) { | 344         for (i = 0; i < NSIG; ++i) { | 
| 335                 if (i < base->sig.sh_old_max && base->sig.sh_old[i] != NULL) | 345                 if (i < base->sig.sh_old_max && base->sig.sh_old[i] != NULL) | 
| 336                         _evsignal_restore_handler(base, i); | 346                         _evsignal_restore_handler(base, i); | 
| 337         } | 347         } | 
| 338 | 348 | 
| 339         EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[0]); | 349         EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[0]); | 
| 340         base->sig.ev_signal_pair[0] = -1; | 350         base->sig.ev_signal_pair[0] = -1; | 
| 341         EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[1]); | 351         EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[1]); | 
| 342         base->sig.ev_signal_pair[1] = -1; | 352         base->sig.ev_signal_pair[1] = -1; | 
| 343         base->sig.sh_old_max = 0; | 353         base->sig.sh_old_max = 0; | 
| 344 | 354 | 
| 345         /* per index frees are handled in evsignal_del() */ | 355         /* per index frees are handled in evsignal_del() */ | 
| 346         free(base->sig.sh_old); | 356         free(base->sig.sh_old); | 
| 347 } | 357 } | 
| OLD | NEW | 
|---|