From owner-freebsd-threads@FreeBSD.ORG Wed Feb 4 14:49:02 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 7449316A4CE; Wed, 4 Feb 2004 14:49:02 -0800 (PST) Received: from raven.ravenbrook.com (raven.ravenbrook.com [193.82.131.18]) by mx1.FreeBSD.org (Postfix) with ESMTP id 01FF143D41; Wed, 4 Feb 2004 14:48:59 -0800 (PST) (envelope-from nb@ravenbrook.com) Received: from thrush.ravenbrook.com (thrush.ravenbrook.com [193.112.141.145]) i14MmvWm068145; Wed, 4 Feb 2004 22:48:57 GMT (envelope-from nb@ravenbrook.com) Received: from thrush.ravenbrook.com (localhost [127.0.0.1]) by thrush.ravenbrook.com (8.12.9/8.12.9) with ESMTP id i14Mmulb058306; Wed, 4 Feb 2004 22:48:57 GMT (envelope-from nb@thrush.ravenbrook.com) From: Nick Barnes To: Daniel Eischen In-Reply-To: <200402041551.i14Fpr2m013525@freefall.freebsd.org> from Daniel Eischen of "Wed, 04 Feb 2004 07:51:53 -0800" X-Infosys-URL: ? Date: Wed, 04 Feb 2004 22:48:56 +0000 Message-ID: <58305.1075934936@thrush.ravenbrook.com> Sender: nb@ravenbrook.com cc: freebsd-threads@FreeBSD.org Subject: Re: bin/31661: pthread_kill signal handler doesn't get sigcontext or ucontext 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: Wed, 04 Feb 2004 22:49:02 -0000 At 2004-02-04 15:51:53+0000, Daniel Eischen writes: > Still it iw worth noting that trying to do anything sane with > a context from a pthread_kill() is probably not what you want > especially for scope process threads. Thanks for this note. FYI, using the context in a handler from a pthread_kill signal is standard practice for garbage collecting threaded applications: the threads need to be paused while their stacks and registers are scanned by the garbage collector; this is done by sending signals to each thread (apart from the GC thread). The signal handler saves the thread's context, notifies the GC thread, and then waits to be awoken (e.g. with sigsuspend). What memory management implementors would really like is for thread library implementors to abstract away the messy implementation details of this and to provide something like this: int pthread_suspend(pthread_t thread, ucontext_t *uap); int pthread_resume(pthread_t thread, ucontext_t *uap); I believe that various people argued for this when the pthreads standard was being put together. But it never happened, and we have been stuck with techniques such as the one I describe. I've implemented things like it for several different garbage collectors on a number of thread libraries, pthread and otherwise, on Windows (where there _is_ SuspendThread and ResumeThread) and a number of Unixes. I will be glad to be able to support multi-threaded applications on FreeBSD - my desktop OS - as well. Nick B