socsvn commit: r239498 - in soc2012/gmiller/locking-head: . include lib/libwitness

gmiller at FreeBSD.org gmiller at FreeBSD.org
Tue Jul 17 15:49:38 UTC 2012


Author: gmiller
Date: Tue Jul 17 15:49:35 2012
New Revision: 239498
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=239498

Log:
   r239511 at FreeBSD-dev:  root | 2012-07-14 14:00:40 -0500
   Implement pthread_lockorder_set_np() and partially implement
   pthread_lockorder_bless_np().

Modified:
  soc2012/gmiller/locking-head/   (props changed)
  soc2012/gmiller/locking-head/include/pthread_np.h
  soc2012/gmiller/locking-head/lib/libwitness/lockinfo.c
  soc2012/gmiller/locking-head/lib/libwitness/witness.h
  soc2012/gmiller/locking-head/lib/libwitness/wrappers.c

Modified: soc2012/gmiller/locking-head/include/pthread_np.h
==============================================================================
--- soc2012/gmiller/locking-head/include/pthread_np.h	Tue Jul 17 15:48:43 2012	(r239497)
+++ soc2012/gmiller/locking-head/include/pthread_np.h	Tue Jul 17 15:49:35 2012	(r239498)
@@ -107,8 +107,8 @@
 int		pthread_lor_next_np(struct pthread_lor_np *);
 void		pthread_lor_end_np(struct pthread_lor_np *);
 void		pthread_lor_clear_np(void);
-void		pthread_lockorder_bless_np(void *, void *);
-void		pthread_lockorder_set_np(void *first, void *second);
+int		pthread_lockorder_bless_np(void *, void *);
+int		pthread_lockorder_set_np(void *first, void *second);
 void		pthread_lockorder_reset_np(void);
 void		pthread_lockorder_begin_np(struct pthread_lockorder_np *);
 int		pthread_lockorder_next_np(struct pthread_lockorder_np *);

Modified: soc2012/gmiller/locking-head/lib/libwitness/lockinfo.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/lockinfo.c	Tue Jul 17 15:48:43 2012	(r239497)
+++ soc2012/gmiller/locking-head/lib/libwitness/lockinfo.c	Tue Jul 17 15:49:35 2012	(r239498)
@@ -47,6 +47,7 @@
 		info->lock = lock;
 		info->child = NULL;
 		info->sibling = NULL;
+		SLIST_INIT(&info->bless_head);
 		SLIST_INSERT_HEAD(&lock_info_head, info, lock_info_next);
 	}
 

Modified: soc2012/gmiller/locking-head/lib/libwitness/witness.h
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/witness.h	Tue Jul 17 15:48:43 2012	(r239497)
+++ soc2012/gmiller/locking-head/lib/libwitness/witness.h	Tue Jul 17 15:49:35 2012	(r239498)
@@ -32,12 +32,18 @@
 #include <pthread_np.h>
 #include <stdlib.h>
 
+struct blessing {
+	SLIST_ENTRY(blessing) bless_next;
+	struct lock_info *lock;
+};
+
 struct lock_info {
 	SLIST_ENTRY(lock_info) lock_info_next;
 	void		*lock;
 	int		active;
 	struct lock_info *child;
 	struct lock_info *sibling;
+	SLIST_HEAD(bless_head, blessing) bless_head;
 };
 
 extern pthread_mutex_t witness_mtx;

Modified: soc2012/gmiller/locking-head/lib/libwitness/wrappers.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/wrappers.c	Tue Jul 17 15:48:43 2012	(r239497)
+++ soc2012/gmiller/locking-head/lib/libwitness/wrappers.c	Tue Jul 17 15:49:35 2012	(r239498)
@@ -262,3 +262,35 @@
 
 	return (0);
 }
+
+int
+pthread_lockorder_bless_np(void *first_addr, void *second_addr)
+{
+	struct lock_info *first;
+	struct lock_info *second;
+	struct blessing *first_bless;
+	struct blessing *second_bless = NULL;
+
+	first = lookup_lock(first_addr);
+	second = lookup_lock(second_addr);
+
+	first_bless = malloc(sizeof(struct blessing));
+	if (first_bless != NULL) {
+		second_bless = malloc(sizeof(struct blessing));
+		if (second_bless == NULL) {
+			free(first_bless);
+		}
+	}
+
+	if (second_bless == NULL) {
+		return (ENOMEM);
+	}
+
+	first_bless->lock = second;
+	SLIST_INSERT_HEAD(&first->bless_head, first_bless, bless_next);
+
+	second_bless->lock = first;
+	SLIST_INSERT_HEAD(&second->bless_head, second_bless, bless_next);
+
+	return (0);
+}


More information about the svn-soc-all mailing list