Remove support for Solaris pre-8
[openafs.git] / src / afs / lock.h
index db6194e..04b0abb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
  * LICENSED MATERIALS - PROPERTY OF IBM
  */
 
-#if    (defined(AFS_SUN5_ENV)) || defined(AFS_OSF_ENV)
+#if    (defined(AFS_SUN5_ENV))
 #define        AFS_NOBOZO_LOCK
 #endif
 
-#if !defined(AFS_OSF20_ENV) || defined(AFS_OSF30_ENV) || defined(AFS_OSF32_ENV)
-    /* We do not instrument locks on osf20 because the vcache structure
-     ** exceeds the maximim possible limit for a vnode.
-     */
 #define INSTRUMENT_LOCKS
 /* This is the max lock number in use. Please update it if you add any new
  * lock numbers.
  */
-#define MAX_LOCK_NUMBER 700
-#endif
+#define MAX_LOCK_NUMBER 780
 
 struct afs_bozoLock {
     short count;               /* count of excl locks */
     char flags;                        /* bit 1: is anyone waiting? */
     char spare;                        /* for later */
-    char *proc;                        /* process holding the lock, really a struct proc * */
+    char *proc;                        /* process holding the lock, really an afs_proc_t * */
 };
 #ifndef        AFS_NOBOZO_LOCK
 typedef struct afs_bozoLock afs_bozoLock_t;
@@ -57,18 +52,7 @@ typedef struct afs_bozoLock afs_bozoLock_t;
 
 #define        AFS_BOZONWAITING    1   /* someone is waiting for this lock */
 
-#undef MObtainWriteLock                /* Defined also in ../rx/rx_machdep.h" */
-#undef MReleaseWriteLock
-#define MObtainReadLock(lock)  ObtainReadLock(lock)
-#define MObtainWriteLock(lock,src)     ObtainWriteLock(lock,src)
-#define MObtainSharedLock(lock,src)    ObtainSharedLock(lock,src)
-#define MUpgradeSToWLock(lock,src)     UpgradeSToWLock(lock,src)
-#define MConvertWToSLock(lock) ConvertWToSLock(lock)
-#define MReleaseReadLock(lock) ReleaseReadLock(lock)
-#define MReleaseWriteLock(lock)        ReleaseWriteLock(lock)
-#define MReleaseSharedLock(lock) ReleaseSharedLock(lock)
-
-#define        RWLOCK_INIT(lock, nm)   Lock_Init(lock)
+#define        AFS_RWLOCK_INIT(lock, nm)       Lock_Init(lock)
 #undef LOCK_INIT
 #define        LOCK_INIT(lock, nm)     Lock_Init(lock)
 
@@ -86,47 +70,69 @@ 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)
-#define MyPidxx (curproc->p_pid)
-#else
-#if defined(AFS_AIX41_ENV)
+#if defined(UKERNEL)
+typedef unsigned int afs_lock_tracker_t;
+# define MyPidxx (get_user_struct()->u_procp->p_pid )
+# define MyPidxx2Pid(x) (x)
+#elif defined(AFS_SUN5_ENV)
+typedef kthread_t * afs_lock_tracker_t;
+# define MyPidxx (curthread)
+# define MyPidxx2Pid(x) (x ? ttoproc(x)->p_pid : 0)
+#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)
+#elif defined(AFS_AIX41_ENV)
+typedef tid_t afs_lock_tracker_t;
 extern tid_t thread_self();
