X-Git-Url: https://git.openafs.org/?p=openafs.git;a=blobdiff_plain;f=src%2Fafs%2FOBSD%2Fosi_sleep.c;h=5fd1c0e3c383b1540bc18a46563523046f10e658;hp=f47ea902a8fa795fa457d84a96074dda973269a9;hb=0bc7169a9c7abf2dc1b2a13cb97bf366a3174649;hpb=c9139f0c54e6e082ce4e54ed5359581dd08bab72 diff --git a/src/afs/OBSD/osi_sleep.c b/src/afs/OBSD/osi_sleep.c index f47ea90..5fd1c0e 100644 --- a/src/afs/OBSD/osi_sleep.c +++ b/src/afs/OBSD/osi_sleep.c @@ -1,4 +1,38 @@ /* + * $Id$ + */ + +/* +copyright 2002 +the regents of the university of michigan +all rights reserved + +permission is granted to use, copy, create derivative works +and redistribute this software and such derivative works +for any purpose, so long as the name of the university of +michigan is not used in any advertising or publicity +pertaining to the use or distribution of this software +without specific, written prior authorization. if the +above copyright notice or any other identification of the +university of michigan is included in any copy of any +portion of this software, then the disclaimer below must +also be included. + +this software is provided as is, without representation +from the university of michigan as to its fitness for any +purpose, and without warranty by the university of +michigan of any kind, either express or implied, including +without limitation the implied warranties of +merchantability and fitness for a particular purpose. the +regents of the university of michigan shall not be liable +for any damages, including special, indirect, incidental, or +consequential damages, with respect to any claim arising +out of or in connection with the use of the software, even +if it has been or is hereafter advised of the possibility of +such damages. +*/ + +/* * Copyright 2000, International Business Machines Corporation and others. * All Rights Reserved. * @@ -7,33 +41,35 @@ * directory or online at http://www.openafs.org/dl/license10.html */ - #include #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); @@ -43,35 +79,66 @@ 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; } -int afs_osi_SleepSig(void *event) +void +afs_osi_Sleep(void *event) { - afs_osi_Sleep(event); + AFS_ASSERT_GLOCK(); + AFS_GUNLOCK(); + tsleep(event, PVFS, "afs", 0); + AFS_GLOCK(); +} + +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) +{ + wakeup(event); + return 1; +}