openbsd-20031007
[openafs.git] / src / afs / OBSD / osi_sleep.c
index c411443..5fd1c0e 100644 (file)
@@ -44,29 +44,32 @@ such damages.
 #include <afsconfig.h>
 #include "afs/param.h"
 
-RCSID("$Header$");
+RCSID
+    ("$Header$");
 
 #include "afs/sysincludes.h"   /* Standard vendor system headers */
 #include "afs/afsincludes.h"   /* Afs-based standard headers */
-#include "afs/afs_stats.h"   /* afs statistics */
+#include "afs/afs_stats.h"     /* afs statistics */
 
 static char waitV;
 
 
-void afs_osi_InitWaitHandle(struct afs_osi_WaitHandle *achandle)
+void
+afs_osi_InitWaitHandle(struct afs_osi_WaitHandle *achandle)
 {
     AFS_STATCNT(osi_InitWaitHandle);
     achandle->proc = NULL;
 }
 
 /* cancel osi_Wait */
-void afs_osi_CancelWait(struct afs_osi_WaitHandle *achandle)
+void
+afs_osi_CancelWait(struct afs_osi_WaitHandle *achandle)
 {
     caddr_t proc;
 
     AFS_STATCNT(osi_CancelWait);
     proc = achandle->proc;
-    if (proc == 0)
+    if (proc == NULL)
        return;
     achandle->proc = NULL;
     wakeup(&waitV);
@@ -76,45 +79,65 @@ void afs_osi_CancelWait(struct afs_osi_WaitHandle *achandle)
  * Waits for data on ahandle, or ams ms later.  ahandle may be null.
  * Returns 0 if timeout and EINTR if signalled.
  */
-int afs_osi_Wait(afs_int32 ams, struct afs_osi_WaitHandle *ahandle, int aintok)
+int
+afs_osi_Wait(afs_int32 ams, struct afs_osi_WaitHandle *ahandle, int aintok)
 {
-    int code = 0;
-    afs_int32 endTime;
-    int timo = (ams * afs_hz) / 1000 + 1;
+    int timo, code = 0;
+    struct timeval atv, endTime;
 
     AFS_STATCNT(osi_Wait);
-    endTime = osi_Time() + (ams / 1000);
+
+    atv.tv_sec = ams / 1000;
+    atv.tv_usec = (ams % 1000) * 1000;
+    timeradd(&atv, &time, &endTime);
+
     if (ahandle)
        ahandle->proc = (caddr_t) curproc;
+    AFS_ASSERT_GLOCK();
+    AFS_GUNLOCK();
+
     do {
+       timersub(&endTime, &time, &atv);
+       timo = atv.tv_sec * hz + atv.tv_usec * hz / 1000000 + 1;
        if (aintok) {
-           code = tsleep(&waitV, PCATCH | (PZERO+8), "afs_osi_Wait", timo);
-           if (code)   /* if interrupted, return EINTR */
-               code = EINTR;
+           code = tsleep(&waitV, PCATCH | PVFS, "afs_W1", timo);
+           if (code)
+               code = (code == EWOULDBLOCK) ? 0 : EINTR;
        } else
-           tsleep(&waitV, (PZERO-3), "afs_osi_Wait", timo);
+           tsleep(&waitV, PVFS, "afs_W2", timo);
 
        /* if we were cancelled, quit now */
        if (ahandle && (ahandle->proc == NULL)) {
            /* we've been signalled */
            break;
        }
-    } while (osi_Time() < endTime);
+    } while (timercmp(&time, &endTime, <));
+
+    AFS_GLOCK();
     return code;
 }
 
-void afs_osi_Sleep(void *event)
+void
+afs_osi_Sleep(void *event)
 {
+    AFS_ASSERT_GLOCK();
+    AFS_GUNLOCK();
     tsleep(event, PVFS, "afs", 0);
+    AFS_GLOCK();
 }
 
-int afs_osi_SleepSig(void *event)
+int
+afs_osi_SleepSig(void *event)
 {
+    AFS_ASSERT_GLOCK();
+    AFS_GUNLOCK();
     tsleep(event, PVFS, "afs", 0);
+    AFS_GLOCK();
     return 0;
 }
 
-int afs_osi_Wakeup(void *event)
+int
+afs_osi_Wakeup(void *event)
 {
     wakeup(event);
     return 1;