Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 May 2012 12:16:06 +0000
From:      gmiller@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r236654 - in soc2012/gmiller/locking-head: include lib/libthr/thread
Message-ID:  <20120529121606.E5D001065679@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gmiller
Date: Tue May 29 12:16:06 2012
New Revision: 236654
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=236654

Log:
  Add some of the stubs for mutexes and propagate the acquisition point
  information through the callers to the stubs.
  

Modified:
  soc2012/gmiller/locking-head/include/pthread.h
  soc2012/gmiller/locking-head/lib/libthr/thread/Makefile.inc
  soc2012/gmiller/locking-head/lib/libthr/thread/thr_cond.c
  soc2012/gmiller/locking-head/lib/libthr/thread/thr_mutex.c
  soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h

Modified: soc2012/gmiller/locking-head/include/pthread.h
==============================================================================
--- soc2012/gmiller/locking-head/include/pthread.h	Tue May 29 11:48:53 2012	(r236653)
+++ soc2012/gmiller/locking-head/include/pthread.h	Tue May 29 12:16:06 2012	(r236654)
@@ -198,8 +198,10 @@
 			const pthread_condattr_t *);
 int		pthread_cond_signal(pthread_cond_t *);
 int		pthread_cond_timedwait(pthread_cond_t *,
-			pthread_mutex_t *, const struct timespec *);
-int		pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
+		    pthread_mutex_t *, const struct timespec *
+		    _PTHREAD_PROFILE_PARMS);
+int		pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *
+		    _PTHREAD_PROFILE_PARMS);
 int		pthread_create(pthread_t *, const pthread_attr_t *,
 			void *(*) (void *), void *);
 int		pthread_detach(pthread_t);
@@ -222,9 +224,9 @@
 int		pthread_mutex_init(pthread_mutex_t *,
 			const pthread_mutexattr_t *);
 int		pthread_mutex_lock(pthread_mutex_t * _PTHREAD_PROFILE_PARMS);
-int		pthread_mutex_trylock(pthread_mutex_t *);
+int		pthread_mutex_trylock(pthread_mutex_t * _PTHREAD_PROFILE_PARMS);
 int		pthread_mutex_timedlock(pthread_mutex_t *,
-			const struct timespec *);
+			const struct timespec * _PTHREAD_PROFILE_PARMS);
 int		pthread_mutex_unlock(pthread_mutex_t *);
 int		pthread_once(pthread_once_t *, void (*) (void));
 int		pthread_rwlock_destroy(pthread_rwlock_t *);
@@ -305,10 +307,18 @@
 #ifndef pthread_mutex_lock
 #define		pthread_mutex_lock(m)                                         \
 		pthread_mutex_lock (m, __FILE__, __LINE__)
+#define		pthread_mutex_trylock(m)                                      \
+		pthread_mutex_trylock (m, __FILE__, __LINE__)
+#define		pthread_mutex_timedlock(m, t)			\
+		pthread_mutex_timedlock (m, t, __FILE__, __LINE__)
 #endif
 
 #define		_pthread_mutex_lock(m)                                        \
 		_pthread_mutex_lock (m, __FILE__, __LINE__)
+#define		_pthread_mutex_trylock(m)                                     \
+		_pthread_mutex_trylock (m, __FILE__, __LINE__)
+#define		_pthread_mutex_timedlock(m, t)			\
+		_pthread_mutex_timedlock (m, t, __FILE__, __LINE__)
 
 #endif
 

Modified: soc2012/gmiller/locking-head/lib/libthr/thread/Makefile.inc
==============================================================================
--- soc2012/gmiller/locking-head/lib/libthr/thread/Makefile.inc	Tue May 29 11:48:53 2012	(r236653)
+++ soc2012/gmiller/locking-head/lib/libthr/thread/Makefile.inc	Tue May 29 12:16:06 2012	(r236654)
@@ -35,6 +35,7 @@
 	thr_mutexattr.c \
 	thr_once.c \
 	thr_printf.c \
+	thr_profile.c \
 	thr_pspinlock.c \
 	thr_resume_np.c \
 	thr_rtld.c \

Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_cond.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libthr/thread/thr_cond.c	Tue May 29 11:48:53 2012	(r236653)
+++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_cond.c	Tue May 29 12:16:06 2012	(r236654)
@@ -39,12 +39,12 @@
 /*
  * Prototypes
  */
-int	__pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
+int	__pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex _PROFILE_PARMS);
 int	__pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
