|  | #include <utest/utest.h> | 
|  | #include <pthread.h> | 
|  |  | 
|  | TEST_SUITE("SIGNALS"); | 
|  |  | 
|  | /* <--- Begin definition of test cases ---> */ | 
|  |  | 
|  | bool test_sigmask(void) | 
|  | { | 
|  | int count = 0; | 
|  | pthread_t sigphandle; | 
|  | void *thread_handler(void *arg) | 
|  | { | 
|  | sigset_t s; | 
|  | sigemptyset(&s); | 
|  | sigaddset(&s, SIGUSR2); | 
|  | pthread_sigmask(SIG_BLOCK, &s, NULL); | 
|  | for (int i=0; i<100000; i++) | 
|  | pthread_yield(); | 
|  | return 0; | 
|  | } | 
|  | void signal_handler(int signo) | 
|  | { | 
|  | sigphandle = pthread_self(); | 
|  | __sync_fetch_and_add(&count, 1); | 
|  | } | 
|  |  | 
|  | struct sigaction sigact = {.sa_handler = signal_handler, 0}; | 
|  | sigaction(SIGUSR1, &sigact, 0); | 
|  | sigaction(SIGUSR2, &sigact, 0); | 
|  |  | 
|  | pthread_t phandle; | 
|  | pthread_create(&phandle, NULL, thread_handler, NULL); | 
|  | for (int i=0; i<100; i++) | 
|  | pthread_yield(); | 
|  | pthread_kill(phandle, SIGUSR1); | 
|  | pthread_kill(phandle, SIGUSR2); | 
|  | pthread_join(phandle, NULL); | 
|  |  | 
|  | UT_ASSERT_M("Should only receive one signal", count == 1); | 
|  | UT_ASSERT_M("Signal handler run on wrong thread", sigphandle == | 
|  | phandle); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | /* <--- End definition of test cases ---> */ | 
|  |  | 
|  | struct utest utests[] = { | 
|  | UTEST_REG(sigmask), | 
|  | }; | 
|  | int num_utests = sizeof(utests) / sizeof(struct utest); | 
|  |  | 
|  | int main(int argc, char *argv[]) { | 
|  | char **whitelist = &argv[1]; | 
|  | int whitelist_len = argc - 1; | 
|  |  | 
|  | RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len); | 
|  | } | 
|  |  | 
|  |  |