Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jul 2012 21:27:16 +0000
From:      gmiller@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r239256 - in soc2012/gmiller/locking-head: . include lib/libthr/thread lib/libwitness tools/regression/lib/libthr/lockprof
Message-ID:  <20120710212716.71048106564A@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gmiller
Date: Tue Jul 10 21:27:15 2012
New Revision: 239256
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=239256

Log:
   r239219@FreeBSD-dev:  root | 2012-07-03 15:50:08 -0500
   Begin implementation of LoR logging in libwitness.
  
   Rename lock profiling statistics *_np() functions for more consistent
   naming scheme:
  
   pthread_getstatistics_begin_np() -> pthread_statistics_begin_np()
   pthread_getstatistics_next_np() -> pthread_statistics_next_np()
   pthread_getstatistics_end_np() -> pthread_statistics_end_np()
   pthread_resetstatistics_np() -> pthread_statistics_reset_np()
   pthread_lockprof_enable_np() -> pthread_statistics_enable_np()
   pthread_lockprof_disable_np() -> pthread_statistics_disable_np()
  

Added:
  soc2012/gmiller/locking-head/lib/libwitness/logs.c
Modified:
  soc2012/gmiller/locking-head/   (props changed)
  soc2012/gmiller/locking-head/include/pthread_np.h
  soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c
  soc2012/gmiller/locking-head/lib/libwitness/Makefile
  soc2012/gmiller/locking-head/lib/libwitness/lists.c
  soc2012/gmiller/locking-head/lib/libwitness/witness.h
  soc2012/gmiller/locking-head/tools/regression/lib/libthr/lockprof/lock-cycle.c

Modified: soc2012/gmiller/locking-head/include/pthread_np.h
==============================================================================
--- soc2012/gmiller/locking-head/include/pthread_np.h	Tue Jul 10 20:59:35 2012	(r239255)
+++ soc2012/gmiller/locking-head/include/pthread_np.h	Tue Jul 10 21:27:15 2012	(r239256)
@@ -37,6 +37,32 @@
 /*
  * Non-POSIX type definitions:
  */
