rx: Add rx_NewThreadId function
authorSimon Wilkinson <sxw@your-file-system.com>
Tue, 28 Sep 2010 22:48:50 +0000 (23:48 +0100)
committerJeffrey Altman <jaltman@openafs.org>
Thu, 30 Sep 2010 13:09:22 +0000 (06:09 -0700)
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 <jaltman@openafs.org>
Tested-by: Jeffrey Altman <jaltman@openafs.org>

src/libafsrpc/afsrpc.def
src/rx/rx.c
src/rx/rx_globals.h
src/rx/rx_prototypes.h
src/rx/rx_pthread.c
src/viced/viced.c
src/vol/fssync-server.c

index 4ed8c7c..8e7be77 100755 (executable)
@@ -261,6 +261,7 @@ EXPORTS
         rx_SetConnSecondsUntilNatPing           @266
         rx_GetServiceSpecific                   @267
         rx_SetServiceSpecific                   @268
+       rx_NewThreadId                          @269
 
 ; for performance testing
         rx_TSFPQGlobSize                        @2001 DATA
index 267ebcb..81daa78 100644 (file)
@@ -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
index 3e691db..72f6683 100644 (file)
@@ -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
index 8b020d1..3340f63 100644 (file)
@@ -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);
index c4e1764..9d73b87 100644 (file)
@@ -42,6 +42,7 @@
 #include <assert.h>
 #include <rx/rx_pthread.h>
 #include <rx/rx_clock.h>
+#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;
 }
index 6f0c282..632e6d4 100644 (file)
@@ -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));
index 2b18048..98f30c7 100644 (file)
@@ -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 */