thread-identification-routines-20010212
authorHartmut Reuter <reuter@rzg.mpg.de>
Mon, 12 Feb 2001 17:35:16 +0000 (17:35 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 12 Feb 2001 17:35:16 +0000 (17:35 +0000)
Needed to identify thread in serverlog for mrafs

src/lwp/Makefile
src/lwp/NTMakefile
src/lwp/lock.h
src/lwp/lwp.c
src/lwp/lwp_nt.c
src/lwp/threadname.c [new file with mode: 0644]

index cfacbe4..5d3c72c 100644 (file)
@@ -21,8 +21,8 @@ CFLAGS=${OPTIMIZE} -I${SRCDIR}include ${XCFLAGS}
 include ../config/Makefile.version
 
 LIBOBJS=lwp.o process.o lock.o iomgr.o timer.o fasttime.o preempt.o \
-       waitkey.o AFS_component_version_number.o
-LIBTOBJS=tlwp.o process.o lock.o tiomgr.o timer.o fasttime.o preempt.o AFS_component_version_number.o pthread.o
+       waitkey.o threadname.o AFS_component_version_number.o
+LIBTOBJS=tlwp.o process.o lock.o tiomgr.o timer.o fasttime.o preempt.o AFS_component_version_number.o pthread.o threadname.o
 
 noversion: install
 
@@ -97,6 +97,7 @@ lwp.o         : lwp.c lwp.h
 lock.o         : lock.c lock.h lwp.h
 timer.o                : timer.c
 fasttime.o     : fasttime.c
+threadname.o    : threadname.c
 
 exc_handling.o : exc_handling.c
 
index 2ddc046..5fcb9e5 100644 (file)
@@ -16,6 +16,7 @@ LIBOBJS = lock.obj \
          timer.obj\
          fasttime.obj \
          waitkey.obj \
+         threadname.obj \
          AFS_component_version_number.obj
 
 LIBFILE = $(DESTDIR)\lib\afslwp.lib
index ab19111..7aff635 100644 (file)
@@ -87,6 +87,18 @@ void Lock_Destroy(struct Lock *lock);
            LOCK_UNLOCK(lock) \
        ENDMAC
     
+#define ObtainReadLockNoBlock(lock, code)\
+        BEGINMAC \
+            LOCK_LOCK(lock) \
+            if (!((lock)->excl_locked & WRITE_LOCK) && !(lock)->wait_states) {\
+                (lock) -> readers_reading++;\
+                code = 0;\
+            }\
+            else\
+                code = -1; \
+            LOCK_UNLOCK(lock) \
+        ENDMAC
+
 #define ObtainWriteLock(lock)\
        BEGINMAC \
            LOCK_LOCK(lock) \
@@ -97,6 +109,18 @@ void Lock_Destroy(struct Lock *lock);
            LOCK_UNLOCK(lock) \
        ENDMAC
     
+#define ObtainWriteLockNoBlock(lock, code)\
+        BEGINMAC \
+            LOCK_LOCK(lock) \
+            if (!(lock)->excl_locked && !(lock)->readers_reading) {\
+                (lock) -> excl_locked = WRITE_LOCK;\
+                code = 0;\
+            }\
+            else\
+                code = -1; \
+            LOCK_UNLOCK(lock) \
+        ENDMAC
+
 #define ObtainSharedLock(lock)\
        BEGINMAC \
            LOCK_LOCK(lock) \
@@ -107,6 +131,18 @@ void Lock_Destroy(struct Lock *lock);
            LOCK_UNLOCK(lock) \
        ENDMAC
 
+#define ObtainSharedLockNoBlock(lock, code)\
+        BEGINMAC \
+            LOCK_LOCK(lock) \
+            if (!(lock)->excl_locked && !(lock)->wait_states) {\
+                (lock) -> excl_locked = SHARED_LOCK;\
+                code = 0;\
+            }\
+            else\
+                code = -1; \
+            LOCK_UNLOCK(lock) \
+        ENDMAC
+
 #define BoostSharedLock(lock)\
        BEGINMAC \
            LOCK_LOCK(lock) \
index 7512d46..2c8358e 100644 (file)
@@ -445,6 +445,15 @@ int LWP_CurrentProcess(pid)        /* returns pid of current process */
        return LWP_EINIT;
 }
 
+PROCESS LWP_ThreadId()
+{
+    Debug(0, ("Entered ThreadId"))
+    if (lwp_init)
+        return lwp_cpptr;
+    else
+        return (PROCESS) 0;
+}
+
 #define LWPANCHOR (*lwp_init)
 
 int LWP_DestroyProcess(pid)            /* destroy a lightweight process */
