From owner-p4-projects@FreeBSD.ORG Fri Jan 7 03:17:07 2005 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 956AD16A4D0; Fri, 7 Jan 2005 03:17:06 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6E20816A4CE for ; Fri, 7 Jan 2005 03:17:06 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 4D32C43D1F for ; Fri, 7 Jan 2005 03:17:06 +0000 (GMT) (envelope-from davidxu@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j073H6wt084333 for ; Fri, 7 Jan 2005 03:17:06 GMT (envelope-from davidxu@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j073H5Jo084330 for perforce@freebsd.org; Fri, 7 Jan 2005 03:17:05 GMT (envelope-from davidxu@freebsd.org) Date: Fri, 7 Jan 2005 03:17:05 GMT Message-Id: <200501070317.j073H5Jo084330@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to davidxu@freebsd.org using -f From: David Xu To: Perforce Change Reviews Subject: PERFORCE change 68446 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Jan 2005 03:17:07 -0000 http://perforce.freebsd.org/chv.cgi?CH=68446 Change 68446 by davidxu@davidxu_celeron on 2005/01/07 03:16:19 use atomic operation, remove static initializing lock. Affected files ... .. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_mutex.c#12 edit Differences ... ==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_mutex.c#12 (text+ko) ==== @@ -90,21 +90,19 @@ PTHREAD_MUTEXATTR_STATIC_INITIALIZER; static pthread_mutexattr_t static_mattr = &static_mutex_attr; -/* Single underscore versions provided for libc internal usage: */ +__weak_reference(__pthread_mutex_init, pthread_mutex_init); __weak_reference(__pthread_mutex_lock, pthread_mutex_lock); __weak_reference(__pthread_mutex_timedlock, pthread_mutex_timedlock); __weak_reference(__pthread_mutex_trylock, pthread_mutex_trylock); +/* Single underscore versions provided for libc internal usage: */ /* No difference between libc and application usage of these: */ -__weak_reference(_pthread_mutex_init, pthread_mutex_init); __weak_reference(_pthread_mutex_destroy, pthread_mutex_destroy); __weak_reference(_pthread_mutex_unlock, pthread_mutex_unlock); - - -int -__pthread_mutex_init(pthread_mutex_t *mutex, - const pthread_mutexattr_t *mutex_attr) +static int +mutex_init(pthread_mutex_t *mutex, + const pthread_mutexattr_t *mutex_attr, int private) { struct pthread_mutex *pmutex; enum pthread_mutextype type; @@ -113,11 +111,8 @@ int flags; int ret = 0; - if (mutex == NULL) - ret = EINVAL; - /* Check if default mutex attributes: */ - else if (mutex_attr == NULL || *mutex_attr == NULL) { + if (mutex_attr == NULL || *mutex_attr == NULL) { /* Default to a (error checking) POSIX mutex: */ type = PTHREAD_MUTEX_ERRORCHECK; protocol = PTHREAD_PRIO_NONE; @@ -179,6 +174,8 @@ /* Initialise the rest of the mutex: */ TAILQ_INIT(&pmutex->m_queue); pmutex->m_flags |= MUTEX_FLAGS_INITED; + if (private) + pmutex->m_flags |= MUTEX_FLAGS_PRIVATE; pmutex->m_owner = NULL; pmutex->m_type = type; pmutex->m_protocol = protocol; @@ -189,7 +186,8 @@ pmutex->m_prio = -1; pmutex->m_saved_prio = 0; MUTEX_INIT_LINK(pmutex); - *mutex = pmutex; + if (!atomic_cmpset_acq_ptr(mutex, NULL, pmutex)) + MUTEX_DESTROY(pmutex); } else { /* Free the mutex lock structure: */ MUTEX_DESTROY(pmutex); @@ -205,16 +203,16 @@ _pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutex_attr) { - struct pthread_mutex_attr mattr, *mattrp; + *mutex = NULL; + return mutex_init(mutex, mutex_attr, 1); +} - if ((mutex_attr == NULL) || (*mutex_attr == NULL)) - return (__pthread_mutex_init(mutex, &static_mattr)); - else { - mattr = **mutex_attr; - mattr.m_flags |= MUTEX_FLAGS_PRIVATE; - mattrp = &mattr; - return (__pthread_mutex_init(mutex, &mattrp)); - } +int +__pthread_mutex_init(pthread_mutex_t *mutex, + const pthread_mutexattr_t *mutex_attr) +{ + *mutex = NULL; + return mutex_init(mutex, mutex_attr, 0); } int @@ -284,40 +282,6 @@ } static int -init_static(struct pthread *thread, pthread_mutex_t *mutex) -{ - int ret; - - THR_LOCK_ACQUIRE(thread, &_mutex_static_lock); - - if (*mutex == NULL) - ret = pthread_mutex_init(mutex, NULL); - else - ret = 0; - - THR_LOCK_RELEASE(thread, &_mutex_static_lock); - - return (ret); -} - -static int -init_static_private(struct pthread *thread, pthread_mutex_t *mutex) -{ - int ret; - - THR_LOCK_ACQUIRE(thread, &_mutex_static_lock); - - if (*mutex == NULL) - ret = _pthread_mutex_init(mutex, &static_mattr); - else - ret = 0; - - THR_LOCK_RELEASE(thread, &_mutex_static_lock); - - return (ret); -} - -static int mutex_trylock_common(struct pthread *curthread, pthread_mutex_t *mutex) { int ret = 0; @@ -462,7 +426,7 @@ * initialization: */ else if ((*mutex != NULL) || - ((ret = init_static(curthread, mutex)) == 0)) + ((ret = mutex_init(mutex, NULL, 0)) == 0)) ret = mutex_trylock_common(curthread, mutex); return (ret); @@ -482,7 +446,7 @@ * initialization marking the mutex private (delete safe): */ else if ((*mutex != NULL) || - ((ret = init_static_private(curthread, mutex)) == 0)) + ((ret = mutex_init(mutex, NULL, 1)) == 0)) ret = mutex_trylock_common(curthread, mutex); return (ret); @@ -781,7 +745,7 @@ * If the mutex is statically initialized, perform the dynamic * initialization: */ - else if ((*m != NULL) || ((ret = init_static(curthread, m)) == 0)) + else if ((*m != NULL) || ((ret = mutex_init(m, NULL, 0)) == 0)) ret = mutex_lock_common(curthread, m, NULL); return (ret); @@ -807,7 +771,7 @@ * initialization marking it private (delete safe): */ else if ((*m != NULL) || - ((ret = init_static_private(curthread, m)) == 0)) + ((ret = mutex_init(m, NULL, 1)) == 0)) ret = mutex_lock_common(curthread, m, NULL); return (ret); @@ -830,7 +794,7 @@ * If the mutex is statically initialized, perform the dynamic * initialization: */ - else if ((*m != NULL) || ((ret = init_static(curthread, m)) == 0)) + else if ((*m != NULL) || ((ret = mutex_init(m, NULL, 0)) == 0)) ret = mutex_lock_common(curthread, m, abs_timeout); return (ret); @@ -855,7 +819,7 @@ * initialization marking it private (delete safe): */ else if ((*m != NULL) || - ((ret = init_static_private(curthread, m)) == 0)) + ((ret = mutex_init(m, NULL, 1)) == 0)) ret = mutex_lock_common(curthread, m, abs_timeout); return (ret);