-		       const struct timespec * abstime);
+		       const struct timespec * abstime _PROFILE_PARMS);
 static int cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
 static int cond_wait_common(pthread_cond_t *cond, pthread_mutex_t *mutex,
-		    const struct timespec *abstime, int cancel);
+		    const struct timespec *abstime, int cancel _PROFILE_PARMS);
 static int cond_signal_common(pthread_cond_t *cond);
 static int cond_broadcast_common(pthread_cond_t *cond);
 
@@ -159,7 +159,7 @@
  */
 static int
 cond_wait_kernel(struct pthread_cond *cvp, struct pthread_mutex *mp,
-	const struct timespec *abstime, int cancel)
+	const struct timespec *abstime, int cancel _PROFILE_PARMS)
 {
 	struct pthread	*curthread = _get_curthread();
 	int		recurse;
@@ -186,9 +186,9 @@
 	 * interesting error codes.
 	 */
 	if (error == 0) {
-		error2 = _mutex_cv_lock(mp, recurse);
+		error2 = _mutex_cv_lock(mp, recurse _PROFILE_PASS);
 	} else if (error == EINTR || error == ETIMEDOUT) {
-		error2 = _mutex_cv_lock(mp, recurse);
+		error2 = _mutex_cv_lock(mp, recurse _PROFILE_PASS);
 		if (error2 == 0 && cancel)
 			_thr_testcancel(curthread);
 		if (error == EINTR)
@@ -211,7 +211,7 @@
 
 static int
 cond_wait_user(struct pthread_cond *cvp, struct pthread_mutex *mp,
-	const struct timespec *abstime, int cancel)
+	const struct timespec *abstime, int cancel _PROFILE_PARMS)
 {
 	struct pthread	*curthread = _get_curthread();
 	struct sleepqueue *sq;
@@ -256,7 +256,7 @@
 				_sleepq_remove(sq, curthread);
 			_sleepq_unlock(cvp);
 			curthread->mutex_obj = NULL;
-			_mutex_cv_lock(mp, recurse);
+			_mutex_cv_lock(mp, recurse _PROFILE_PASS);
 			if (!THR_IN_CRITICAL(curthread))
 				_pthread_exit(PTHREAD_CANCELED);
 			else /* this should not happen */
@@ -270,13 +270,13 @@
 	}
 	_sleepq_unlock(cvp);
 	curthread->mutex_obj = NULL;
-	_mutex_cv_lock(mp, recurse);
+	_mutex_cv_lock(mp, recurse _PROFILE_PASS);
 	return (error);
 }
 
 static int
 cond_wait_common(pthread_cond_t *cond, pthread_mutex_t *mutex,
-	const struct timespec *abstime, int cancel)
+	const struct timespec *abstime, int cancel _PROFILE_PARMS)
 {
 	struct pthread	*curthread = _get_curthread();
 	struct pthread_cond *cvp;
@@ -294,47 +294,47 @@
 	    (mp->m_lock.m_flags & (UMUTEX_PRIO_PROTECT|UMUTEX_PRIO_INHERIT|
 		USYNC_PROCESS_SHARED)) != 0 ||
 	    (cvp->__flags & USYNC_PROCESS_SHARED) != 0)
-		return cond_wait_kernel(cvp, mp, abstime, cancel);
+		return cond_wait_kernel(cvp, mp, abstime, cancel _PROFILE_PASS);
 	else
-		return cond_wait_user(cvp, mp, abstime, cancel);
+		return cond_wait_user(cvp, mp, abstime, cancel _PROFILE_PASS);
 }
 
 int
-_pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
+_pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex _PROFILE_PARMS)
 {
 
-	return (cond_wait_common(cond, mutex, NULL, 0));
+	return (cond_wait_common(cond, mutex, NULL, 0 _PROFILE_PASS));
 }
 
 int
-__pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
+__pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex _PROFILE_PARMS)
 {
 
-	return (cond_wait_common(cond, mutex, NULL, 1));
+	return (cond_wait_common(cond, mutex, NULL, 1 _PROFILE_PASS));
 }
 
 int
 _pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
-		       const struct timespec * abstime)
+		       const struct timespec * abstime _PROFILE_PARMS)
 {
 
 	if (abstime == NULL || abstime->tv_sec < 0 || abstime->tv_nsec < 0 ||
 	    abstime->tv_nsec >= 1000000000)
 		return (EINVAL);
 
-	return (cond_wait_common(cond, mutex, abstime, 0));
+	return (cond_wait_common(cond, mutex, abstime, 0 _PROFILE_PASS));
 }
 
 int
 __pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
