From a3c7d9ee037c85297fd2b1932d47c40b64130676 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Tue, 28 Sep 2010 23:48:50 +0100 Subject: [PATCH] rx: Add rx_NewThreadId function The fileserver and the fsync server were locking an internal RX mutex, and incrementing an internal counter in order to obtain fake pthread thread IDs. Instead of letting them muck around in the internals of RX, provide an API that can be called to obtain a ThreadId counter, and use that API throughout the code. Change-Id: I68f41d1486cdafeb757da2c0df899ae1ca2b2bfc Reviewed-on: http://gerrit.openafs.org/2859 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/libafsrpc/afsrpc.def | 1 + src/rx/rx.c | 2 +- src/rx/rx_globals.h | 3 --- src/rx/rx_prototypes.h | 1 + src/rx/rx_pthread.c | 18 +++++++++++------- src/viced/viced.c | 6 ++---- src/vol/fssync-server.c | 4 +--- 7 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/libafsrpc/afsrpc.def b/src/libafsrpc/afsrpc.def index 4ed8c7c..8e7be77 100755 --- a/src/libafsrpc/afsrpc.def +++ b/src/libafsrpc/afsrpc.def @@ -261,6 +261,7 @@ EXPORTS rx_SetConnSecondsUntilNatPing @266 rx_GetServiceSpecific @267 rx_SetServiceSpecific @268 + rx_NewThreadId @269 ; for performance testing rx_TSFPQGlobSize @2001 DATA diff --git a/src/rx/rx.c b/src/rx/rx.c index 267ebcb..81daa78 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -287,7 +287,7 @@ assert(pthread_once(&rx_once_init, rxi_InitPthread)==0) /* * The rx_pthread_mutex mutex protects the following global variables: - * rxi_pthread_hinum + * rxi_fcfs_thread_num */ #else #define INIT_PTHREAD_LOCKS diff --git a/src/rx/rx_globals.h b/src/rx/rx_globals.h index 3e691db..72f6683 100644 --- a/src/rx/rx_globals.h +++ b/src/rx/rx_globals.h @@ -616,9 +616,6 @@ EXT int rxi_callAbortDelay GLOBALSINIT(3000); #if defined(AFS_PTHREAD_ENV) EXT int rxi_fcfs_thread_num GLOBALSINIT(0); EXT pthread_key_t rx_thread_id_key; -/* keep track of pthread numbers - protected by rx_stats_mutex, - * except in rx_Init() before mutex exists! */ -EXT int rxi_pthread_hinum GLOBALSINIT(0); #else #define rxi_fcfs_thread_num (0) #endif diff --git a/src/rx/rx_prototypes.h b/src/rx/rx_prototypes.h index 8b020d1..3340f63 100644 --- a/src/rx/rx_prototypes.h +++ b/src/rx/rx_prototypes.h @@ -577,6 +577,7 @@ extern int rxi_AdjustDgramPackets(int frags, int mtu); /* rx_pthread.c */ +extern int rx_NewThreadId(void); extern void rxi_Delay(int sec); extern void rxi_InitializeThreadSupport(void); extern void rxi_StartServerProc(void *(*proc) (void *), int stacksize); diff --git a/src/rx/rx_pthread.c b/src/rx/rx_pthread.c index c4e1764..9d73b87 100644 --- a/src/rx/rx_pthread.c +++ b/src/rx/rx_pthread.c @@ -42,6 +42,7 @@ #include #include #include +#include "rx_atomic.h" /* Set rx_pthread_event_rescheduled if event_handler should just try * again instead of sleeping. @@ -67,6 +68,13 @@ static int listeners_started = 0; afs_kmutex_t rx_clock_mutex; struct clock rxi_clockNow; +static rx_atomic_t threadHiNum; + +int +rx_NewThreadId(void) { + return rx_atomic_inc_and_read(&threadHiNum); +} + /* * Delay the current thread the specified number of seconds. */ @@ -298,7 +306,7 @@ rx_ServerProc(void * dummy) * thread... chose the latter. */ MUTEX_ENTER(&rx_pthread_mutex); - threadID = ++rxi_pthread_hinum; + threadID = rx_NewThreadId(); if (rxi_fcfs_thread_num == 0 && rxi_fcfs_thread_num != threadID) rxi_fcfs_thread_num = threadID; MUTEX_EXIT(&rx_pthread_mutex); @@ -355,9 +363,7 @@ rxi_StartListener(void) dpf(("Unable to create Rx event handling thread\n")); assert(0); } - MUTEX_ENTER(&rx_pthread_mutex); - ++rxi_pthread_hinum; - MUTEX_EXIT(&rx_pthread_mutex); + rx_NewThreadId(); AFS_SIGSET_RESTORE(); MUTEX_ENTER(&listener_mutex); @@ -394,9 +400,7 @@ rxi_Listen(osi_socket sock) dpf(("Unable to create socket listener thread\n")); assert(0); } - MUTEX_ENTER(&rx_pthread_mutex); - ++rxi_pthread_hinum; - MUTEX_EXIT(&rx_pthread_mutex); + rx_NewThreadId(); AFS_SIGSET_RESTORE(); return 0; } diff --git a/src/viced/viced.c b/src/viced/viced.c index 6f0c282..632e6d4 100644 --- a/src/viced/viced.c +++ b/src/viced/viced.c @@ -441,10 +441,8 @@ setThreadId(char *s) { #if defined(AFS_PTHREAD_ENV) && !defined(AFS_NT40_ENV) /* set our 'thread-id' so that the host hold table works */ - MUTEX_ENTER(&rx_stats_mutex); /* protects rxi_pthread_hinum */ - ++rxi_pthread_hinum; - pthread_setspecific(rx_thread_id_key, (void *)(intptr_t)rxi_pthread_hinum); - MUTEX_EXIT(&rx_stats_mutex); + pthread_setspecific(rx_thread_id_key, + (void *)(intptr_t)rx_NewThreadId()); ViceLog(0, ("Set thread id %p for '%s'\n", pthread_getspecific(rx_thread_id_key), s)); diff --git a/src/vol/fssync-server.c b/src/vol/fssync-server.c index 2b18048..98f30c7 100644 --- a/src/vol/fssync-server.c +++ b/src/vol/fssync-server.c @@ -279,9 +279,7 @@ FSYNC_sync(void * args) #ifdef AFS_PTHREAD_ENV /* set our 'thread-id' so that the host hold table works */ - MUTEX_ENTER(&rx_stats_mutex); /* protects rxi_pthread_hinum */ - tid = ++rxi_pthread_hinum; - MUTEX_EXIT(&rx_stats_mutex); + tid = rx_NewThreadId(); pthread_setspecific(rx_thread_id_key, (void *)(intptr_t)tid); Log("Set thread id %d for FSYNC_sync\n", tid); #endif /* AFS_PTHREAD_ENV */ -- 1.9.4