signal handler priority issue

Sean McNeil sean at mcneil.com
Fri Jun 11 08:09:13 GMT 2004


OOOPPPSSS!!!! typo. Ignore.

On Fri, 2004-06-11 at 01:04, Sean McNeil wrote:
> Variation that doesn't work:
> 
> /*
>  * test_sr.c
>  *
>  * Demonstrate use of signals & semaphores for suspending and
>  * resuming threads.
>  */
> #include <errno.h>
> #include <pthread.h>
> #include <semaphore.h>
> #include <signal.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <ucontext.h>
> #include <unistd.h>
> 
> #ifndef NUM_THREADS
> #define NUM_THREADS     5
> #endif
> 
> static sem_t            semaphore;
> static int              done = 0;
> static pthread_t        tids[NUM_THREADS];
> 
> 
> static void
> errno_abort(char *msg)
> {
>         printf("%s, errno %d\n", msg, errno);
>         abort();
> }
> 
> static void
> err_abort(int status, char *msg)
> {
>         printf("%s, status %d\n", msg, status);
>         abort();
> }
> 
> static void
> sighandler1(int sig, siginfo_t *info, ucontext_t *ucp)
> {
>         sigset_t mask;
> 
> 	printf("Thread %p pausing.\n", pthread_self());
> 	sigfillset(&mask);
> 	sigdelset(&mask, SIGUSR2);
> 	sem_post(&semaphore);
> 	sigsuspend(&mask);
> 	printf("Thread %p successfully resumed.\n", pthread_self());
> }
> 
> static void
> sighandler2(int sig, siginfo_t *info, ucontext_t *ucp)
> {
>     printf("Thread %p got resume signal.\n", pthread_self());
> }
> 
> /*
>  * Thread start routine to wait on a semaphore.
>  */
> static void *
> worker(void *arg)
> {
>         int num = (int)arg;
>         int x;
> 
>         num = (int)arg;
>         x = num * 10;
> 
>         printf ("Thread %d starting.\n", num);
>         while (!done) {
>                 x = x + 1;
>                 x = x - 1;
>         }
>         printf("Thread %d stopping.\n", num);
> 
>         return (NULL);
> }
> 
> static void
> pause_threads(void)
> {
>         int i;
> 
>         printf("Master: pausing all threads.\n");
>         for (i = 0; i < NUM_THREADS; i++) {
>                 pthread_kill(tids[i], SIGUSR1);
>                 if (sem_wait(&semaphore) == -1)
>                         errno_abort("Wait on semaphore");
>         }
> }
> 
> static void
> resume_threads(void)
> {
>         int i;
> 
>         printf("Master: resuming all threads.\n");
>         for (i = 0; i < NUM_THREADS; i++) {
>                 pthread_kill(tids[i], SIGUSR2);
>         }
> }
> 
> int
> main(int argc, char *argv[])
> {
>         struct sigaction act;
>         int status;
>         int i;
> 
>         if (sem_init (&semaphore, 0, 0) == -1)
>                 errno_abort ("Init semaphore");
> 
>         /* Mask all signals while in the signal handler. */
>         sigfillset(&act.sa_mask);
>         act.sa_flags = SA_RESTART;
> 
>         act.sa_handler = sighandler1;
>         sigaction(SIGUSR1, &act, NULL);
> 
>         act.sa_handler = sighandler1;
>         sigaction(SIGUSR2, &act, NULL);
> 
>         /*
>          * Create some worker threads.
>          */
>         for (i = 0; i < NUM_THREADS; i++) {
>                 status = pthread_create(&tids[i], NULL, worker, (void *)i);
>                 if (status != 0)
>                         err_abort (status, "Create thread");
>         }
> 
>         sleep (1);
> 
>         for (i = 0; i < 5; i++) {
>                 pause_threads();
>                 resume_threads();
>         }
> 
>         done = 1;
> 
>         /*
>          * Wait for all threads to complete.
>          */
>         for (i = 0; i < NUM_THREADS; i++) {
>                 status = pthread_join(tids[i], NULL);
>                 if (status != 0)
>                         err_abort(status, "Join thread");
>         }
>         return (0);
> }
> 
> 
> 



More information about the freebsd-threads mailing list