-		       const struct timespec *abstime)
+		       const struct timespec *abstime _PROFILE_PARMS)
 {
 
 	if (abstime == NULL || abstime->tv_sec < 0 || abstime->tv_nsec < 0 ||
 	    abstime->tv_nsec >= 1000000000)
 		return (EINVAL);
 
-	return (cond_wait_common(cond, mutex, abstime, 1));
+	return (cond_wait_common(cond, mutex, abstime, 1 _PROFILE_PASS));
 }
 
 static int

Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_mutex.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libthr/thread/thr_mutex.c	Tue May 29 11:48:53 2012	(r236653)
+++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_mutex.c	Tue May 29 12:16:06 2012	(r236654)
@@ -71,21 +71,15 @@
  */
 #define MUTEX_ADAPTIVE_SPINS	2000
 
-#ifdef LOCK_PROFILING
-#define		_PROFILE_PARMS	, const char *file, int line
-#else
-#define		_PROFILE_PARMS	/* */
-#endif
-
 /*
  * Prototypes
  */
 int	__pthread_mutex_init(pthread_mutex_t *mutex,
 		const pthread_mutexattr_t *mutex_attr);
-int	__pthread_mutex_trylock(pthread_mutex_t *mutex);
+int	__pthread_mutex_trylock(pthread_mutex_t *mutex _PROFILE_PARMS);
 int	__pthread_mutex_lock(pthread_mutex_t *mutex _PROFILE_PARMS);
 int	__pthread_mutex_timedlock(pthread_mutex_t *mutex,
-		const struct timespec *abstime);
+		const struct timespec *abstime _PROFILE_PARMS);
 int	_pthread_mutex_init_calloc_cb(pthread_mutex_t *mutex,
     		void *(calloc_cb)(size_t, size_t));
 int	_pthread_mutex_getspinloops_np(pthread_mutex_t *mutex, int *count);
@@ -100,7 +94,7 @@
 				const struct timespec *abstime);
 static int	mutex_unlock_common(struct pthread_mutex *, int);
 static int	mutex_lock_sleep(struct pthread *, pthread_mutex_t,
-				const struct timespec *);
+				const struct timespec * _PROFILE_PARMS);
 
 __weak_reference(__pthread_mutex_init, pthread_mutex_init);
 __strong_reference(__pthread_mutex_init, _pthread_mutex_init);
@@ -318,7 +312,7 @@
 	}
 
 static int
-mutex_trylock_common(pthread_mutex_t *mutex)
+mutex_trylock_common(pthread_mutex_t *mutex _PROFILE_PARMS)
 {
 	struct pthread *curthread = _get_curthread();
 	struct pthread_mutex *m = *mutex;
@@ -331,27 +325,33 @@
 	ret = _thr_umutex_trylock(&m->m_lock, id);
 	if (__predict_true(ret == 0)) {
 		ENQUEUE_MUTEX(curthread, m);
+		MUTEX_OBTAIN_SUCCESS();
 	} else if (m->m_owner == curthread) {
 		ret = mutex_self_trylock(m);
-	} /* else {} */
+		MUTEX_OBTAIN_FAILED();
+	} else {
+		MUTEX_OBTAIN_FAILED();
+	}
+
 	if (ret && (m->m_flags & PMUTEX_FLAG_PRIVATE))
 		THR_CRITICAL_LEAVE(curthread);
+
 	return (ret);
 }
 
 int
