From owner-freebsd-threads@FreeBSD.ORG Fri Jun 11 08:09:13 2004 Return-Path: Delivered-To: freebsd-threads@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id AD0B316A4CE; Fri, 11 Jun 2004 08:09:13 +0000 (GMT) Received: from mail.mcneil.com (rrcs-west-24-199-45-54.biz.rr.com [24.199.45.54]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7D24243D5D; Fri, 11 Jun 2004 08:09:13 +0000 (GMT) (envelope-from sean@mcneil.com) Received: from localhost (localhost.mcneil.com [127.0.0.1]) by mail.mcneil.com (Postfix) with ESMTP id D25E8FD087; Fri, 11 Jun 2004 01:09:08 -0700 (PDT) Received: from mail.mcneil.com ([127.0.0.1]) by localhost (server.mcneil.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 28084-03; Fri, 11 Jun 2004 01:09:08 -0700 (PDT) Received: from [24.199.45.54] (mcneil.com [24.199.45.54]) by mail.mcneil.com (Postfix) with ESMTP id 28657FD075; Fri, 11 Jun 2004 01:09:08 -0700 (PDT) From: Sean McNeil To: Daniel Eischen In-Reply-To: <1086941096.10026.31.camel@server.mcneil.com> References: <1086941096.10026.31.camel@server.mcneil.com> Content-Type: text/plain Message-Id: <1086941347.10026.33.camel@server.mcneil.com> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 Date: Fri, 11 Jun 2004 01:09:07 -0700 Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at mcneil.com cc: David Xu cc: freebsd-threads@freebsd.org Subject: Re: signal handler priority issue X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Jun 2004 08:09:13 -0000 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 > #include > #include > #include > #include > #include > #include > #include > > #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); > } > > >