Date: Mon, 18 Aug 2003 06:47:52 +0800 From: David Xu <davidxu@FreeBSD.org> To: Marcel Moolenaar <marcel@xcllnt.net>, threads@FreeBSD.org Subject: Re: First draft: rewrite of {get|set|swap}context(3) Message-ID: <200308180647.52744.davidxu@FreeBSD.org> In-Reply-To: <20030817185015.GB928@dhcp42.pn.xcllnt.net> References: <20030817185015.GB928@dhcp42.pn.xcllnt.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 18 August 2003 02:50, Marcel Moolenaar wrote: > Gang, > > Please review the attached patch and let me know to what extend it > introduces breakages. It is the result of "aggressive engineering" > to provoke comments and further fuel discussion. The reason for this > approach is that we currently do not initialize any fields other than > the mcontext and sigmask and only partially copyin() and copyout() > the contexts (typically only the mcontext and sigmask fields). This > generally is very sensitive to breakages, especially when we intro- > duce flags or need to use any of the spare fields. > > getcontext(3): the whole ucontext is zeroed before (partially) filled > and we copyout() all of it. This means that uc_link can only > be set/defined after calling setcontext(). > setcontext(3): we copyin() the whole ucontext but partially restore > its fields. The sigmask is restored conditionally based upon > the UCF_SIGMASK flag. > swapcontext(3): we preserve uc_link by doing a partial copyin(). The > context is otherwise zeroed and partially filled. we copyout() > the whole context. > > The patch has only been compile-tested. > > Shoot... Then doesn't signal context in signal handler have a UCF_SIGMASK ? void (*__sa_sigaction)(int, struct __siginfo *, ucontext_t *ucp); the context *ucp should have UCF_SIGMASK now. I think it should be UCF_NOSIGMASK. But for libkse, we really needn't this kind of hack, because M:N thread in kernel always masks all signals, you can always SIGFILLSET(&uc.uc_sigmask) before call set_context. -- David Xu
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200308180647.52744.davidxu>