Use kill() over raise() for raising the signal (fixes osx 10.14 with kqueue)

On OSX 10.14+ the raise() uses pthread_kill() (verified with dtruss) and
by some reason signals that has been raised with pthread_kill() do not
received by kqueue EVFILT_SIGNAL.

While on OSX 10.11 the raise()/pthread_kill() uses plain kill() and
everything work just fine (linux also does the same, but instead of
kill() it uses tgkill())

Here is a simple reproducer that installs alarm to show that the signal
does not received by the kqueue backend:
  https://gist.github.com/azat/73638b8e3b0fa563a20dadcca9e652a1

Refs: #747
Fixes: #765
This commit is contained in:
Azat Khuzhin 2019-02-24 17:07:18 +03:00
parent 8d5b14d428
commit 728c5dc11f
No known key found for this signature in database
GPG Key ID: B86086848EF8686D

View File

@ -928,8 +928,8 @@ test_fork(void)
evsignal_set(&usr_ev, SIGUSR1, fork_signal_cb, &usr_ev);
evsignal_add(&usr_ev, NULL);
raise(SIGUSR1);
raise(SIGUSR2);
kill(getpid(), SIGUSR1);
kill(getpid(), SIGUSR2);
called = 0;
@ -962,8 +962,8 @@ test_fork(void)
evsignal_set(&usr_ev, SIGUSR1, fork_signal_cb, &usr_ev);
evsignal_add(&usr_ev, NULL);
raise(SIGUSR1);
raise(SIGUSR2);
kill(getpid(), SIGUSR1);
kill(getpid(), SIGUSR2);
event_dispatch();
@ -1165,7 +1165,7 @@ test_immediatesignal(void)
test_ok = 0;
evsignal_set(&ev, SIGUSR1, signal_cb, &ev);
evsignal_add(&ev, NULL);
raise(SIGUSR1);
kill(getpid(), SIGUSR1);
event_loop(EVLOOP_NONBLOCK);
evsignal_del(&ev);
cleanup_test();
@ -1238,7 +1238,7 @@ test_signal_switchbase(void)
test_ok = 0;
/* can handle signal before loop is called */
raise(SIGUSR1);
kill(getpid(), SIGUSR1);
event_base_loop(base2, EVLOOP_NONBLOCK);
if (is_kqueue) {
if (!test_ok)
@ -1251,7 +1251,7 @@ test_signal_switchbase(void)
/* set base1 to handle signals */
event_base_loop(base1, EVLOOP_NONBLOCK);
raise(SIGUSR1);
kill(getpid(), SIGUSR1);
event_base_loop(base1, EVLOOP_NONBLOCK);
event_base_loop(base2, EVLOOP_NONBLOCK);
}
@ -1280,7 +1280,7 @@ test_signal_assert(void)
*/
evsignal_del(&ev);
raise(SIGCONT);
kill(getpid(), SIGCONT);
#if 0
/* only way to verify we were in evsig_handler() */
/* XXXX Now there's no longer a good way. */
@ -1324,7 +1324,7 @@ test_signal_restore(void)
evsignal_add(&ev, NULL);
evsignal_del(&ev);
raise(SIGUSR1);
kill(getpid(), SIGUSR1);
/* 1 == signal_cb, 2 == signal_cb_sa, we want our previous handler */
if (test_ok != 2)
test_ok = 0;
@ -1339,7 +1339,7 @@ signal_cb_swp(int sig, short event, void *arg)
{
called++;
if (called < 5)
raise(sig);
kill(getpid(), sig);
else
event_loopexit(NULL);
}
@ -1351,7 +1351,7 @@ timeout_cb_swp(evutil_socket_t fd, short event, void *arg)
called = 0;
evtimer_add((struct event *)arg, &tv);
raise(SIGUSR1);
kill(getpid(), SIGUSR1);
return;
}
test_ok = 0;