… | |
… | |
323 | /*****************************************************************************/ |
323 | /*****************************************************************************/ |
324 | |
324 | |
325 | typedef struct |
325 | typedef struct |
326 | { |
326 | { |
327 | struct ev_signal *head; |
327 | struct ev_signal *head; |
328 | sig_atomic_t gotsig; |
328 | sig_atomic_t volatile gotsig; |
329 | } ANSIG; |
329 | } ANSIG; |
330 | |
330 | |
331 | static ANSIG *signals; |
331 | static ANSIG *signals; |
332 | static int signalmax; |
332 | static int signalmax; |
333 | |
333 | |
334 | static int sigpipe [2]; |
334 | static int sigpipe [2]; |
335 | static sig_atomic_t gotsig; |
335 | static sig_atomic_t volatile gotsig; |
336 | static struct ev_io sigev; |
336 | static struct ev_io sigev; |
337 | |
337 | |
338 | static void |
338 | static void |
339 | signals_init (ANSIG *base, int count) |
339 | signals_init (ANSIG *base, int count) |
340 | { |
340 | { |
… | |
… | |
353 | signals [signum - 1].gotsig = 1; |
353 | signals [signum - 1].gotsig = 1; |
354 | |
354 | |
355 | if (!gotsig) |
355 | if (!gotsig) |
356 | { |
356 | { |
357 | gotsig = 1; |
357 | gotsig = 1; |
358 | write (sigpipe [1], &gotsig, 1); |
358 | write (sigpipe [1], &signum, 1); |
359 | } |
359 | } |
360 | } |
360 | } |
361 | |
361 | |
362 | static void |
362 | static void |
363 | sigcb (struct ev_io *iow, int revents) |
363 | sigcb (struct ev_io *iow, int revents) |
364 | { |
364 | { |
365 | struct ev_signal *w; |
365 | struct ev_signal *w; |
366 | int sig; |
366 | int sig; |
367 | |
367 | |
|
|
368 | read (sigpipe [0], &revents, 1); |
368 | gotsig = 0; |
369 | gotsig = 0; |
369 | read (sigpipe [0], &revents, 1); |
|
|
370 | |
370 | |
371 | for (sig = signalmax; sig--; ) |
371 | for (sig = signalmax; sig--; ) |
372 | if (signals [sig].gotsig) |
372 | if (signals [sig].gotsig) |
373 | { |
373 | { |
374 | signals [sig].gotsig = 0; |
374 | signals [sig].gotsig = 0; |