Skip to content
This repository has been archived by the owner on May 4, 2018. It is now read-only.

Commit

Permalink
unix: support signal handlers outside the main loop
Browse files Browse the repository at this point in the history
  • Loading branch information
piscisaureus committed Oct 16, 2012
1 parent 39d574d commit 1e32cb0
Show file tree
Hide file tree
Showing 8 changed files with 639 additions and 166 deletions.
16 changes: 13 additions & 3 deletions include/uv-private/uv-unix.h
Expand Up @@ -156,7 +156,8 @@ typedef struct {
struct uv_timer_s* rbh_root; \ struct uv_timer_s* rbh_root; \
} timer_handles; \ } timer_handles; \
uint64_t time; \ uint64_t time; \
void* signal_ctx; \ int signal_pipefd[2]; \
uv__io_t signal_io_watcher; \
uv_signal_t child_watcher; \ uv_signal_t child_watcher; \
int emfile_fd; \ int emfile_fd; \
UV_PLATFORM_LOOP_FIELDS \ UV_PLATFORM_LOOP_FIELDS \
Expand Down Expand Up @@ -242,7 +243,7 @@ typedef struct {
ngx_queue_t queue; ngx_queue_t queue;


#define UV_TIMER_PRIVATE_FIELDS \ #define UV_TIMER_PRIVATE_FIELDS \
/* RB_ENTRY(uv_timer_s) node; */ \ /* RB_ENTRY(uv_timer_s) tree_entry; */ \
struct { \ struct { \
struct uv_timer_s* rbe_left; \ struct uv_timer_s* rbe_left; \
struct uv_timer_s* rbe_right; \ struct uv_timer_s* rbe_right; \
Expand Down Expand Up @@ -289,7 +290,16 @@ typedef struct {
int mode; int mode;


#define UV_SIGNAL_PRIVATE_FIELDS \ #define UV_SIGNAL_PRIVATE_FIELDS \
ngx_queue_t queue; /* RB_ENTRY(uv_signal_s) tree_entry; */ \
struct { \
struct uv_signal_s* rbe_left; \
struct uv_signal_s* rbe_right; \
struct uv_signal_s* rbe_parent; \
int rbe_color; \
} tree_entry; \
/* Use two counters here so we don have to fiddle with atomics. */ \
unsigned int caught_signals; \
unsigned int dispatched_signals;


#define UV_FS_EVENT_PRIVATE_FIELDS \ #define UV_FS_EVENT_PRIVATE_FIELDS \
uv_fs_event_cb cb; \ uv_fs_event_cb cb; \
Expand Down
6 changes: 4 additions & 2 deletions src/unix/core.c
Expand Up @@ -124,8 +124,10 @@ void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
break; break;


case UV_SIGNAL: case UV_SIGNAL:
uv__signal_close((uv_signal_t*)handle); uv__signal_close((uv_signal_t*) handle);
break; /* Signal handles may not be closed immediately. The signal code will */
/* itself close uv__make_close_pending whenever appropriate. */
return;


default: default:
assert(0); assert(0);
Expand Down
3 changes: 2 additions & 1 deletion src/unix/internal.h
Expand Up @@ -157,7 +157,8 @@ unsigned int uv__next_timeout(uv_loop_t* loop);


/* signal */ /* signal */
void uv__signal_close(uv_signal_t* handle); void uv__signal_close(uv_signal_t* handle);
void uv__signal_unregister(uv_loop_t* loop); void uv__signal_global_once_init(void);
void uv__signal_loop_cleanup();


/* thread pool */ /* thread pool */
void uv__work_submit(uv_loop_t* loop, void uv__work_submit(uv_loop_t* loop,
Expand Down
7 changes: 5 additions & 2 deletions src/unix/loop.c
Expand Up @@ -31,6 +31,8 @@ int uv__loop_init(uv_loop_t* loop, int default_loop) {
unsigned int i; unsigned int i;
int flags; int flags;


uv__signal_global_once_init();

#if HAVE_KQUEUE #if HAVE_KQUEUE
flags = EVBACKEND_KQUEUE; flags = EVBACKEND_KQUEUE;
#else #else
Expand All @@ -47,10 +49,11 @@ int uv__loop_init(uv_loop_t* loop, int default_loop) {
ngx_queue_init(&loop->prepare_handles); ngx_queue_init(&loop->prepare_handles);
ngx_queue_init(&loop->handle_queue); ngx_queue_init(&loop->handle_queue);
loop->closing_handles = NULL; loop->closing_handles = NULL;
loop->signal_ctx = NULL;
loop->time = uv_hrtime() / 1000000; loop->time = uv_hrtime() / 1000000;
loop->async_pipefd[0] = -1; loop->async_pipefd[0] = -1;
loop->async_pipefd[1] = -1; loop->async_pipefd[1] = -1;
loop->signal_pipefd[0] = -1;
loop->signal_pipefd[1] = -1;
loop->emfile_fd = -1; loop->emfile_fd = -1;
loop->ev = (default_loop ? ev_default_loop : ev_loop_new)(flags); loop->ev = (default_loop ? ev_default_loop : ev_loop_new)(flags);
ev_set_userdata(loop->ev, loop); ev_set_userdata(loop->ev, loop);
Expand Down Expand Up @@ -79,8 +82,8 @@ int uv__loop_init(uv_loop_t* loop, int default_loop) {




void uv__loop_delete(uv_loop_t* loop) { void uv__loop_delete(uv_loop_t* loop) {
uv__signal_loop_cleanup(loop);
uv__platform_loop_delete(loop); uv__platform_loop_delete(loop);
uv__signal_unregister(loop);
ev_loop_destroy(loop->ev); ev_loop_destroy(loop->ev);


if (loop->async_pipefd[0] != -1) { if (loop->async_pipefd[0] != -1) {
Expand Down

0 comments on commit 1e32cb0

Please sign in to comment.