From: Bart Van Assche Date: Thu, 2 Sep 2010 14:43:18 +0000 (+0000) Subject: Added the per-thread property 'on_alt_stack'. X-Git-Tag: svn/VALGRIND_3_6_0~131 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f9870efee2d7c05101d07eb369080fc0d45cbc43;p=thirdparty%2Fvalgrind.git Added the per-thread property 'on_alt_stack'. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11326 --- diff --git a/drd/drd_thread.c b/drd/drd_thread.c index f9edc6a06a..f10f077de0 100644 --- a/drd/drd_thread.c +++ b/drd/drd_thread.c @@ -181,6 +181,7 @@ static DrdThreadId DRD_(VgThreadIdToNewDrdThreadId)(const ThreadId tid) DRD_(g_threadinfo)[i].stack_startup = 0; DRD_(g_threadinfo)[i].stack_max = 0; DRD_(thread_set_name)(i, ""); + DRD_(g_threadinfo)[i].on_alt_stack = False; DRD_(g_threadinfo)[i].is_recording_loads = True; DRD_(g_threadinfo)[i].is_recording_stores = True; DRD_(g_threadinfo)[i].pthread_create_nesting_level = 0; @@ -420,6 +421,31 @@ SizeT DRD_(thread_get_stack_size)(const DrdThreadId tid) return DRD_(g_threadinfo)[tid].stack_size; } +Bool DRD_(thread_get_on_alt_stack)(const DrdThreadId tid) +{ + tl_assert(0 <= (int)tid && tid < DRD_N_THREADS + && tid != DRD_INVALID_THREADID); + return DRD_(g_threadinfo)[tid].on_alt_stack; +} + +void DRD_(thread_set_on_alt_stack)(const DrdThreadId tid, + const Bool on_alt_stack) +{ + tl_assert(0 <= (int)tid && tid < DRD_N_THREADS + && tid != DRD_INVALID_THREADID); + tl_assert(on_alt_stack == !!on_alt_stack); + DRD_(g_threadinfo)[tid].on_alt_stack = on_alt_stack; +} + +Int DRD_(thread_get_threads_on_alt_stack)(void) +{ + int i, n = 0; + + for (i = 1; i < DRD_N_THREADS; i++) + n += DRD_(g_threadinfo)[i].on_alt_stack; + return n; +} + /** * Clean up thread-specific data structures. Call this just after * pthread_join(). diff --git a/drd/drd_thread.h b/drd/drd_thread.h index d9651393e7..e0eb52a55a 100644 --- a/drd/drd_thread.h +++ b/drd/drd_thread.h @@ -77,6 +77,7 @@ typedef struct Addr stack_max; /**< Top of stack. */ SizeT stack_size; /**< Maximum size of stack. */ char name[64]; /**< User-assigned thread name. */ + Bool on_alt_stack; /** Indicates whether the Valgrind core knows about this thread. */ Bool vg_thread_exists; /** Indicates whether there is an associated POSIX thread ID. */ @@ -142,6 +143,10 @@ Addr DRD_(thread_get_stack_min)(const DrdThreadId tid); Addr DRD_(thread_get_stack_min_min)(const DrdThreadId tid); Addr DRD_(thread_get_stack_max)(const DrdThreadId tid); SizeT DRD_(thread_get_stack_size)(const DrdThreadId tid); +Bool DRD_(thread_get_on_alt_stack)(const DrdThreadId tid); +void DRD_(thread_set_on_alt_stack)(const DrdThreadId tid, + const Bool on_alt_stack); +Int DRD_(thread_get_threads_on_alt_stack)(void); void DRD_(thread_set_pthreadid)(const DrdThreadId tid, const PThreadId ptid); Bool DRD_(thread_get_joinable)(const DrdThreadId tid); void DRD_(thread_set_joinable)(const DrdThreadId tid, const Bool joinable);