From owner-svn-soc-all@FreeBSD.ORG Thu Aug 16 03:36:35 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 5E8E2106567E for ; Thu, 16 Aug 2012 03:36:33 +0000 (UTC) (envelope-from gmiller@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Thu, 16 Aug 2012 03:36:33 +0000 Date: Thu, 16 Aug 2012 03:36:33 +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: <20120816033633.5E8E2106567E@hub.freebsd.org> Cc: Subject: socsvn commit: r240424 - in soc2012/gmiller/locking-head: . include lib/libwitness tools/regression/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, 16 Aug 2012 03:36:35 -0000 Author: gmiller Date: Thu Aug 16 03:36:33 2012 New Revision: 240424 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=240424 Log: r240389@FreeBSD-dev: root | 2012-08-15 00:20:46 -0500 If USE_LIBUNWIND is present in src.conf, attempt to use devel/libunwind to generate backtraces for the lock acquisitions that resulted in a LoR. Added: soc2012/gmiller/locking-head/lib/libwitness/unwind.c Modified: soc2012/gmiller/locking-head/ (props changed) soc2012/gmiller/locking-head/include/pthread_np.h soc2012/gmiller/locking-head/lib/libwitness/Makefile soc2012/gmiller/locking-head/lib/libwitness/lists.c soc2012/gmiller/locking-head/lib/libwitness/logs.c soc2012/gmiller/locking-head/lib/libwitness/witness.h soc2012/gmiller/locking-head/lib/libwitness/xml.c soc2012/gmiller/locking-head/tools/regression/lib/libwitness/Makefile Modified: soc2012/gmiller/locking-head/include/pthread_np.h ============================================================================== Modified: soc2012/gmiller/locking-head/lib/libwitness/Makefile ============================================================================== Modified: soc2012/gmiller/locking-head/lib/libwitness/lists.c ============================================================================== Modified: soc2012/gmiller/locking-head/lib/libwitness/logs.c ============================================================================== Added: soc2012/gmiller/locking-head/lib/libwitness/unwind.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2012/gmiller/locking-head/lib/libwitness/unwind.c Thu Aug 16 03:36:33 2012 (r240424) @@ -0,0 +1,101 @@ +/*- + * Copyright (c) 2012 Greg Miller .. + * 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" + +char * +trace_str(struct backtrace *trace) +{ + char *buffer; + int length = 1; + struct stack_frame *frame; + int count = 0; + char line_buf[MAX_FRAME_ID_LENGTH + 4]; + + buffer = malloc(1); + if (buffer != NULL) { + buffer[0] = '\0'; + + SLIST_FOREACH(frame, trace, frame_next) { + if (strncmp(frame->id, "pthread_", 8) == 0) { + break; + } + + sprintf(line_buf, "%d: %s\n", count, frame->id); + + length += strlen(line_buf); + buffer = reallocf(buffer, length); + + strcat(buffer, line_buf); + + if (++count == 10) { + break; + } + } + } + + return (buffer); +} + +#ifdef USE_LIBUNWIND + +#include + +void +record_backtrace(struct backtrace *trace) +{ + unw_context_t context; + unw_cursor_t cursor; + struct stack_frame *frame; + unw_word_t offset; + + free_frame(trace); + + unw_getcontext(&context); + unw_init_local(&cursor, &context); + while (unw_step(&cursor) > 0) { + frame = malloc(sizeof(struct stack_frame)); + if (frame == NULL) { + return; + } + + unw_get_proc_name(&cursor, frame->id, MAX_FRAME_ID_LENGTH, + &offset); + + SLIST_INSERT_HEAD(trace, frame, frame_next); + } +} + +#else + +void +record_backtrace(struct backtrace *trace) +{ + trace = trace; +} + +#endif Modified: soc2012/gmiller/locking-head/lib/libwitness/witness.h ============================================================================== Modified: soc2012/gmiller/locking-head/lib/libwitness/xml.c ============================================================================== Modified: soc2012/gmiller/locking-head/tools/regression/lib/libwitness/Makefile ==============================================================================