-#define MyPidxx thread_self()
-#else /* AFS_AIX41_ENV */
-#if defined(AFS_HPUX101_ENV)
-#define MyPidxx ((int)p_pid(u.u_procp))
-#else
-#if defined(AFS_SGI64_ENV)
-#if defined(AFS_SGI65_ENV)
-#define MyPidxx proc_pid(curproc())
-#else
-#define MyPidxx current_pid()
-#endif
-#else /* AFS_SGI64_ENV */
-#ifdef AFS_LINUX20_ENV
-#define MyPidxx current->pid
+# define MyPidxx (thread_self())
+# define MyPidxx2Pid(x) ((afs_int32)(x))
+#elif defined(AFS_HPUX101_ENV)
+# if defined(AFS_HPUX1111_ENV)
+typedef struct kthread * afs_lock_tracker_t;
+#  define MyPidxx (u.u_kthreadp)
+#  define MyPidxx2Pid(x) (x ? kt_tid(x) : 0)
+# else
+typedef afs_proc_t * afs_lock_tracker_t;
+#  define MyPidxx (u.u_procp)
+#  define MyPidxx2Pid(x) (x ? (afs_int32)p_pid(x) : 0)
+# endif
+#elif 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
+#elif defined(AFS_LINUX20_ENV)
+typedef struct task_struct * afs_lock_tracker_t;
+# define MyPidxx (current)
+# define MyPidxx2Pid(x) (x? (x)->pid : 0)
+#elif 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
+#elif defined(AFS_FBSD_ENV)
+typedef unsigned int afs_lock_tracker_t;
+# define MyPidxx (curproc->p_pid )
+# define MyPidxx2Pid(x) (x)
+#elif defined(AFS_NBSD40_ENV)
+typedef unsigned int afs_lock_tracker_t;
+#define MyPidxx osi_getpid() /* XXX could generalize this (above) */
+#define MyPidxx2Pid(x) (x)
 #else
-#if defined(AFS_DARWIN_ENV)
-#if defined(AFS_DARWIN80_ENV)
-#define MyPidxx (proc_selfpid())
-#else
-#define MyPidxx (current_proc()->p_pid )
-#endif
-#else
-#if defined(AFS_FBSD_ENV)
-#define MyPidxx (curproc->p_pid )
-#else
-#define MyPidxx (u.u_procp->p_pid )
-#endif /* AFS_FBSD_ENV */
-#endif /* AFS_DARWIN_ENV */
-#endif /* AFS_LINUX20_ENV */
-#endif /* AFS_SGI64_ENV */
-#endif /* AFS_HPUX101_ENV */
-#endif /* AFS_AIX41_ENV */
-#endif
+typedef unsigned int afs_lock_tracker_t;
+# define MyPidxx (u.u_procp->p_pid )
+# define MyPidxx2Pid(x) (x)
 #endif
 
 /* all locks wait on excl_locked except for READ_LOCK, which waits on readers_reading */
@@ -138,13 +144,13 @@ struct afs_lock {
     unsigned short spare;      /* not used now */
     osi_timeval_t time_waiting;        /* for statistics gathering */
 #if defined(INSTRUMENT_LOCKS)
-    /* the following are useful for debugging 
+    /* the following are useful for debugging
      ** the field 'src_indicator' is updated only by ObtainLock() and
      ** 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 */
 };
@@ -185,6 +191,9 @@ extern int afs_trclock;
         (lock)->pid_last_reader = MyPidxx; \
    ENDMAC
 
+#define NBObtainReadLock(lock) \
+       (((lock)->excl_locked & WRITE_LOCK) ? EWOULDBLOCK :  (((lock)->readers_reading++), ((lock)->pid_last_reader = MyPidxx), 0))
+
 #define ObtainWriteLock(lock, src)\
   BEGINMAC  \
        AFS_LOCK_TRACE(CM_TRACE_LOCKOBTAIN, lock, WRITE_LOCK);\
@@ -288,6 +297,9 @@ extern int afs_trclock;
            Afs_Lock_Obtain(lock, READ_LOCK); \
    ENDMAC
 
+#define NBObtainReadLock(lock) \
+       (((lock)->excl_locked & WRITE_LOCK) ? EWOULDBLOCK : (((lock)->readers_reading++), 0))
+
 #define ObtainWriteLock(lock, src)\
   BEGINMAC  \
        AFS_LOCK_TRACE(CM_TRACE_LOCKOBTAIN, lock, WRITE_LOCK);\