socsvn commit: r237520 - in soc2012/gmiller/locking-head: include
lib/libthr/thread
gmiller at FreeBSD.org
gmiller at FreeBSD.org
Mon Jun 11 23:29:17 UTC 2012
Author: gmiller
Date: Mon Jun 11 23:29:14 2012
New Revision: 237520
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237520
Log:
Implement pthread_getstatistics_begin_np(), pthread_getstatistics_next_np(),
and pthread_get_statistics_end_np().
Modified:
soc2012/gmiller/locking-head/include/pthread_np.h
soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c
Modified: soc2012/gmiller/locking-head/include/pthread_np.h
==============================================================================
--- soc2012/gmiller/locking-head/include/pthread_np.h Mon Jun 11 22:25:20 2012 (r237519)
+++ soc2012/gmiller/locking-head/include/pthread_np.h Mon Jun 11 23:29:14 2012 (r237520)
@@ -71,11 +71,23 @@
#ifdef LOCK_PROFILING
+#include <inttypes.h>
+
+struct _pthread_statistics_private;
+
struct pthread_statistics_np {
+ struct _pthread_statistics_private *_pvt;
+ const char *file;
+ int line;
+ struct timespec wait_max;
+ struct timespec hold_max;
+ uintmax_t contest_count;
+ struct timespec wait_time;
+ struct timespec hold_time;
+ int acq_count;
};
-void pthread_getstatistics_begin_np(struct pthread_statistics_np *,
- size_t record_size);
+void pthread_getstatistics_begin_np(struct pthread_statistics_np *);
void pthread_getstatistics_next_np(struct pthread_statistics_np *);
void pthread_getstatistics_end_np(struct pthread_statistics_np *);
Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c Mon Jun 11 22:25:20 2012 (r237519)
+++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c Mon Jun 11 23:29:14 2012 (r237520)
@@ -66,6 +66,11 @@
struct acq_point_head mutex_hash[LOCK_PROF_HASH_SIZE];
+struct _pthread_statistics_private {
+ int hash;
+ struct acquisition_point *last_record;
+};
+
void
_lock_profile_init()
{
@@ -275,20 +280,72 @@
{
}
+static int
+find_next_record(struct pthread_statistics_np *stats)
+{
+ struct pthread *curthread = _get_curthread();
+
+ THR_CRITICAL_ENTER(curthread);
+
+ for (;;) {
+ if (stats->_pvt->last_record == NULL) {
+ if (stats->_pvt->hash >= LOCK_PROF_HASH_SIZE) {
+ break;
+ } else {
+ stats->_pvt->hash++;
+ stats->_pvt->last_record =
+ SLIST_FIRST(&mutex_hash[stats->_pvt->hash]);
+ }
+ } else {
+ stats->_pvt->last_record = SLIST_NEXT(stats->_pvt->
+ last_record,
+ acq_point_next);
+ }
+
+ if (stats->_pvt->last_record != NULL) {
+ break;
+ }
+ }
+
+ if (stats->_pvt->last_record != NULL) {
+ stats->file = stats->_pvt->last_record->file;
+ stats->line = stats->_pvt->last_record->line;
+ stats->wait_max = stats->_pvt->last_record->wait_max;
+ stats->hold_max = stats->_pvt->last_record->hold_max;
+ stats->contest_count = stats->_pvt->last_record->contest_count;
+ stats->wait_time = stats->_pvt->last_record->wait_time;
+ stats->hold_time = stats->_pvt->last_record->hold_time;
+ stats->acq_count = stats->_pvt->last_record->acq_count;
+ }
+
+ THR_CRITICAL_LEAVE(curthread);
+
+ return (stats->_pvt->last_record != NULL);
+}
+
void
-pthread_getstatistics_begin_np(struct pthread_statistics_np *stats,
- size_t record_size)
+pthread_getstatistics_begin_np(struct pthread_statistics_np *stats)
{
+ stats->_pvt = malloc(sizeof(struct _pthread_statistics_private));
+ stats->_pvt->hash = 0;
+ stats->_pvt->last_record = NULL;
+
+ find_next_record(stats);
}
void
pthread_getstatistics_next_np(struct pthread_statistics_np *stats)
{
+ find_next_record(stats);
}
void
pthread_getstatistics_end_np(struct pthread_statistics_np *stats)
{
+ if (stats->_pvt != NULL) {
+ free(stats->_pvt);
+ stats->_pvt = NULL;
+ }
}
#endif /* LOCK_PROFILING */
More information about the svn-soc-all
mailing list