Author: bart Date: 2008-03-01 10:49:37 +0000 (Sat, 01 Mar 2008) New Revision: 7519
Log: Eliminated per-thread start/stop recording mechanism, which should make DRD a little bit faster. malloc()/free() is now intercepted on all platforms instead of just on i386. Modified: trunk/exp-drd/Makefile.am trunk/exp-drd/drd_clientreq.c trunk/exp-drd/drd_clientreq.h trunk/exp-drd/drd_intercepts.c trunk/exp-drd/drd_main.c trunk/exp-drd/drd_thread.c trunk/exp-drd/drd_thread.h trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp2 trunk/exp-drd/tests/tc22_exit_w_lock.stderr.exp-64bit Modified: trunk/exp-drd/Makefile.am =================================================================== --- trunk/exp-drd/Makefile.am 2008-03-01 07:41:17 UTC (rev 7518) +++ trunk/exp-drd/Makefile.am 2008-03-01 10:49:37 UTC (rev 7519) @@ -28,42 +28,47 @@ vgpreload_exp_drd_x86_linux_so_CCASFLAGS = $(AM_CCASFLAGS_X86_LINUX) vgpreload_exp_drd_x86_linux_so_DEPENDENCIES = $(LIBREPLACEMALLOC_X86_LINUX) vgpreload_exp_drd_x86_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_X86_LINUX)\ - $(LIBREPLACEMALLOC_LDFLAGS_X86_LINUX) + $(LIBREPLACEMALLOC_LDFLAGS_X86_LINUX) vgpreload_exp_drd_amd64_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON) vgpreload_exp_drd_amd64_linux_so_CPPFLAGS = $(AM_CPPFLAGS_AMD64_LINUX) vgpreload_exp_drd_amd64_linux_so_CFLAGS = $(AM_CFLAGS_AMD64_LINUX) $(AM_CFLAGS_PIC) vgpreload_exp_drd_amd64_linux_so_CCASFLAGS = $(AM_CCASFLAGS_AMD64_LINUX) vgpreload_exp_drd_amd64_linux_so_DEPENDENCIES = -vgpreload_exp_drd_amd64_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_AMD64_LINUX) +vgpreload_exp_drd_amd64_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_AMD64_LINUX)\ + $(LIBREPLACEMALLOC_LDFLAGS_AMD64_LINUX) vgpreload_exp_drd_ppc32_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON) vgpreload_exp_drd_ppc32_linux_so_CPPFLAGS = $(AM_CPPFLAGS_PPC32_LINUX) vgpreload_exp_drd_ppc32_linux_so_CFLAGS = $(AM_CFLAGS_PPC32_LINUX) $(AM_CFLAGS_PIC) vgpreload_exp_drd_ppc32_linux_so_CCASFLAGS = $(AM_CCASFLAGS_PPC32_LINUX) vgpreload_exp_drd_ppc32_linux_so_DEPENDENCIES = -vgpreload_exp_drd_ppc32_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC32_LINUX) +vgpreload_exp_drd_ppc32_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC32_LINUX)\ + $(LIBREPLACEMALLOC_LDFLAGS_PPC32_LINUX) vgpreload_exp_drd_ppc64_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON) vgpreload_exp_drd_ppc64_linux_so_CPPFLAGS = $(AM_CPPFLAGS_PPC64_LINUX) vgpreload_exp_drd_ppc64_linux_so_CFLAGS = $(AM_CFLAGS_PPC64_LINUX) $(AM_CFLAGS_PIC) vgpreload_exp_drd_ppc64_linux_so_CCASFLAGS = $(AM_CCASFLAGS_PPC64_LINUX) vgpreload_exp_drd_ppc64_linux_so_DEPENDENCIES = -vgpreload_exp_drd_ppc64_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC64_LINUX) +vgpreload_exp_drd_ppc64_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC64_LINUX)\ + $(LIBREPLACEMALLOC_LDFLAGS_PPC64_LINUX) vgpreload_exp_drd_ppc32_aix5_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON) vgpreload_exp_drd_ppc32_aix5_so_CPPFLAGS = $(AM_CPPFLAGS_PPC32_AIX5) vgpreload_exp_drd_ppc32_aix5_so_CFLAGS = $(AM_CFLAGS_PPC32_AIX5) $(AM_CFLAGS_PIC) vgpreload_exp_drd_ppc32_aix5_so_CCASFLAGS = $(AM_CCASFLAGS_PPC32_AIX5) vgpreload_exp_drd_ppc32_aix5_so_DEPENDENCIES = -vgpreload_exp_drd_ppc32_aix5_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC32_AIX5) +vgpreload_exp_drd_ppc32_aix5_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC32_AIX5)\ + $(LIBREPLACEMALLOC_LDFLAGS_PPC32_AIX5) vgpreload_exp_drd_ppc64_aix5_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON) vgpreload_exp_drd_ppc64_aix5_so_CPPFLAGS = $(AM_CPPFLAGS_PPC64_AIX5) vgpreload_exp_drd_ppc64_aix5_so_CFLAGS = $(AM_CFLAGS_PPC64_AIX5) $(AM_CFLAGS_PIC) vgpreload_exp_drd_ppc64_aix5_so_CCASFLAGS = $(AM_CCASFLAGS_PPC64_AIX5) vgpreload_exp_drd_ppc64_aix5_so_DEPENDENCIES = -vgpreload_exp_drd_ppc64_aix5_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC64_AIX5) +vgpreload_exp_drd_ppc64_aix5_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC64_AIX5)\ + $(LIBREPLACEMALLOC_LDFLAGS_PPC64_AIX5) DRD_SOURCES_COMMON = \ Modified: trunk/exp-drd/drd_clientreq.c =================================================================== --- trunk/exp-drd/drd_clientreq.c 2008-03-01 07:41:17 UTC (rev 7518) +++ trunk/exp-drd/drd_clientreq.c 2008-03-01 10:49:37 UTC (rev 7519) @@ -94,11 +94,11 @@ break; case VG_USERREQ__DRD_START_SUPPRESSION: - drd_start_suppression(arg[1], arg[1] + arg[2], "client"); + drd_start_suppression(arg[1], arg[2], "client"); break; case VG_USERREQ__DRD_FINISH_SUPPRESSION: - drd_finish_suppression(arg[1], arg[1] + arg[2]); + drd_finish_suppression(arg[1], arg[2]); break; case VG_USERREQ__DRD_SUPPRESS_CURRENT_STACK: @@ -110,14 +110,6 @@ thread_new_segment(PtThreadIdToDrdThreadId(arg[1])); break; - case VG_USERREQ__DRD_START_RECORDING: - thread_start_recording(PtThreadIdToDrdThreadId(arg[1])); - break; - - case VG_USERREQ__DRD_STOP_RECORDING: - thread_stop_recording(PtThreadIdToDrdThreadId(arg[1])); - break; - case VG_USERREQ__SET_PTHREADID: thread_set_pthreadid(thread_get_running_tid(), arg[1]); break; Modified: trunk/exp-drd/drd_clientreq.h =================================================================== --- trunk/exp-drd/drd_clientreq.h 2008-03-01 07:41:17 UTC (rev 7518) +++ trunk/exp-drd/drd_clientreq.h 2008-03-01 10:49:37 UTC (rev 7519) @@ -16,11 +16,11 @@ /* To tell the drd tool to suppress data race detection on the specified */ /* address range. */ VG_USERREQ__DRD_START_SUPPRESSION, - /* args: start address, size in bytes */ + /* args: start address, end address */ /* To tell the drd tool no longer to suppress data race detection on the */ /* specified address range. */ VG_USERREQ__DRD_FINISH_SUPPRESSION, - /* args: start address, size in bytes */ + /* args: start address, end address */ /* Ask drd to suppress data race reports on all currently allocated stack */ /* data of the current thread. */ VG_USERREQ__DRD_SUPPRESS_CURRENT_STACK, @@ -29,15 +29,6 @@ VG_USERREQ__DRD_START_NEW_SEGMENT, /* args: POSIX thread ID. */ - /* To tell the drd tool to start again recording memory accesses for the */ - /* specified thread. */ - VG_USERREQ__DRD_START_RECORDING, - /* args: POSIX thread ID. */ - /* To tell the drd tool to stop recording memory accesses for the */ - /* specified thread. */ - VG_USERREQ__DRD_STOP_RECORDING, - /* args: POSIX thread ID. */ - /* Tell the core the pthread_t of the running thread */ VG_USERREQ__SET_PTHREADID, /* args: pthread_t. */ Modified: trunk/exp-drd/drd_intercepts.c =================================================================== --- trunk/exp-drd/drd_intercepts.c 2008-03-01 07:41:17 UTC (rev 7518) +++ trunk/exp-drd/drd_intercepts.c 2008-03-01 10:49:37 UTC (rev 7519) @@ -40,7 +40,8 @@ originates from Valgrind. ------------------------------------------------------------------ */ -// Make sure pthread_spinlock_t is available on glibc 2.3.2 systems. +// Make sure pthread_spinlock_t is available when compiling with older glibc +// versions (2.3 or before). #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif @@ -125,32 +126,9 @@ { int res; VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_START_SUPPRESSION, - p, size, 0, 0, 0); + p, (char*)p + size, 0, 0, 0); } -#if 0 -static void vg_finish_suppression(const void* const p, size_t const size) -{ - int res; - VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_FINISH_SUPPRESSION, - p, size, 0, 0, 0); -} -#endif - -static void vg_start_recording(void) -{ - int res; - VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_START_RECORDING, - pthread_self(), 0, 0, 0, 0); -} - -static void vg_stop_recording(void) -{ - int res; - VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_STOP_RECORDING, - pthread_self(), 0, 0, 0, 0); -} - static void vg_set_joinable(const pthread_t tid, const int joinable) { int res; @@ -249,9 +227,7 @@ pthread_cond_init(&vgargs.cond, 0); pthread_mutex_lock(&vgargs.mutex); #endif - vg_stop_recording(); CALL_FN_W_WWWW(ret, fn, thread, attr, vg_thread_wrapper, &vgargs); - vg_start_recording(); #if 0 pthread_cond_wait(&vgargs.cond, &vgargs.mutex); pthread_mutex_unlock(&vgargs.mutex); Modified: trunk/exp-drd/drd_main.c =================================================================== --- trunk/exp-drd/drd_main.c 2008-03-01 07:41:17 UTC (rev 7518) +++ trunk/exp-drd/drd_main.c 2008-03-01 10:49:37 UTC (rev 7519) @@ -150,11 +150,9 @@ { Segment* sg; - thread_set_vg_running_tid(VG_(get_running_tid)()); + tl_assert(thread_get_running_tid() + == VgThreadIdToDrdThreadId(VG_(get_running_tid()))); - if (! thread_is_recording(thread_get_running_tid())) - return; - #if 1 if (drd_trace_mem || (addr == drd_trace_address)) { @@ -192,11 +190,9 @@ { Segment* sg; - thread_set_vg_running_tid(VG_(get_running_tid)()); + tl_assert(thread_get_running_tid() + == VgThreadIdToDrdThreadId(VG_(get_running_tid()))); - if (! thread_is_recording(thread_get_running_tid())) - return; - #if 1 if (drd_trace_mem || (addr == drd_trace_address)) { @@ -242,23 +238,50 @@ } } +static void drd_pre_mem_read_asciiz(const CorePart part, + const ThreadId tid, + Char* const s, + const Addr a) +{ + const char* p = (void*)a; + SizeT size = 0; + + /* Note: the expression '*p' reads client memory and may crash if the */ + /* client provided an invalid pointer ! */ + while (*p) + { + p++; + size++; + } + // To do: find out what a reasonable upper limit on 'size' is. + tl_assert(size < 4096); + if (size > 0) + { + drd_trace_load(a, size); + } +} + static void drd_post_mem_write(const CorePart part, const ThreadId tid, const Addr a, const SizeT size) { + thread_set_vg_running_tid(VG_(get_running_tid)()); if (size > 0) { drd_trace_store(a, size); } } -static void drd_start_using_mem(const Addr a1, const Addr a2) +static void drd_start_using_mem(const Addr a1, const SizeT len) { + const Addr a2 = a1 + len; + + tl_assert(a1 < a2); + thread_set_vg_running_tid(VG_(get_running_tid)()); - if (a1 <= drd_trace_address && drd_trace_address < a2 - && thread_is_recording(thread_get_running_tid())) + if (a1 <= drd_trace_address && drd_trace_address < a2) { VG_(message)(Vg_UserMsg, "start 0x%lx size %ld %s (tracing 0x%lx)", a1, a2 - a1, thread_get_name(thread_get_running_tid()), @@ -268,10 +291,13 @@ } } -static void drd_stop_using_mem(const Addr a1, const Addr a2) +static void drd_stop_using_mem(const Addr a1, const SizeT len) { - if (a1 <= drd_trace_address && drd_trace_address < a2 - && thread_is_recording(thread_get_running_tid())) + const Addr a2 = a1 + len; + + tl_assert(a1 < a2); + + if (a1 <= drd_trace_address && drd_trace_address < a2) { VG_(message)(Vg_UserMsg, "end 0x%lx size %ld %s (tracing 0x%lx)", a1, a2 - a1, thread_get_name(thread_get_running_tid()), @@ -284,13 +310,20 @@ drd_suppression_stop_using_mem(a1, a2); } +static +void drd_start_using_mem_w_perms(const Addr a, const SizeT len, + const Bool rr, const Bool ww, const Bool xx) +{ + drd_start_using_mem(a, len); +} + /* Called by the core when the stack of a thread grows, to indicate that */ /* the addresses in range [ a, a + len [ may now be used by the client. */ /* Assumption: stacks grow downward. */ static void drd_start_using_mem_stack(const Addr a, const SizeT len) { thread_set_stack_min(thread_get_running_tid(), a - VG_STACK_REDZONE_SZB); - drd_start_using_mem(a, a + len); + drd_start_using_mem(a, len); } /* Called by the core when the stack of a thread shrinks, to indicate that */ @@ -301,18 +334,17 @@ thread_set_vg_running_tid(VG_(get_running_tid)()); thread_set_stack_min(thread_get_running_tid(), a + len - VG_STACK_REDZONE_SZB); - drd_stop_using_mem(a, a + len); + drd_stop_using_mem(a, len); } -static void drd_start_using_mem_mmap(Addr a, SizeT len, - Bool rr, Bool ww, Bool xx) +static void drd_start_using_mem_stack_signal(const Addr a, const SizeT len) { - drd_start_using_mem(a, a + len); + drd_start_using_mem(a, len); } -static void drd_stop_using_mem_munmap(Addr a, SizeT len) +static void drd_stop_using_mem_stack_signal(Addr a, SizeT len) { - drd_stop_using_mem(a, a + len); + drd_stop_using_mem(a, len); } static @@ -797,15 +829,22 @@ drd_print_usage, drd_print_debug_usage); + // Error handling. drd_register_error_handlers(); // Core event tracking. VG_(track_pre_mem_read) (drd_pre_mem_read); + VG_(track_pre_mem_read_asciiz) (drd_pre_mem_read_asciiz); VG_(track_post_mem_write) (drd_post_mem_write); + VG_(track_new_mem_brk) (drd_start_using_mem); + VG_(track_new_mem_mmap) (drd_start_using_mem_w_perms); VG_(track_new_mem_stack) (drd_start_using_mem_stack); + VG_(track_new_mem_stack_signal) (drd_start_using_mem_stack_signal); + VG_(track_new_mem_startup) (drd_start_using_mem_w_perms); + VG_(track_die_mem_brk) (drd_stop_using_mem); + VG_(track_die_mem_munmap) (drd_stop_using_mem); VG_(track_die_mem_stack) (drd_stop_using_mem_stack); - VG_(track_new_mem_mmap) (drd_start_using_mem_mmap); - VG_(track_die_mem_munmap) (drd_stop_using_mem_munmap); + VG_(track_die_mem_stack_signal) (drd_stop_using_mem_stack_signal); VG_(track_start_client_code) (drd_start_client_code); VG_(track_pre_thread_ll_create) (drd_pre_thread_create); VG_(track_pre_thread_first_insn)(drd_post_thread_create); Modified: trunk/exp-drd/drd_thread.c =================================================================== --- trunk/exp-drd/drd_thread.c 2008-03-01 07:41:17 UTC (rev 7518) +++ trunk/exp-drd/drd_thread.c 2008-03-01 10:49:37 UTC (rev 7519) @@ -63,7 +63,6 @@ /// If true, indicates that there is a corresponding POSIX thread ID and /// a corresponding OS thread that is detached. Bool detached_posix_thread; - Bool is_recording; } ThreadInfo; @@ -155,7 +154,6 @@ VG_(snprintf)(s_threadinfo[i].name, sizeof(s_threadinfo[i].name), "thread %d", tid); s_threadinfo[i].name[sizeof(s_threadinfo[i].name) - 1] = 0; - s_threadinfo[i].is_recording = True; if (s_threadinfo[i].first != 0) VG_(printf)("drd thread id = %d\n", i); tl_assert(s_threadinfo[i].first == 0); @@ -723,26 +721,6 @@ } } -void thread_start_recording(const DrdThreadId tid) -{ - tl_assert(0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID); - tl_assert(! s_threadinfo[tid].is_recording); - s_threadinfo[tid].is_recording = True; -} - -void thread_stop_recording(const DrdThreadId tid) -{ - tl_assert(0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID); - tl_assert(s_threadinfo[tid].is_recording); - s_threadinfo[tid].is_recording = False; -} - -Bool thread_is_recording(const DrdThreadId tid) -{ - tl_assert(0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID); - return s_threadinfo[tid].is_recording; -} - void thread_print_all(void) { unsigned i; Modified: trunk/exp-drd/drd_thread.h =================================================================== --- trunk/exp-drd/drd_thread.h 2008-03-01 07:41:17 UTC (rev 7518) +++ trunk/exp-drd/drd_thread.h 2008-03-01 10:49:37 UTC (rev 7519) @@ -81,9 +81,6 @@ void thread_combine_vc(const DrdThreadId joiner, const DrdThreadId joinee); void thread_combine_vc2(const DrdThreadId tid, const VectorClock* const vc); void thread_stop_using_mem(const Addr a1, const Addr a2); -void thread_start_recording(const DrdThreadId tid); -void thread_stop_recording(const DrdThreadId tid); -Bool thread_is_recording(const DrdThreadId tid); void thread_print_all(void); void thread_report_races(const DrdThreadId tid); void thread_report_races_segment(const DrdThreadId tid, Modified: trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp2 =================================================================== --- trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp2 2008-03-01 07:41:17 UTC (rev 7518) +++ trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp2 2008-03-01 10:49:37 UTC (rev 7519) @@ -5,9 +5,6 @@ ---------------- pthread_create/join ---------------- -[1/1] mutex_init recursive mutex 0x........ -[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 0 -[1/1] mutex_unlock recursive mutex 0x........ rc 1 Conflicting store by thread 1 at 0x........ size 2 at 0x........: main (tc20_verifywrap.c:78) Allocation context: unknown @@ -115,7 +112,8 @@ [1/1] mutex_destroy error checking mutex 0x........ [1/1] mutex_destroy invalid mutex 0x........ [1/1] mutex_destroy invalid mutex 0x........ -[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1 +[1/1] mutex_init recursive mutex 0x........ +[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 0 [1/1] mutex_unlock recursive mutex 0x........ rc 1 [1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1 [1/1] mutex_unlock recursive mutex 0x........ rc 1 Modified: trunk/exp-drd/tests/tc22_exit_w_lock.stderr.exp-64bit =================================================================== --- trunk/exp-drd/tests/tc22_exit_w_lock.stderr.exp-64bit 2008-03-01 07:41:17 UTC (rev 7518) +++ trunk/exp-drd/tests/tc22_exit_w_lock.stderr.exp-64bit 2008-03-01 10:49:37 UTC (rev 7519) @@ -1,127 +1,6 @@ -Conflicting load by thread 1 at 0x........ size 4 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_cache_lock (offset 0, size 4) in libpthread-?.?.so, libpthread.so.0:BSS -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting store by thread 1 at 0x........ size 4 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_cache_lock (offset 0, size 4) in libpthread-?.?.so, libpthread.so.0:BSS -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting store by thread 1 at 0x........ size 8 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_used (offset 8, size 16) in libpthread-?.?.so, libpthread.so.0:Data -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting store by thread 1 at 0x........ size 8 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_used (offset 0, size 16) in libpthread-?.?.so, libpthread.so.0:Data -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting load by thread 1 at 0x........ size 8 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_cache (offset 0, size 16) in libpthread-?.?.so, libpthread.so.0:Data -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting store by thread 1 at 0x........ size 8 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_cache (offset 8, size 16) in libpthread-?.?.so, libpthread.so.0:Data -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting store by thread 1 at 0x........ size 8 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_cache (offset 0, size 16) in libpthread-?.?.so, libpthread.so.0:Data -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting load by thread 1 at 0x........ size 8 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_cache_actsize (offset 0, size 8) in libpthread-?.?.so, libpthread.so.0:BSS -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting store by thread 1 at 0x........ size 8 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_cache_actsize (offset 0, size 8) in libpthread-?.?.so, libpthread.so.0:BSS -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting load by thread 1 at 0x........ size 4 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_cache_lock (offset 0, size 4) in libpthread-?.?.so, libpthread.so.0:BSS -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - -Conflicting store by thread 1 at 0x........ size 4 - at 0x........: __deallocate_stack (in libpthread-?.?.so) - by 0x........: pthread_join (in libpthread-?.?.so) - by 0x........: pthread_join (drd_intercepts.c:?) - by 0x........: main (tc22_exit_w_lock.c:43) -Allocation context: stack_cache_lock (offset 0, size 4) in libpthread-?.?.so, libpthread.so.0:BSS -Other segment start (thread 2) - (thread finished, call stack no longer available) -Other segment end (thread 2) - (thread finished, call stack no longer available) - Mutex still locked at thread exit: address 0x........, recursion count 1, owner 3. at 0x........: pthread_join (drd_intercepts.c:?) by 0x........: main (tc22_exit_w_lock.c:43) -ERROR SUMMARY: 12 errors from 12 contexts (suppressed: 0 from 0) +ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Valgrind-developers mailing list Valgrind-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/valgrind-developers