]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
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 4ed8c7c91b3f68308091702c9e8691a7f249bc2c..8e7be7771e3f7e38ddd09526a624c6663c9279f9 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 267ebcb170fa4249574b8395a314e87682f93aa4..81daa78ad4cc541a07063d03a9d35b3113aa2e31 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 3e691db978096cba7a0c2efeead60d9e9f034e6c..72f668351ceada457e3fd1f8b3e53e791ba63351 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 8b020d1053ee748f7ec5d29a890689b991089c31..3340f63f5e1dc6878d6a708db35d87cacc836390 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 c4e176484246ac7baf77473fb476c5edae14d0a4..9d73b87708340352b4dfa6253e0bdf61f176b8ed 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 6f0c2823caac2c677a41d826e8f1659f851b2b8f..632e6d48ad8bd26ab25569cfaf21bfd8f0fb43d7 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 2b18048b8a5618f4239b88a7ff3a5ac7c6e591af..98f30c7363b906074588369c0c2c9cb79d154d6b 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 */