Skip site navigation (1)Skip section navigation (2)
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>