libkse / libthr bugs?
Daniel Eischen
eischen at vigrid.com
Sat Jun 28 07:15:00 PDT 2003
On Fri, 27 Jun 2003, David Schultz wrote:
> On Fri, Jun 27, 2003, Mike Makonnen wrote:
> > I'm glad you brought this last point up because that has been on my mind as
> > well. Let's say an application is in one of the locked libc functions, receives
> > a signal and calls that same libc function from it's signal handler.
> > Furthermore, let's say that the thread had just aquired a lock in the libc
> > funtion before handling the signal. When this thread called the same libc
> > function from the signal handler and tried to aquire the same lock again, would
> > it not deadlock against itself?
>
> This is interesting in that it mirrors a general issue that comes
> up in the kernel. Specifically, the kernel needs to deal with the
> problem where an interrupt handler tries to acquire a kernel lock
> that is held by the thread it interrupted. Traditionally, Unix
> has dealt with the problem using a technique analogous to what Dan
> suggested, namely, by blocking the relevant interrupts while
> accessing data structures that interrupt handlers might need to
> use. That approach doesn't work on a multiprocessor, though, so
> the usual fix is to simply accept the fact that an interrupt
> handler may want a lock that's already held, and allow it to
> block. The userland analogue of that, i.e. giving a thread
> context to each signal handler, probably won't fly. ;-)
>
> Andersen had to deal with the issue of a thread (possibly the UTS)
> being preempted while holding a lock in his Scheduler Activations
> work. He solved the problem by having the UTS check at the time
> of preemption whether the preempted thread was running in a
> critical section, and if so, defer the preemption. However,
> instead of explicitly enabling and disabling preemption all the
> time, he used the trick of checking at preemption time whether the
> PC fell within certain ranges. In practice, that's probably too
> hard, but it works well in special cases, such as preventing the
> UTS from deadlocking against itself.
Andersen also talked about just setting a flag when a
thread was in a critical region. Libpthread uses a
similar method; right now there are a couple of things
that denote a thread being in a critical region.
Signals are not blocked while threads are in critical
region; they are deferred (latched and handled once
the critical region is exited).
--
Dan Eischen
More information about the freebsd-threads
mailing list