Fix raise(3) so it works in signal handlers.
We could special-case raise(3) in non-threaded programs, but the more conservative course is to make pthread_kill(3) work in signal handlers at the cost of a race shared by other C libraries. Change-Id: I59fb23d03bdabf403435e731704b33acdf3e0234
This commit is contained in:
@@ -252,6 +252,24 @@ TEST(pthread, pthread_kill__invalid_signal) {
|
||||
ASSERT_EQ(EINVAL, pthread_kill(pthread_self(), -1));
|
||||
}
|
||||
|
||||
static void pthread_kill__in_signal_handler_helper(int signal_number) {
|
||||
static int count = 0;
|
||||
ASSERT_EQ(SIGALRM, signal_number);
|
||||
if (++count == 1) {
|
||||
// Can we call pthread_kill from a signal handler?
|
||||
ASSERT_EQ(0, pthread_kill(pthread_self(), SIGALRM));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(pthread, pthread_kill__in_signal_handler) {
|
||||
struct sigaction action;
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_flags = 0;
|
||||
action.sa_handler = pthread_kill__in_signal_handler_helper;
|
||||
sigaction(SIGALRM, &action, NULL);
|
||||
ASSERT_EQ(0, pthread_kill(pthread_self(), SIGALRM));
|
||||
}
|
||||
|
||||
TEST(pthread, pthread_detach__no_such_thread) {
|
||||
pthread_t dead_thread;
|
||||
MakeDeadThread(dead_thread);
|
||||
|
Reference in New Issue
Block a user