cvs commit: src/lib/libc/gen Makefile.inc errlst.c src/lib/libc/i386/sys cerror.S ptrace.S src/lib/libc/sys Makefile.inc __error.c src/lib/libc_r/sys Makefile.inc uthread_error.c src/lib/libc_r/uthread Makefile.inc ...

Matthew Dillon dillon at apollo.backplane.com
Fri May 6 09:54:00 PDT 2005


    Ok, I understand... it's the on-demand module memory allocation that's
    the issue.

    errno will be safe then, but we have to solve the signal locking issue
    before we can deploy __thread significantly outside of libc.

    The RTLD itself does not use TLS... it has its own statically linked
    libc and thus its own private errno.  So at least we don't have to worry
    about that aspect of the problem.

    I very much want to implement the signal critical section for 
    userland in userland, but I want to do it right and that means having
    the compatibility layer that can do the shared memory negotiation with
    the kernel.

					-Matt
					Matthew Dillon 
					<dillon at xxxxxxxxxxxxx>

:In general, the commit is fine. however, because the tls implementation is
:not signal safe, accessing __thread based variable in signal handler will
:cause rtld to try to get writer lock if the tls space is never allocated 
:or a
:new shared library was loaded, but the thread may have already gotten
:a reader lock in rtld to resolve a symbol, so thread will wait for itself to
:release the reader lock, then deadlock happens.
:
:Another problem within current libthread_xu implementation is that
:profiling version libthread_xu_p.so may not work reliably, because .mcount()
:will execute before a thread setup it TLS register because rfork() can 
:not set TLS
:register for new thread. it is fixed in FreeBSD -current by introducing 
:new syscall
:thr_new, the new syscall will setup TLS register for userland, then when 
:first
:userland instruction is executed, the thread's  environment was already 
:fully setup,
:there is no sigprocmask() call etcs to avoid the race condition which really
:can not avoid all the races.
:
:I don't know if it is safe to let rtld use __thread errno, if rtld is 
:also built with
:the new libc, any syscall in rtld will also use the new errno style.
:
:David Xu





More information about the Commits mailing list