socsvn commit: r236654 - in soc2012/gmiller/locking-head: include
lib/libthr/thread
gmiller at FreeBSD.org
gmiller at FreeBSD.org
Tue May 29 12:16:09 UTC 2012
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, ...);
More information about the svn-soc-all
mailing list