Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Aug 2012 05:00:05 +0000
From:      gmiller@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r240551 - in soc2012/gmiller/locking-head: . lib/libthr/thread
Message-ID:  <20120820050005.381881065674@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gmiller
Date: Mon Aug 20 05:00:03 2012
New Revision: 240551
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=240551

Log:
   r240629@FreeBSD-dev:  root | 2012-08-17 20:46:07 -0500
   Add some comments to the lock profiling code.

Modified:
  soc2012/gmiller/locking-head/   (props changed)
  soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h
  soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c

Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h
==============================================================================
--- soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h	Mon Aug 20 04:26:50 2012	(r240550)
+++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_private.h	Mon Aug 20 05:00:03 2012	(r240551)
@@ -727,6 +727,10 @@
 extern struct urwlock	_thr_list_lock __hidden;
 extern struct umutex	_thr_event_lock __hidden;
 
+/*
+  Macros used to pass file and line parameters if and only if lock profiling
+  is enabled.
+*/
 #ifdef LOCK_PROFILING
 #define		_PROFILE_PARMS	, const char *file, int line
 #define		_PROFILE_PASS	, file, line
@@ -748,11 +752,6 @@
 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	_lock_profile_init(void) __hidden;
-void	_lock_profile_obtain_failed(struct timespec *, const char *) __hidden;
-void	_lock_profile_obtain_success(void *, struct timespec *, const char *,
-				     int) __hidden;
-void	_lock_profile_release(void *, const char *file) __hidden;
 void	_libpthread_init(struct pthread *) __hidden;
 struct pthread *_thr_alloc(struct pthread *) __hidden;
 void	_thread_exit(const char *, int, const char *) __hidden __dead2;
@@ -821,6 +820,12 @@
 		_lock_profile_obtain_failed(ts, file)
 #define		LOCK_PROFILE_RELEASE(l)	_lock_profile_release(l, file)
 
+void	_lock_profile_init(void) __hidden;
+void	_lock_profile_obtain_failed(struct timespec *, const char *) __hidden;
+void	_lock_profile_obtain_success(void *, struct timespec *, const char *,
+				     int) __hidden;
+void	_lock_profile_release(void *, const char *file) __hidden;
+
 #else
 
 #define		INIT_LOCK_PROFILING()			do { } while (0)

Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c	Mon Aug 20 04:26:50 2012	(r240550)
+++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c	Mon Aug 20 05:00:03 2012	(r240551)
@@ -37,6 +37,10 @@
 
 #define LOCK_PROF_HASH_SIZE (4096)
 
+/*
+  The acquisition_point structure is used to record data about each point in
+  the program that acquires a lock.
+*/
 struct acquisition_point {
 	SLIST_ENTRY(acquisition_point) acq_point_next;
 	const char 	*file;
@@ -51,6 +55,10 @@
 
 SLIST_HEAD(acq_point_head, acquisition_point);
 
+/*
+  The acquisition struct is used to store data about a single acquisition of
+  a lock until the lock is released.
+*/
 struct acquisition {
 	LIST_ENTRY(acquisition) acq_next;
 	void		*lock;
@@ -76,6 +84,11 @@
 static int xml_indent = 0;
 static FILE *xml_file;
 
+/*
+  The following functions are used to write out an XML file containing the
+  profiling data on exit.
+*/
+
 static void
 indent(void)
 {
@@ -213,6 +226,10 @@
 	return (acq_point);
 }
 
+/*
+  This function is called when a lock is successfully acquired. It creates an
+  acquisition structure if one doesn't already exist and records the wait time.
+*/
 void
 _lock_profile_obtain_success(void *lock, struct timespec *wait_time,
 			     const char *file, int line)
@@ -247,6 +264,11 @@
 	THR_CRITICAL_LEAVE(curthread);
 }
 
+/*
+  This function is called when a lock attempt fails. If this is the first
+  attempt to acquire the lock, the time is recorded. This time will be used
+  by _lock_profile_obtain_success() to calculate the wait time.
+*/
 void
 _lock_profile_obtain_failed(struct timespec *wait_time, const char *file)
 {
@@ -259,6 +281,10 @@
 	}
 }
 
+/*
+  This function is called when a lock is released to free the acquisition
+  and update the acquisition_point.
+*/
 void
 _lock_profile_release(void *lock, const char *file)
 {
@@ -323,6 +349,14 @@
 	THR_CRITICAL_LEAVE(curthread);
 }
 
+/*
+  The following functions are used to acquire profile statistics. The
+  pthread_statistics_begin_np() function is called in order to initialize
+  a pthread_statistics_np structure, pthread_statistics_next_np() is called
+  to retrieve the statistics for each acquisition point (ending when it
+  returns 0), and then pthread_statistics_end_np() is called to free working
+  data.
+*/
 static int
 find_next_record(struct pthread_statistics_np *stats)
 {



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