PERFORCE change 68446 for review
David Xu
davidxu at FreeBSD.org
Thu Jan 6 19:17:07 PST 2005
http://perforce.freebsd.org/chv.cgi?CH=68446
Change 68446 by davidxu at 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);
More information about the p4-projects
mailing list