From 4e98cce1c529a304d7b55b5455078b9532f93e9b Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 10 Apr 2015 00:54:48 -0400 Subject: optimize out setting up robust list with kernel when not needed as a result of commit 12e1e324683a1d381b7f15dd36c99b37dd44d940, kernel processing of the robust list is only needed for process-shared mutexes. previously the first attempt to lock any owner-tracked mutex resulted in robust list initialization and a set_robust_list syscall. this is no longer necessary, and since the kernel's record of the robust list must now be cleared at thread exit time for detached threads, optimizing it out is more worthwhile than before too. --- src/env/__init_tls.c | 1 + src/process/fork.c | 3 ++- src/thread/pthread_create.c | 1 + src/thread/pthread_mutex_trylock.c | 10 ++++------ 4 files changed, 8 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c index e651c7a7..ac4d9e7f 100644 --- a/src/env/__init_tls.c +++ b/src/env/__init_tls.c @@ -18,6 +18,7 @@ int __init_tp(void *p) libc.has_thread_pointer = 1; td->tid = __syscall(SYS_set_tid_address, &td->tid); td->locale = &libc.global_locale; + td->robust_list.head = &td->robust_list.head; return 0; } diff --git a/src/process/fork.c b/src/process/fork.c index 43c52bc4..8d676828 100644 --- a/src/process/fork.c +++ b/src/process/fork.c @@ -25,7 +25,8 @@ pid_t fork(void) if (libc.has_thread_pointer && !ret) { pthread_t self = __pthread_self(); self->tid = __syscall(SYS_gettid); - memset(&self->robust_list, 0, sizeof self->robust_list); + self->robust_list.off = 0; + self->robust_list.pending = 0; libc.threads_minus_1 = 0; } __restore_sigs(&set); diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 893773fa..8b0135bc 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -268,6 +268,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att do_sched = new->startlock[0] = 1; __block_app_sigs(new->sigmask); } + new->robust_list.head = &new->robust_list.head; new->unblock_cancel = self->cancel; new->canary = self->canary; diff --git a/src/thread/pthread_mutex_trylock.c b/src/thread/pthread_mutex_trylock.c index cb935651..0df3ce29 100644 --- a/src/thread/pthread_mutex_trylock.c +++ b/src/thread/pthread_mutex_trylock.c @@ -7,12 +7,6 @@ int __pthread_mutex_trylock_owner(pthread_mutex_t *m) pthread_t self = __pthread_self(); int tid = self->tid; - if (!self->robust_list.off) { - __syscall(SYS_set_robust_list, &self->robust_list, 3*sizeof(long)); - self->robust_list.head = &self->robust_list.head; - self->robust_list.off = (char*)&m->_m_lock-(char *)&m->_m_next; - } - old = m->_m_lock; own = old & 0x7fffffff; if (own == tid && (type&3) == PTHREAD_MUTEX_RECURSIVE) { @@ -23,6 +17,10 @@ int __pthread_mutex_trylock_owner(pthread_mutex_t *m) if (own == 0x40000000) return ENOTRECOVERABLE; if (m->_m_type & 128) { + if (!self->robust_list.off) { + self->robust_list.off = (char*)&m->_m_lock-(char *)&m->_m_next; + __syscall(SYS_set_robust_list, &self->robust_list, 3*sizeof(long)); + } if (m->_m_waiters) tid |= 0x80000000; self->robust_list.pending = &m->_m_next; } -- cgit v1.2.1