From: Hartmut Reuter Date: Mon, 12 Feb 2001 17:35:16 +0000 (+0000) Subject: thread-identification-routines-20010212 X-Git-Tag: BP-openafs-devel-autoconf~69 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=9c82b2024e2ebaf5dfb0a7f1ffe9f4c201763f4e thread-identification-routines-20010212 Needed to identify thread in serverlog for mrafs --- diff --git a/src/lwp/Makefile b/src/lwp/Makefile index cfacbe4..5d3c72c 100644 --- a/src/lwp/Makefile +++ b/src/lwp/Makefile @@ -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 diff --git a/src/lwp/NTMakefile b/src/lwp/NTMakefile index 2ddc046..5fcb9e5 100644 --- a/src/lwp/NTMakefile +++ b/src/lwp/NTMakefile @@ -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 diff --git a/src/lwp/lock.h b/src/lwp/lock.h index ab19111..7aff635 100644 --- a/src/lwp/lock.h +++ b/src/lwp/lock.h @@ -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) \ diff --git a/src/lwp/lwp.c b/src/lwp/lwp.c index 7512d46..2c8358e 100644 --- a/src/lwp/lwp.c +++ b/src/lwp/lwp.c @@ -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 */ diff --git a/src/lwp/lwp_nt.c b/src/lwp/lwp_nt.c index 02433b6..b9282ef 100644 --- a/src/lwp/lwp_nt.c +++ b/src/lwp/lwp_nt.c @@ -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 index 0000000..0b31bd7 --- /dev/null +++ b/src/lwp/threadname.c @@ -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 +#if defined(AFS_PTHREAD_ENV) +#include +#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; +}