index 02433b6..b9282ef 100644 (file)
@@ -275,6 +275,15 @@ int LWP_CurrentProcess(PROCESS *pid)
        return LWP_EINIT;
 }
 
+PROCESS LWP_ThreadId()
+{
+    Debug(0, ("Entered ThreadId"))
+    if (lwp_init)
+        return lwp_cpptr;
+    else
+        return (PROCESS) 0;
+}
+
 int LWP_DispatchProcess(void)          /* explicit voluntary preemption */
 {
     Debug(2, ("Entered Dispatch_Process"))
diff --git a/src/lwp/threadname.c b/src/lwp/threadname.c
new file mode 100644 (file)
index 0000000..0b31bd7
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ *
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */ 
+/* ********************************************************************** */
+/*                                                                        */
+/*  trheadname.c                                                          */
+/*                                                                        */
+/*  Author: Hartmut Reuter                                                */
+/*  reuter@rzg.mpg.de                                                     */
+/*  Date: 01/12/00                                                        */
+/*                                                                        */
+/*  Function    - These routiens implement thread names for the           */
+/*                logging from the servers                                */
+/*                                                                        */
+/* ********************************************************************** */
+
+#include <afs/param.h>
+#if defined(AFS_PTHREAD_ENV)
+#include <pthread.h>
+#else /* defined(AFS_PTHREAD_ENV) */
+#include "lwp.h"
+#endif /* defined(AFS_PTHREAD_ENV) */
+
+#define MAX_THREADS 128
+#define MAXTHREADNAMELENGTH 64
+int nThreads = 0;
+#if defined(AFS_PTHREAD_ENV)
+pthread_t ThreadId[MAX_THREADS];
+#else /* defined(AFS_PTHREAD_ENV) */
+PROCESS   ThreadId[MAX_THREADS];
+#endif /* defined(AFS_PTHREAD_ENV) */
+char      ThreadName[MAX_THREADS][MAXTHREADNAMELENGTH];
+
+char * threadname ()
+{
+    int i;
+    static char MainThread[] = "main";
+    char *ptr;
+    char *p;
+#ifdef AFS_PTHREAD_ENV
+    pthread_t me;
+#else /* AFS_PTHREAD_ENV */
+    PROCESS me;
+#endif /* AFS_PTHREAD_ENV */
+
+#ifdef AFS_PTHREAD_ENV
+    me =  pthread_self();
+#else /* AFS_PTHREAD_ENV */
+    me =  (PROCESS) LWP_ThreadId();
+#endif /* AFS_PTHREAD_ENV */
+    ptr = (char *) &MainThread; 
+    for (i = 0; i < nThreads; i++) {
+       if (ThreadId[i] == me) {
+           ptr = (char *)&ThreadName[i];
+           break;
+       }
+ }
+    p = ptr;
+    return p;
+}
+
+int registerthread(id, name)
+#ifdef AFS_PTHREAD_ENV
+    pthread_t id;
+#else /* AFS_PTHREAD_ENV */
+    PROCESS id;
+#endif /* AFS_PTHREAD_ENV */
+    char *name;
+{
+    int i;
+
+    for (i = 0; i < nThreads; i++) {
+       if (ThreadId[i] == id) {
+           strncpy(&ThreadName[i][0], name, MAXTHREADNAMELENGTH);
+           return;
+       }
+    }
+    if (nThreads == MAX_THREADS) return;
+    ThreadId[nThreads] = id;
+    strncpy(&ThreadName[nThreads][0], name, MAXTHREADNAMELENGTH);
+    ThreadName[nThreads][MAXTHREADNAMELENGTH -1] =0;
+    nThreads++;
+}
+
+int swapthreadname(id, new, old)
+#ifdef AFS_PTHREAD_ENV
+    pthread_t id;
+#else /* AFS_PTHREAD_ENV */
+    PROCESS id;
+#endif /* AFS_PTHREAD_ENV */
+    char *new;
+    char *old;
+{
+    int i;
+
+    for (i = 0; i < nThreads; i++) {
+        if (ThreadId[i] == id) {
+           if (old)
+                strncpy(old, &ThreadName[i][0], MAXTHREADNAMELENGTH);
+            strncpy(&ThreadName[i][0], new, MAXTHREADNAMELENGTH);
+            return 0;
+       }
+    }
+    return 1;
+}