<> <> <> <> <> <> <> DIRECTORY YggEnvironment, YggInternal, BasicTime, YggLock; YggLockInternal: CEDAR DEFINITIONS = BEGIN LockID: TYPE = YggLock.LockID; LockMode: TYPE = YggLock.LockMode; Lock: TYPE = REF LockRep; Header: TYPE = REF LockRep.header; Request: TYPE = REF LockRep.request; GrantedRequest: TYPE = REF LockRep.request.granted; WaitingRequest: TYPE = REF LockRep.request.waiting; LockTransHeader: TYPE = REF LockRep.request.transHeader; LockType: TYPE = {header, request}; RequestLockType: TYPE = {granted, waiting, transHeader}; LockRep: TYPE = RECORD [ requestList: Lock _ NIL, <> body: SELECT type: LockType FROM header => [ lockID: LockID _ YggLock.nullLockID, next: Header _ NIL -- link field for hash table package ], request => [ trans: YggInternal.TransHandle, transList: Request, <> lockID: LockID _ YggLock.nullLockID, mode: LockMode, rest: SELECT type: RequestLockType FROM granted => [ count: NAT ], waiting => [ somethingChanged: CONDITION, giveUp: BOOL _ FALSE, whyGivingUp: WhyGivingUp _ TRASH, -- meaningful only if giveUp isConversion: BOOL _ FALSE, startTime: BasicTime.GMT ], transHeader => [ -- requestList = NIL nLocks: INT ], ENDCASE ], ENDCASE ]; WhyGivingUp: TYPE = { abort, timeout }; GetInfo: PROC [ generalInfoProc: GeneralInfoProc _ NIL, lockEnumProc: LockEnumProc _ NIL, waitingRequestEnumProc: WaitingRequestEnumProc _ NIL, waitingRequestEnumProc2: WaitingRequestEnumProc _ NIL]; <> GeneralInfoProc: TYPE = PROC [nLocks, nRequests, nSetCalls, nSetCallsWaited: INT]; LockEnumProc: TYPE = PROC [h: Header] RETURNS [stop: BOOL]; WaitingRequestEnumProc: TYPE = PROC [wr: WaitingRequest] RETURNS [stop: BOOL]; TimeoutWaitingRequest: PROC [wr: WaitingRequest]; <> LockIDFromRH: PROC [r: Request] RETURNS [LockID] = INLINE { <> hCopy: Lock; h: Lock _ r.requestList; DO IF h = r THEN ERROR; hCopy _ h; WITH hCopy^ SELECT FROM hh: LockRep.header => RETURN [hh.lockID]; rr: LockRep.request => h _ hCopy.requestList; ENDCASE => ERROR; ENDLOOP; }; END. CHANGE LOG. <<>> <> <>