Date: Fri, 7 Jan 2005 03:17:05 GMT From: David Xu <davidxu@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 68446 for review Message-ID: <200501070317.j073H5Jo084330@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200501070317.j073H5Jo084330>