+
+#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;
+};
+
+#endif
+
+struct pthread_lock_order_np {
+	void		*lock_first;
+	void		*lock_second;
+};
+
 typedef void	(*pthread_switch_routine_t)(pthread_t, pthread_t);
 
 /*
@@ -68,31 +94,19 @@
 int pthread_switch_add_np(pthread_switch_routine_t);
 int pthread_switch_delete_np(pthread_switch_routine_t);
 int pthread_timedjoin_np(pthread_t, void **, const struct timespec *);
+void		pthread_lor_begin_np(struct pthread_lock_order_np *);
+int		pthread_lor_next_np(struct pthread_lock_order_np *);
+void		pthread_lor_end_np(struct pthread_lock_order_np *);
+void		pthread_lor_clear_np(void);
 
 #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 *);
-int		pthread_getstatistics_next_np(struct pthread_statistics_np *);
-void		pthread_getstatistics_end_np(struct pthread_statistics_np *);
-void		pthread_resetstatistics_np(void);
-void		pthread_lockprof_enable_np(void);
-void		pthread_lockprof_disable_np(void);
+void		pthread_statistics_begin_np(struct pthread_statistics_np *);
+int		pthread_statistics_next_np(struct pthread_statistics_np *);
+void		pthread_statistics_end_np(struct pthread_statistics_np *);
+void		pthread_statistics_reset_np(void);
+void		pthread_statistics_enable_np(void);
+void		pthread_statistics_disable_np(void);
 
 #endif
 

Modified: soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c	Tue Jul 10 20:59:35 2012	(r239255)
+++ soc2012/gmiller/locking-head/lib/libthr/thread/thr_profile.c	Tue Jul 10 21:27:15 2012	(r239256)
@@ -284,7 +284,7 @@
 }
 
 void
-pthread_getstatistics_begin_np(struct pthread_statistics_np *stats)
+pthread_statistics_begin_np(struct pthread_statistics_np *stats)
 {
 	stats->_pvt = malloc(sizeof(struct _pthread_statistics_private));
 	stats->_pvt->hash = 0;
@@ -292,13 +292,13 @@
 }
 
 int
-pthread_getstatistics_next_np(struct pthread_statistics_np *stats)
+pthread_statistics_next_np(struct pthread_statistics_np *stats)
 {
 	return (find_next_record(stats));
 }
 
 void
-pthread_getstatistics_end_np(struct pthread_statistics_np *stats)
+pthread_statistics_end_np(struct pthread_statistics_np *stats)
 {
 	if (stats->_pvt != NULL) {
 		free(stats->_pvt);
@@ -307,7 +307,7 @@
 }
 
 void
-pthread_resetstatistics_np()
+pthread_statistics_reset_np()
 {
 	struct pthread *curthread = _get_curthread();
 	u_int hash;
@@ -334,13 +334,13 @@
 }
 
 void
-pthread_lockprof_enable_np()
+pthread_statistics_enable_np()
 {
 	lockprof_enabled = 1;
 }
 
 void
-pthread_lockprof_disable_np()
+pthread_statistics_disable_np()
 {
 	lockprof_enabled = 0;
 }

Modified: soc2012/gmiller/locking-head/lib/libwitness/Makefile
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/Makefile	Tue Jul 10 20:59:35 2012	(r239255)
+++ soc2012/gmiller/locking-head/lib/libwitness/Makefile	Tue Jul 10 21:27:15 2012	(r239256)
@@ -4,7 +4,7 @@
 
 LIB=		witness
 SHLIB_MAJOR=	1
-SRCS=		wrappers.c graph.c lists.c
+SRCS=		wrappers.c graph.c lists.c logs.c
 DPADD=		${LIBTHR}
 LDADD=		-lthr
 

Modified: soc2012/gmiller/locking-head/lib/libwitness/lists.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/lists.c	Tue Jul 10 20:59:35 2012	(r239255)
+++ soc2012/gmiller/locking-head/lib/libwitness/lists.c	Tue Jul 10 21:27:15 2012	(r239256)
@@ -57,7 +57,7 @@
 	SLIST_INSERT_HEAD(&lock_head, entry, lock_next);
 
 	if (next != NULL && insert_lock(entry, next) < 0) {
-		puts("LoR detected.");
+		log_reversal(entry, next);
 	}
 
 	printf("inserted lock %p\n", lock);

Added: soc2012/gmiller/locking-head/lib/libwitness/logs.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2012/gmiller/locking-head/lib/libwitness/logs.c	Tue Jul 10 21:27:15 2012	(r239256)
@@ -0,0 +1,39 @@
+/*-
+ * Copyright (c) 2012 Greg Miller <gmiller@freebsd.org>..
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include "witness.h"
+
+void
+log_reversal(void *lock, void *previous)
+{
+	struct pthread_lock_order_np *entry;
+
+	entry = malloc(sizeof(struct pthread_lock_order_np));
+	entry->lock_first = previous;
+	entry->lock_second = lock;
+}
+

Modified: soc2012/gmiller/locking-head/lib/libwitness/witness.h
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/witness.h	Tue Jul 10 20:59:35 2012	(r239255)
+++ soc2012/gmiller/locking-head/lib/libwitness/witness.h	Tue Jul 10 21:27:15 2012	(r239256)
@@ -28,6 +28,7 @@
 #include <sys/queue.h>
 
 #include <pthread.h>
+#include <pthread_np.h>
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -48,3 +49,5 @@
 void	remove_lock(void *lock);
 
 int	insert_lock(void *new_lock, void *previous);
+
+void	log_reversal(void *lock, void *previous);

Modified: soc2012/gmiller/locking-head/tools/regression/lib/libthr/lockprof/lock-cycle.c
==============================================================================
--- soc2012/gmiller/locking-head/tools/regression/lib/libthr/lockprof/lock-cycle.c	Tue Jul 10 20:59:35 2012	(r239255)
+++ soc2012/gmiller/locking-head/tools/regression/lib/libthr/lockprof/lock-cycle.c	Tue Jul 10 21:27:15 2012	(r239256)
@@ -49,7 +49,7 @@
 void
 reset_stats()
 {
-	pthread_resetstatistics_np();
+	pthread_statistics_reset_np();
 }
 
 void *
@@ -72,7 +72,7 @@
 	pthread_t thread1;
 	pthread_t thread2;
 
-	pthread_resetstatistics_np();
+	pthread_statistics_reset_np();
 
 	pthread_create(&thread1, NULL, conflict_thread_func, NULL);
 	pthread_create(&thread2, NULL, conflict_thread_func, NULL);
@@ -122,17 +122,17 @@
 	struct pthread_statistics_np stats;
 	long		tm;
 
-	pthread_getstatistics_begin_np(&stats);
-	while (pthread_getstatistics_next_np(&stats)) {
+	pthread_statistics_begin_np(&stats);
+	while (pthread_statistics_next_np(&stats)) {
 		record_count++;
 	}
-	pthread_getstatistics_end_np(&stats);
+	pthread_statistics_end_np(&stats);
 
 	check(record_count == 1);
 
-	pthread_getstatistics_begin_np(&stats);
-	pthread_getstatistics_next_np(&stats);
-	pthread_getstatistics_end_np(&stats);
+	pthread_statistics_begin_np(&stats);
+	pthread_statistics_next_np(&stats);
+	pthread_statistics_end_np(&stats);
 
 	check(strcmp(stats.file, "lock-cycle.c") == 0);
 	check(stats.line == 16);
@@ -160,17 +160,17 @@
 	struct pthread_statistics_np stats;
 	long		tm;
 
-	pthread_getstatistics_begin_np(&stats);
-	while (pthread_getstatistics_next_np(&stats)) {
+	pthread_statistics_begin_np(&stats);
+	while (pthread_statistics_next_np(&stats)) {
 		record_count++;
 	}
-	pthread_getstatistics_end_np(&stats);
+	pthread_statistics_end_np(&stats);
 
 	check(record_count == 1);
 
-	pthread_getstatistics_begin_np(&stats);
-	pthread_getstatistics_next_np(&stats);
-	pthread_getstatistics_end_np(&stats);
+	pthread_statistics_begin_np(&stats);
+	pthread_statistics_next_np(&stats);
+	pthread_statistics_end_np(&stats);
 
 	check(strcmp(stats.file, "lock-cycle.c") == 0);
 	check(stats.line == 16);
@@ -193,11 +193,11 @@
 	int		record_count = 0;
 	struct pthread_statistics_np stats;
 
-	pthread_getstatistics_begin_np(&stats);
-	while (pthread_getstatistics_next_np(&stats)) {
+	pthread_statistics_begin_np(&stats);
+	while (pthread_statistics_next_np(&stats)) {
 		record_count++;
 	}
-	pthread_getstatistics_end_np(&stats);
+	pthread_statistics_end_np(&stats);
 
 	check(record_count == 0);
 }
@@ -209,17 +209,17 @@
 	struct pthread_statistics_np stats;
 	long		tm;
 
-	pthread_getstatistics_begin_np(&stats);
-	while (pthread_getstatistics_next_np(&stats)) {
+	pthread_statistics_begin_np(&stats);
+	while (pthread_statistics_next_np(&stats)) {
 		record_count++;
 	}
-	pthread_getstatistics_end_np(&stats);
+	pthread_statistics_end_np(&stats);
 
 	check(record_count == 1);
 
-	pthread_getstatistics_begin_np(&stats);
-	pthread_getstatistics_next_np(&stats);
-	pthread_getstatistics_end_np(&stats);
+	pthread_statistics_begin_np(&stats);
+	pthread_statistics_next_np(&stats);
+	pthread_statistics_end_np(&stats);
 
 	check(stats.contest_count == 1);
 



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