From owner-svn-soc-all@FreeBSD.ORG Thu Jul 12 04:37:59 2012 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id A88B5106564A for ; Thu, 12 Jul 2012 04:37:57 +0000 (UTC) (envelope-from gmiller@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Thu, 12 Jul 2012 04:37:57 +0000 Date: Thu, 12 Jul 2012 04:37:57 +0000 From: gmiller@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20120712043757.A88B5106564A@hub.freebsd.org> Cc: Subject: socsvn commit: r239297 - in soc2012/gmiller/locking-head: . include lib/libwitness X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 Jul 2012 04:37:59 -0000 Author: gmiller Date: Thu Jul 12 04:37:56 2012 New Revision: 239297 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=239297 Log: r239323@FreeBSD-dev: root | 2012-07-03 20:22:26 -0500 Implement LoR log retrieval functions: * pthread_lor_begin_np() * pthread_lor_next_np() * pthread_lor_end_np() Implement LoR log clearing function pthread_lor_clear_np(). Modified: soc2012/gmiller/locking-head/ (props changed) soc2012/gmiller/locking-head/include/pthread_np.h soc2012/gmiller/locking-head/lib/libwitness/logs.c Modified: soc2012/gmiller/locking-head/include/pthread_np.h ============================================================================== --- soc2012/gmiller/locking-head/include/pthread_np.h Thu Jul 12 02:58:45 2012 (r239296) +++ soc2012/gmiller/locking-head/include/pthread_np.h Thu Jul 12 04:37:56 2012 (r239297) @@ -58,7 +58,10 @@ #endif +struct _pthread_lor_private; + struct pthread_lock_order_np { + struct _pthread_lor_private *_pvt; void *lock_first; void *lock_second; }; Modified: soc2012/gmiller/locking-head/lib/libwitness/logs.c ============================================================================== --- soc2012/gmiller/locking-head/lib/libwitness/logs.c Thu Jul 12 02:58:45 2012 (r239296) +++ soc2012/gmiller/locking-head/lib/libwitness/logs.c Thu Jul 12 04:37:56 2012 (r239297) @@ -27,13 +27,74 @@ #include "witness.h" +STAILQ_HEAD(lor_head, lor_entry) lor_head = STAILQ_HEAD_INITIALIZER(lor_head); + +struct lor_entry { + STAILQ_ENTRY(lor_entry) lor_next; + void *lock_first; + void *lock_second; +}; + +struct _pthread_lor_private { + struct lor_entry *last_record; +}; + void log_reversal(void *lock, void *previous) { - struct pthread_lock_order_np *entry; + struct lor_entry *entry; - entry = malloc(sizeof(struct pthread_lock_order_np)); + entry = malloc(sizeof(struct lor_entry)); entry->lock_first = previous; entry->lock_second = lock; + + STAILQ_INSERT_TAIL(&lor_head, entry, lor_next); +} + +void +pthread_lor_begin_np(struct pthread_lock_order_np *lor) +{ + lor->_pvt = malloc(sizeof(struct _pthread_lor_private)); + lor->_pvt->last_record = NULL; +} + +int +pthread_lor_next_np(struct pthread_lock_order_np *lor) +{ + if (lor->_pvt->last_record == NULL) { + lor->_pvt->last_record = STAILQ_FIRST(&lor_head); + } else { + lor->_pvt->last_record = + STAILQ_NEXT(lor->_pvt->last_record, lor_next); + } + + if (lor->_pvt->last_record == NULL) { + return (0); + } + + lor->lock_first = lor->_pvt->last_record->lock_first; + lor->lock_second = lor->_pvt->last_record->lock_second; + + return (1); } +void +pthread_lor_end_np(struct pthread_lock_order_np *lor) +{ + if (lor->_pvt != NULL) { + free(lor->_pvt); + lor->_pvt = NULL; + } +} + +void +pthread_lor_clear_np(void) +{ + struct lor_entry *lor; + struct lor_entry *lor_temp; + + STAILQ_FOREACH_SAFE(lor, &lor_head, lor_next, lor_temp) { + STAILQ_REMOVE(&lor_head, lor, lor_entry, lor_next); + free(lor); + } +}