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>