clean up handling of thread/nothread mode, locking

This commit is contained in:
Rich Felker
2011-04-17 16:53:54 -04:00
parent eb0e8fa0b1
commit 9080cc153c
8 changed files with 16 additions and 27 deletions

View File

@ -44,18 +44,6 @@ void __pthread_unwind_next(struct __ptcb *cb)
__syscall(SYS_exit, 0);
}
static void init_threads()
{
sigset_t set;
libc.lock = __lock;
libc.lockfile = __lockfile;
sigemptyset(&set);
sigaddset(&set, SIGSYSCALL);
sigaddset(&set, SIGCANCEL);
__libc_sigprocmask(SIG_UNBLOCK, &set, 0);
}
static int start(void *p)
{
struct pthread *self = p;
@ -79,7 +67,6 @@ weak_alias(dummy, __pthread_tsd_size);
int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(void *), void *arg)
{
static int init;
int ret;
size_t size, guard;
struct pthread *self = pthread_self(), *new;
@ -87,7 +74,14 @@ int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(vo
const pthread_attr_t default_attr = { 0 };
if (!self) return ENOSYS;
if (!init && ++init) init_threads();
if (!libc.threaded) {
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGSYSCALL);
sigaddset(&set, SIGCANCEL);
__libc_sigprocmask(SIG_UNBLOCK, &set, 0);
libc.threaded = 1;
}
if (!attr) attr = &default_attr;
guard = ROUND(attr->_a_guardsize + DEFAULT_GUARD_SIZE);