From: Derrick Brashear Date: Fri, 12 Jan 2007 16:31:40 +0000 (+0000) Subject: STABLE14-locker-thread-tracking-20070111 X-Git-Tag: openafs-stable-1_4_3rc1~7 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=fd803dfcf59a74b616b19d7ab8506f9a2db0e274;p=packages%2Fo%2Fopenafs.git STABLE14-locker-thread-tracking-20070111 track thread ids so we can properly not deadlock (cherry picked from commit 2b7f13c2276613e120cef159f44c912e866412f5) --- diff --git a/src/afs/afs_callback.c b/src/afs/afs_callback.c index f6868c2f0..4e791d0ec 100644 --- a/src/afs/afs_callback.c +++ b/src/afs/afs_callback.c @@ -328,9 +328,9 @@ SRXAFSCB_GetLock(struct rx_call *a_call, afs_int32 a_index, ((struct afs_lock *)(tl->addr))->num_waiting; #ifdef INSTRUMENT_LOCKS a_result->lock.pid_last_reader = - ((struct afs_lock *)(tl->addr))->pid_last_reader; + MyPidxx2Pid(((struct afs_lock *)(tl->addr))->pid_last_reader); a_result->lock.pid_writer = - ((struct afs_lock *)(tl->addr))->pid_writer; + MyPidxx2Pid(((struct afs_lock *)(tl->addr))->pid_writer); a_result->lock.src_indicator = ((struct afs_lock *)(tl->addr))->src_indicator; #else diff --git a/src/afs/lock.h b/src/afs/lock.h index db6194ec4..27e4f2a1d 100644 --- a/src/afs/lock.h +++ b/src/afs/lock.h @@ -86,40 +86,61 @@ typedef struct afs_bozoLock afs_bozoLock_t; #define BEGINMAC do { #define ENDMAC } while (0) -#if defined(AFS_SUN57_ENV) -#define MyPidxx (curthread->t_did) -#else -#if defined(AFS_OBSD_ENV) || defined(AFS_SUN5_ENV) +#if defined(AFS_SUN57_ENV) +typedef kthread_t * afs_lock_tracker_t; +#define MyPidxx (curthread) +#define MyPidxx2Pid(x) (ttoproc(x)->p_pid) +#elif defined(AFS_SUN5_ENV) || defined(AFS_OBSD_ENV) +typedef unsigned int afs_lock_tracker_t; #define MyPidxx (curproc->p_pid) +#define MyPidxx2Pid(x) (x) #else #if defined(AFS_AIX41_ENV) +typedef tid_t afs_lock_tracker_t; extern tid_t thread_self(); -#define MyPidxx thread_self() +#define MyPidxx (thread_self()) +#define MyPidxx2Pid(x) ((afs_int32)(x)) #else /* AFS_AIX41_ENV */ #if defined(AFS_HPUX101_ENV) -#define MyPidxx ((int)p_pid(u.u_procp)) +typedef struct proc * afs_lock_tracker_t; +#define MyPidxx (u.u_procp) +#define MyPidxx2Pid(x) ((afs_int32)p_pid(x)) #else #if defined(AFS_SGI64_ENV) #if defined(AFS_SGI65_ENV) +typedef unsigned int afs_lock_tracker_t; #define MyPidxx proc_pid(curproc()) +#define MyPidxx2Pid(x) (x) #else +typedef unsigned int afs_lock_tracker_t; #define MyPidxx current_pid() +#define MyPidxx2Pid(x) (x) #endif #else /* AFS_SGI64_ENV */ #ifdef AFS_LINUX20_ENV -#define MyPidxx current->pid +typedef struct task_struct * afs_lock_tracker_t; +#define MyPidxx (current) +#define MyPidxx2Pid(x) ((x)->pid) #else #if defined(AFS_DARWIN_ENV) #if defined(AFS_DARWIN80_ENV) +typedef unsigned int afs_lock_tracker_t; #define MyPidxx (proc_selfpid()) +#define MyPidxx2Pid(x) (x) #else +typedef unsigned int afs_lock_tracker_t; #define MyPidxx (current_proc()->p_pid ) +#define MyPidxx2Pid(x) (x) #endif #else #if defined(AFS_FBSD_ENV) +typedef unsigned int afs_lock_tracker_t; #define MyPidxx (curproc->p_pid ) +#define MyPidxx2Pid(x) (x) #else +typedef unsigned int afs_lock_tracker_t; #define MyPidxx (u.u_procp->p_pid ) +#define MyPidxx2Pid(x) (x) #endif /* AFS_FBSD_ENV */ #endif /* AFS_DARWIN_ENV */ #endif /* AFS_LINUX20_ENV */ @@ -127,7 +148,6 @@ extern tid_t thread_self(); #endif /* AFS_HPUX101_ENV */ #endif /* AFS_AIX41_ENV */ #endif -#endif /* all locks wait on excl_locked except for READ_LOCK, which waits on readers_reading */ struct afs_lock { @@ -143,8 +163,8 @@ struct afs_lock { ** only for writes/shared locks. Hence, it indictes where in the ** source code the shared/write lock was set. */ - unsigned int pid_last_reader; /* proceess id of last reader */ - unsigned int pid_writer; /* process id of writer, else 0 */ + afs_lock_tracker_t pid_last_reader; /* proceess id of last reader */ + afs_lock_tracker_t pid_writer; /* process id of writer, else 0 */ unsigned int src_indicator; /* third param to ObtainLock() */ #endif /* INSTRUMENT_LOCKS */ };