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 4ed8c7c91..8e7be7771 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 267ebcb17..81daa78ad 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 3e691db97..72f668351 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 8b020d105..3340f63f5 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 c4e176484..9d73b8770 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 6f0c2823c..632e6d48a 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 2b18048b8..98f30c736 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 */ -- 2.39.5