f36b3170bd1aa8943be3f5f05d008b68445ec57b
[openafs.git] / src / lwp / threadname.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9 /* ********************************************************************** */
10 /*                                                                        */
11 /*  trheadname.c                                                          */
12 /*                                                                        */
13 /*  Author: Hartmut Reuter                                                */
14 /*  reuter@rzg.mpg.de                                                     */
15 /*  Date: 01/12/00                                                        */
16 /*                                                                        */
17 /*  Function    - These routiens implement thread names for the           */
18 /*                logging from the servers                                */
19 /*                                                                        */
20 /* ********************************************************************** */
21
22 #include <afsconfig.h>
23 #include <afs/param.h>
24
25 RCSID
26     ("$Header$");
27
28 #ifdef HAVE_STRING_H
29 #include <string.h>
30 #else
31 #ifdef HAVE_STRINGS_H
32 #include <strings.h>
33 #endif
34 #endif
35 #if defined(AFS_PTHREAD_ENV)
36 #include <pthread.h>
37 #else /* defined(AFS_PTHREAD_ENV) */
38 #include "lwp.h"
39 #endif /* defined(AFS_PTHREAD_ENV) */
40
41 #define MAX_THREADS 128
42 #define MAXTHREADNAMELENGTH 64
43 int nThreads = 0;
44 #if defined(AFS_PTHREAD_ENV)
45 pthread_t ThreadId[MAX_THREADS];
46 #else /* defined(AFS_PTHREAD_ENV) */
47 PROCESS ThreadId[MAX_THREADS];
48 #endif /* defined(AFS_PTHREAD_ENV) */
49 char ThreadName[MAX_THREADS][MAXTHREADNAMELENGTH];
50
51 char *
52 threadname(void)
53 {
54     int i;
55     static char MainThread[] = "main";
56     char *ptr;
57     char *p;
58 #ifdef AFS_PTHREAD_ENV
59     pthread_t me;
60 #else /* AFS_PTHREAD_ENV */
61     PROCESS me;
62 #endif /* AFS_PTHREAD_ENV */
63
64 #ifdef AFS_PTHREAD_ENV
65     me = pthread_self();
66 #else /* AFS_PTHREAD_ENV */
67     me = (PROCESS) LWP_ThreadId();
68 #endif /* AFS_PTHREAD_ENV */
69     ptr = &MainThread[0];
70     for (i = 0; i < nThreads; i++) {
71         if (ThreadId[i] == me) {
72             ptr = &ThreadName[i][0];
73             break;
74         }
75     }
76     p = ptr;
77     return p;
78 }
79
80 int
81 registerthread(
82 #ifdef AFS_PTHREAD_ENV
83                   pthread_t id,
84 #else                           /* AFS_PTHREAD_ENV */
85                   PROCESS id,
86 #endif                          /* AFS_PTHREAD_ENV */
87                   char *name)
88 {
89     int i;
90
91     for (i = 0; i < nThreads; i++) {
92         if (ThreadId[i] == id) {
93             strncpy(&ThreadName[i][0], name, MAXTHREADNAMELENGTH);
94             return 0;
95         }
96     }
97     if (nThreads == MAX_THREADS)
98         return 0;
99     ThreadId[nThreads] = id;
100     strncpy(&ThreadName[nThreads][0], name, MAXTHREADNAMELENGTH);
101     ThreadName[nThreads][MAXTHREADNAMELENGTH - 1] = 0;
102     nThreads++;
103
104     return 0;
105 }
106
107 int
108 swapthreadname(
109 #ifdef AFS_PTHREAD_ENV
110                   pthread_t id,
111 #else                           /* AFS_PTHREAD_ENV */
112                   PROCESS id,
113 #endif                          /* AFS_PTHREAD_ENV */
114                   char *new, char *old)
115 {
116     int i;
117
118     for (i = 0; i < nThreads; i++) {
119         if (ThreadId[i] == id) {
120             if (old)
121                 strncpy(old, &ThreadName[i][0], MAXTHREADNAMELENGTH);
122             strncpy(&ThreadName[i][0], new, MAXTHREADNAMELENGTH);
123             return 0;
124         }
125     }
126     return 1;
127 }