tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: swapcontext() vs pthread bug

Emmanuel Dreyfus <> wrote:

> I am now convinced NetBSD swapcontext() behavior is buggy. Below is a test
> case that shows how swapcontext() can make two different threads report the
> same pthread_self() while both are running:

There is a simple, userland-based, machine-dependent workaround that
fixes everything: unset a flag from ucontext_t uc_flags

Here is the target switch in kernel for cpu_mcontext() from

        if ((flags & _UC_TLSBASE) != 0)
                lwp_setprivate(l, (void *)(uintptr_t)mcp->_mc_tlsbase);

Here is how to use it rom userland for our supported CPU:

amd64, arm, hppa, i386, m68k, mips:
        ctx.uc_flags &= ~_UC_TLSBASE;
        ctx.uc_flags &= ~_UC_UNIQUE;
sh3, sparc, sparc64, vax:
        The behavior is bad and cannot be changed
        The behavior is good and cannot be changed (to be verified)

What about creating a machine independant flag for amd64, arm, hppa,
i386, m68k, mips and alpha? sh3, sparc, sparc64, vax, and powerpc should
be changed to make the behavior configurable, but this is beyond what I
can do.

Emmanuel Dreyfus

Home | Main Index | Thread Index | Old Index