-__pthread_mutex_trylock(pthread_mutex_t *mutex)
+__pthread_mutex_trylock(pthread_mutex_t *mutex _PROFILE_PARMS)
 {
 	struct pthread_mutex *m;
 
 	CHECK_AND_INIT_MUTEX
 
-	return (mutex_trylock_common(mutex));
+	return (mutex_trylock_common(mutex _PROFILE_PASS));
 }
 
 static int
 mutex_lock_sleep(struct pthread *curthread, struct pthread_mutex *m,
-	const struct timespec *abstime)
+	const struct timespec *abstime _PROFILE_PARMS)
 {
 	uint32_t	id, owner;
 	int	count;
@@ -360,9 +360,7 @@
 	if (m->m_owner == curthread)
 		return mutex_self_lock(m, abstime);
 
-#if 0
-	lock_profile_obtain_lock_success();
-#endif
+	MUTEX_OBTAIN_FAILED();
 
 	id = TID(curthread);
 	/*
@@ -415,15 +413,17 @@
 		ret = __thr_umutex_timedlock(&m->m_lock, id, abstime);
 	}
 done:
-	if (ret == 0)
+	if (ret == 0) {
 		ENQUEUE_MUTEX(curthread, m);
+		MUTEX_OBTAIN_SUCCESS();
+	}
 
 	return (ret);
 }
 
 static inline int
 mutex_lock_common(struct pthread_mutex *m,
-	const struct timespec *abstime, int cvattach)
+	const struct timespec *abstime, int cvattach _PROFILE_PARMS)
 {
 	struct pthread *curthread  = _get_curthread();
 	int ret;
@@ -434,7 +434,7 @@
 		ENQUEUE_MUTEX(curthread, m);
 		ret = 0;
 	} else {
-		ret = mutex_lock_sleep(curthread, m, abstime);
+		ret = mutex_lock_sleep(curthread, m, abstime _PROFILE_PASS);
 	}
 	if (ret && (m->m_flags & PMUTEX_FLAG_PRIVATE) && !cvattach)
 		THR_CRITICAL_LEAVE(curthread);
@@ -450,11 +450,11 @@
 
 	CHECK_AND_INIT_MUTEX
 
-	return (mutex_lock_common(m, NULL, 0));
+	return (mutex_lock_common(m, NULL, 0 _PROFILE_PASS));
 }
 
 int
-__pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abstime)
+__pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec *abstime _PROFILE_PARMS)
 {
 	struct pthread_mutex	*m;
 
@@ -462,7 +462,7 @@
 
 	CHECK_AND_INIT_MUTEX
 
-	return (mutex_lock_common(m, abstime, 0));
+	return (mutex_lock_common(m, abstime, 0 _PROFILE_PASS));
 }
 
 int
@@ -475,11 +475,11 @@
 }
 
 int
-_mutex_cv_lock(struct pthread_mutex *m, int count)
+_mutex_cv_lock(struct pthread_mutex *m, int count _PROFILE_PARMS)
 {
 	int	error;
 
-	error = mutex_lock_common(m, NULL, 1);
+	error = mutex_lock_common(m, NULL, 1 _PROFILE_PASS);
 	if (error == 0)
 		m->m_count = count;
 	return (error);

Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h
==============================================================================
--- soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h	Tue May 29 11:48:53 2012	(r236653)
+++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h	Tue May 29 12:16:06 2012	(r236654)
@@ -722,18 +722,31 @@
 extern struct urwlock	_thr_list_lock __hidden;
 extern struct umutex	_thr_event_lock __hidden;
 
+#ifdef LOCK_PROFILING
+#define		_PROFILE_PARMS	, const char *file, int line
+#define		_PROFILE_PASS	, file, line
+#else
+#define		_PROFILE_PARMS	/* */
+#define		_PROFILE_PASS	/* */
+#endif
+
 /*
  * Function prototype definitions.
  */
 __BEGIN_DECLS
 int	_thr_setthreaded(int) __hidden;
-int	_mutex_cv_lock(struct pthread_mutex *, int count) __hidden;
+int	_mutex_cv_lock(struct pthread_mutex *, int count _PROFILE_PARMS)      \
+	    __hidden;
 int	_mutex_cv_unlock(struct pthread_mutex *, int *count) __hidden;
 int     _mutex_cv_attach(struct pthread_mutex *, int count) __hidden;
 int     _mutex_cv_detach(struct pthread_mutex *, int *count) __hidden;
 int     _mutex_owned(struct pthread *, const struct pthread_mutex *) __hidden;
 int	_mutex_reinit(pthread_mutex_t *) __hidden;
 void	_mutex_fork(struct pthread *curthread) __hidden;
+void	_mutex_obtain_failed(struct pthread_mutex *, const char *, int)
+	    __hidden;
+void	_mutex_obtain_success(struct pthread_mutex *, const char *, int)
+	    __hidden;
 void	_libpthread_init(struct pthread *) __hidden;
 struct pthread *_thr_alloc(struct pthread *) __hidden;
 void	_thread_exit(const char *, int, const char *) __hidden __dead2;
@@ -792,6 +805,18 @@
 void	_pthread_cancel_enter(int maycancel);
 void 	_pthread_cancel_leave(int maycancel);
 
+#ifdef LOCK_PROFILING
+#define		MUTEX_OBTAIN_SUCCESS()                                       \
+		_mutex_obtain_success(m, file, line)
+#define		MUTEX_OBTAIN_FAILED()                                        \
+		_mutex_obtain_failed(m, file, line)
+#else
+#define		MUTEX_OBTAIN_SUCCESS()                                       \
+		do { } while (0)
+#define		MUTEX_OBTAIN_FAILED()                                        \
+		do { } while (0)
+#endif
+
 /* #include <fcntl.h> */
 #ifdef  _SYS_FCNTL_H_
 int     __sys_fcntl(int, int, ...);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120529121606.E5D001065679>