Date: Sat, 02 Jun 2012 09:37:59 +0000 From: gmiller@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r236922 - in soc2012/gmiller/locking-head: include lib/libthr/thread Message-ID: <20120602093759.BD5001065672@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gmiller Date: Sat Jun 2 09:37:59 2012 New Revision: 236922 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=236922 Log: Instrument rwlocks. Modified: soc2012/gmiller/locking-head/include/pthread.h 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 soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c soc2012/gmiller/locking-head/lib/libthr/thread/thr_rwlock.c Modified: soc2012/gmiller/locking-head/include/pthread.h ============================================================================== --- soc2012/gmiller/locking-head/include/pthread.h Sat Jun 2 08:47:26 2012 (r236921) +++ soc2012/gmiller/locking-head/include/pthread.h Sat Jun 2 09:37:59 2012 (r236922) @@ -315,21 +315,66 @@ const struct timespec *, const char *, int); +int pthread_rwlock_rdlock_profiled(pthread_rwlock_t *, + const char *, + int); +int pthread_rwlock_timedrdlock_profiled(pthread_rwlock_t *, + const struct timespec *, + const char *, + int); +int pthread_rwlock_timedwrlock_profiled(pthread_rwlock_t *, + const struct timespec *, + const char *, + int); +int pthread_rwlock_tryrdlock_profiled(pthread_rwlock_t *, + const char *, + int); +int pthread_rwlock_trywrlock_profiled(pthread_rwlock_t *, + const char *, + int); +int pthread_rwlock_wrlock_profiled(pthread_rwlock_t *, + const char *, + int); #ifdef pthread_mutex_lock #undef pthread_mutex_lock #undef pthread_mutex_trylock #undef pthread_mutex_timedlock +#undef pthread_cond_wait +#undef pthread_cond_timedwait +#undef pthread_rwlock_rdlock +#undef pthread_rwlock_wrlock +#undef pthread_rwlock_timedrdlock +#undef pthread_rwlock_timedwrlock +#undef pthread_rwlock_tryrdlock +#undef pthread_rwlock_trywrlock #endif #define pthread_mutex_lock(m) \ - _pthread_mutex_lock(m, __FILE__, __LINE__) + _pthread_mutex_lock_profiled(m, __FILE__, __LINE__) #define pthread_mutex_trylock(m) \ - _pthread_mutex_trylock(m, __FILE__, __LINE__) + _pthread_mutex_trylock_profiled(m, __FILE__, __LINE__) #define pthread_mutex_timedlock(m, t) \ - _pthread_mutex_timedlock(m, t, __FILE__, __LINE__) + _pthread_mutex_timedlock_profiled(m, t, __FILE__, __LINE__) +#define pthread_cond_wait(c, m) \ + _pthread_cond_wait_profiled(c, m, __FILE__, __LINE__) +#define pthread_cond_timedwait(c, m, t) \ + _pthread_cond_timedwait_profiled(c, m, t, __FILE__, __LINE__) +#define pthread_rwlock_rdlock(l) \ + _pthread_rwlock_rdlock_profiled(l, __FILE__, __LINE__) +#define pthread_rwlock_wrlock(l) \ + _pthread_rwlock_wrlock_profiled(l, __FILE__, __LINE__) +#define pthread_rwlock_timedrdlock(l, t) \ + _pthread_rwlock_timedrdlock_profiled(l, t, __FILE__, __LINE__) +#define pthread_rwlock_timedwrlock(l, t) \ + _pthread_rwlock(timedwrlock_profiled(l, t, __FILE__, __LINE__) +#define pthread_rwlock_tryrdlock(l, t) \ + _pthread_rwlock_tryrdlock_profiled(l, t, __FILE__, __LINE__) +#define pthread_rwlock_trywrlock(l, t) \ + _pthread_rwlock_trywrlock_profiled(l, t, __FILE__, __LINE__) + #endif #endif Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_cond.c ============================================================================== --- soc2012/gmiller/locking-head/lib/libthr/thread/thr_cond.c Sat Jun 2 08:47:26 2012 (r236921) +++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_cond.c Sat Jun 2 09:37:59 2012 (r236922) @@ -49,18 +49,6 @@ static int cond_signal_common(pthread_cond_t *cond); static int cond_broadcast_common(pthread_cond_t *cond); -#ifdef LOCK_PROFILING -int __pthread_cond_wait_profiled(pthread_cond_t *cond, - pthread_mutex_t *mutex, - const char *file, - int line); -int __pthread_cond_timedwait_profiled(pthread_cond_t *cond, - pthread_mutex_t *mutex, - const struct timespec * abstime, - const char *file, - int line); -#endif - /* * Double underscore versions are cancellation points. Single underscore * versions are not and are provided for libc internal usage (which @@ -74,6 +62,20 @@ __weak_reference(_pthread_cond_signal, pthread_cond_signal); __weak_reference(_pthread_cond_broadcast, pthread_cond_broadcast); +#ifdef LOCK_PROFILING + +int __pthread_cond_wait_profiled(pthread_cond_t *cond, + pthread_mutex_t *mutex, + const char *file, + int line); +int __pthread_cond_timedwait_profiled(pthread_cond_t *cond, + pthread_mutex_t *mutex, + const struct timespec * abstime, + const char *file, + int line); + +#endif + #define CV_PSHARED(cvp) (((cvp)->__flags & USYNC_PROCESS_SHARED) != 0) static int Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_mutex.c ============================================================================== --- soc2012/gmiller/locking-head/lib/libthr/thread/thr_mutex.c Sat Jun 2 08:47:26 2012 (r236921) +++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_mutex.c Sat Jun 2 09:37:59 2012 (r236922) @@ -96,19 +96,6 @@ static int mutex_lock_sleep(struct pthread *, pthread_mutex_t, const struct timespec * _PROFILE_PARMS); -#ifdef LOCK_PROFILING -int __pthread_mutex_trylock_profiled(pthread_mutex_t *mutex, - const char *file, - int line); -int __pthread_mutex_lock_profiled(pthread_mutex_t *mutex, - const char *file, - int line); -int __pthread_mutex_timedlock_profiled(pthread_mutex_t *mutex, - const struct timespec *abstime, - const char *file, - int line); -#endif - __weak_reference(__pthread_mutex_init, pthread_mutex_init); __strong_reference(__pthread_mutex_init, _pthread_mutex_init); __weak_reference(__pthread_mutex_lock, pthread_mutex_lock); @@ -135,6 +122,27 @@ __weak_reference(_pthread_mutex_getyieldloops_np, pthread_mutex_getyieldloops_np); __weak_reference(_pthread_mutex_isowned_np, pthread_mutex_isowned_np); +#ifdef LOCK_PROFILING +int __pthread_mutex_trylock_profiled(pthread_mutex_t *mutex, + const char *file, + int line); +int __pthread_mutex_lock_profiled(pthread_mutex_t *mutex, + const char *file, + int line); +int __pthread_mutex_timedlock_profiled(pthread_mutex_t *mutex, + const struct timespec *abstime, + const char *file, + int line); + +__strong_reference(__pthread_mutex_lock_profiled, + _pthread_mutex_lock_profiled); +__strong_reference(__pthread_mutex_trylock_profiled, + _pthread_mutex_trylock_profiled); +__strong_reference(__pthread_mutex_timedlock_profiled, + _pthread_mutex_timedlock_profiled); + +#endif + static int mutex_init(pthread_mutex_t *mutex, const struct pthread_mutex_attr *mutex_attr, Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h ============================================================================== --- soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h Sat Jun 2 08:47:26 2012 (r236921) +++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h Sat Jun 2 09:37:59 2012 (r236922) @@ -748,6 +748,16 @@ void _mutex_obtain_success(struct pthread_mutex *, const char *, int) __hidden; void _lock_profile_exit_thread(struct pthread *curthread) __hidden; +void _rwlock_obtain_read_success(struct pthread_rwlock *, const char *file, + int line) __hidden; +void _rwlock_obtain_read_failed(struct pthread_rwlock *, const char *file, + int line) __hidden; +void _rwlock_obtain_write_success(struct pthread_rwlock *, const char *file, + int line) __hidden; +void _rwlock_obtain_write_failed(struct pthread_rwlock *, const char *file, + int line) __hidden; +void _rwlock_release_read(struct pthread_rwlock *) __hidden; +void _rwlock_release_write(struct pthread_rwlock *) __hidden; void _mutex_release(struct pthread_mutex *) __hidden; void _libpthread_init(struct pthread *) __hidden; struct pthread *_thr_alloc(struct pthread *) __hidden; @@ -816,13 +826,29 @@ #define MUTEX_OBTAIN_FAILED(m) \ _mutex_obtain_failed(m, file, line) #define MUTEX_RELEASE(m) _mutex_release(m) +#define RWLOCK_OBTAIN_READ_SUCCESS(l) \ + _rwlock_obtain_read_success(l, file, line) +#define RWLOCK_OBTAIN_READ_FAILED(l) \ + _rwlock_obtain_read_failed(l, file, line) +#define RWLOCK_OBTAIN_WRITE_SUCCESS(l) \ + _rwlock_obtain_write_success(l, file, line) +#define RWLOCK_OBTAIN_WRITE_FAILED(l) \ + _rwlock_obtain_write_failed(l, file, line) +#define RWLOCK_RELEASE_READ(l) _rwlock_release_read(l) +#define RWLOCK_RELEASE_WRITE(l) _rwlock_release_write(l) #else -#define LOCK_PROFILE_EXIT_THREAD(t) do { } while (0) -#define MUTEX_OBTAIN_SUCCESS(m) do { } while (0) -#define MUTEX_OBTAIN_FAILED(m) do { } while (0) -#define MUTEX_RELEASE(m) do { } while (0) +#define LOCK_PROFILE_EXIT_THREAD(t) do { } while (0) +#define MUTEX_OBTAIN_SUCCESS(m) do { } while (0) +#define MUTEX_OBTAIN_FAILED(m) do { } while (0) +#define MUTEX_RELEASE(m) do { } while (0) +#define RWLOCK_OBTAIN_READ_SUCCESS(l) do { } while (0) +#define RWLOCK_OBTAIN_READ_FAILED(l) do { } while (0) +#define RWLOCK_OBTAIN_WRITE_SUCCESS(l) do { } while (0) +#define RWLOCK_OBTAIN_WRITE_FAILED(l) do { } while (0) +#define RWLOCK_RELEASE_READ(l) do { } while (0) +#define RWLOCK_RELEASE_WRITE(l) do { } while (0) #endif Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c ============================================================================== --- soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c Sat Jun 2 08:47:26 2012 (r236921) +++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c Sat Jun 2 09:37:59 2012 (r236922) @@ -25,6 +25,8 @@ * */ +#ifdef LOCK_PROFILING + #include "thr_private.h" void @@ -46,3 +48,39 @@ _lock_profile_exit_thread(struct pthread *t) { } + +void +_rwlock_obtain_read_success(struct pthread_rwlock *l, const char *file, + int line) +{ +} + +void +_rwlock_obtain_read_failed(struct pthread_rwlock *l, const char *file, + int line) +{ +} + +void +_rwlock_obtain_write_success(struct pthread_rwlock *l, const char *file, + int line) +{ +} + +void +_rwlock_obtain_write_failed(struct pthread_rwlock *l, const char *file, + int line) +{ +} + +void +_rwlock_release_read(struct pthread_rwlock *l) +{ +} + +void +_rwlock_release_write(struct pthread_rwlock *l) +{ +} + +#endif Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_rwlock.c ============================================================================== --- soc2012/gmiller/locking-head/lib/libthr/thread/thr_rwlock.c Sat Jun 2 08:47:26 2012 (r236921) +++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_rwlock.c Sat Jun 2 09:37:59 2012 (r236922) @@ -61,6 +61,30 @@ /* * Prototypes */ +#ifdef LOCK_PROFILING + +int _pthread_rwlock_rdlock_profiled(pthread_rwlock_t *rwlock, + const char *file, + int line); +int _pthread_rwlock_wrlock_profiled(pthread_rwlock_t *rwlock, + const char *file, + int line); +int _pthread_rwlock_timedrdlock_profiled(pthread_rwlock_t *rwlock, + const struct timespec *abstime, + const char *file, + int line); +int _pthread_rwlock_timedwrlock_profiled(pthread_rwlock_t *rwlock, + const struct timespec *abstime, + const char *file, + int line); +int _pthread_rwlock_tryrdlock_profiled(pthread_rwlock_t *rwlock, + const char *file, + int line); +int _pthread_rwlock_trywrlock_profiled(pthread_rwlock_t *rwlock, + const char *file, + int line); + +#endif static int rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr __unused) @@ -119,7 +143,8 @@ } static int -rwlock_rdlock_common(pthread_rwlock_t *rwlock, const struct timespec *abstime) +rwlock_rdlock_common(pthread_rwlock_t *rwlock, const struct timespec *abstime + _PROFILE_PARMS) { struct pthread *curthread = _get_curthread(); pthread_rwlock_t prwlock; @@ -153,9 +178,14 @@ ret = _thr_rwlock_tryrdlock(&prwlock->lock, flags); if (ret == 0) { curthread->rdlock_count++; + + RWLOCK_OBTAIN_READ_SUCCESS(*rwlock); + return (ret); } + RWLOCK_OBTAIN_READ_FAILED(*rwlock); + if (__predict_false(abstime && (abstime->tv_nsec >= 1000000000 || abstime->tv_nsec < 0))) return (EINVAL); @@ -172,26 +202,59 @@ break; } } - if (ret == 0) + if (ret == 0) { curthread->rdlock_count++; + RWLOCK_OBTAIN_READ_SUCCESS(*rwlock); + } + return (ret); } int -_pthread_rwlock_rdlock (pthread_rwlock_t *rwlock) +_pthread_rwlock_rdlock(pthread_rwlock_t *rwlock) +#ifdef LOCK_PROFILING +{ + return (_pthread_rwlock_rdlock_profiled(rwlock, __FILE__, __LINE__)); +} + +int +_pthread_rwlock_rdlock_profiled(pthread_rwlock_t *rwlock, const char *file, + int line) +#endif { - return (rwlock_rdlock_common(rwlock, NULL)); + return (rwlock_rdlock_common(rwlock, NULL _PROFILE_PASS)); } int -_pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock, - const struct timespec *abstime) +_pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock, + const struct timespec *abstime) +#ifdef LOCK_PROFILING { - return (rwlock_rdlock_common(rwlock, abstime)); + return (_pthread_rwlock_timedrdlock_profiled(rwlock, abstime, __FILE__, + __LINE__)); } int -_pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock) +_pthread_rwlock_timedrdlock_profiled(pthread_rwlock_t *rwlock, + const struct timespec *abstime, + const char *file, int line) +#endif +{ + return (rwlock_rdlock_common(rwlock, abstime _PROFILE_PASS)); +} + +int +_pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) +#ifdef LOCK_PROFILING +{ + return (_pthread_rwlock_tryrdlock_profiled(rwlock, __FILE__, + __LINE__)); +} + +int +_pthread_rwlock_tryrdlock_profiled(pthread_rwlock_t *rwlock, + const char *file, int line) +#endif { struct pthread *curthread = _get_curthread(); pthread_rwlock_t prwlock; @@ -219,13 +282,26 @@ } ret = _thr_rwlock_tryrdlock(&prwlock->lock, flags); - if (ret == 0) + if (ret == 0) { curthread->rdlock_count++; + RWLOCK_OBTAIN_READ_SUCCESS(*rwlock); + } else { + RWLOCK_OBTAIN_READ_FAILED(*rwlock); + } return (ret); } int -_pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock) +_pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock) +#ifdef LOCK_PROFILING +{ + return (_pthread_rwlock_trywrlock_profiled(rwlock, __FILE__, __LINE__)); +} + +int +_pthread_rwlock_trywrlock_profiled(pthread_rwlock_t *rwlock, const char *file, + int line) +#endif { struct pthread *curthread = _get_curthread(); pthread_rwlock_t prwlock; @@ -234,13 +310,18 @@ CHECK_AND_INIT_RWLOCK ret = _thr_rwlock_trywrlock(&prwlock->lock); - if (ret == 0) + if (ret == 0) { prwlock->owner = curthread; + RWLOCK_OBTAIN_WRITE_SUCCESS(*rwlock); + } else { + RWLOCK_OBTAIN_WRITE_FAILED(*rwlock); + } return (ret); } static int -rwlock_wrlock_common (pthread_rwlock_t *rwlock, const struct timespec *abstime) +rwlock_wrlock_common(pthread_rwlock_t *rwlock, const struct timespec *abstime + _PROFILE_PARMS) { struct pthread *curthread = _get_curthread(); pthread_rwlock_t prwlock; @@ -255,9 +336,14 @@ ret = _thr_rwlock_trywrlock(&prwlock->lock); if (ret == 0) { prwlock->owner = curthread; + + RWLOCK_OBTAIN_WRITE_SUCCESS(*rwlock); + return (ret); } + RWLOCK_OBTAIN_WRITE_FAILED(*rwlock); + if (__predict_false(abstime && (abstime->tv_nsec >= 1000000000 || abstime->tv_nsec < 0))) return (EINVAL); @@ -280,20 +366,47 @@ break; } } + + if (ret == 0) { + RWLOCK_OBTAIN_WRITE_SUCCESS(*rwlock); + } else { + RWLOCK_OBTAIN_WRITE_FAILED(*rwlock); + } + return (ret); } int -_pthread_rwlock_wrlock (pthread_rwlock_t *rwlock) +_pthread_rwlock_wrlock(pthread_rwlock_t *rwlock) +#ifdef LOCK_PROFILING +{ + return (_pthread_rwlock_wrlock_profiled(rwlock, __FILE__, __LINE__)); +} + +int +_pthread_rwlock_wrlock_profiled(pthread_rwlock_t *rwlock, const char *file, + int line) +#endif { - return (rwlock_wrlock_common (rwlock, NULL)); + return (rwlock_wrlock_common(rwlock, NULL _PROFILE_PASS)); } int -_pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock, - const struct timespec *abstime) +_pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock, + const struct timespec *abstime) +#ifdef LOCK_PROFILING { - return (rwlock_wrlock_common (rwlock, abstime)); + return (_pthread_rwlock_timedwrlock_profiled(rwlock, abstime, __FILE__, + __LINE__)); +} + +int +_pthread_rwlock_timedwrlock_profiled(pthread_rwlock_t *rwlock, + const struct timespec *abstime, + const char *file, int line) +#endif +{ + return (rwlock_wrlock_common(rwlock, abstime _PROFILE_PASS)); } int @@ -317,8 +430,12 @@ } ret = _thr_rwlock_unlock(&prwlock->lock); - if (ret == 0 && (state & URWLOCK_WRITE_OWNER) == 0) + if (ret == 0 && (state & URWLOCK_WRITE_OWNER) == 0) { curthread->rdlock_count--; + RWLOCK_RELEASE_READ(*rwlock); + } else if (ret == 0) { + RWLOCK_RELEASE_WRITE(*rwlock); + } return (ret); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120602093759.BD5001065672>