<> <> <> <> <> <> DIRECTORY AlpineEnvironment, AlpineInternal, BasicTime, Lock; LockInternal: DEFINITIONS = BEGIN LockID: TYPE = Lock.LockID; LockMode: TYPE = Lock.LockMode; Handle: TYPE = REF Object; HeaderHandle: TYPE = REF Object.header; RequestHandle: TYPE = REF Object.request; GrantedRequestHandle: TYPE = REF Object.request.granted; WaitingRequestHandle: TYPE = REF Object.request.waiting; LockTransHeaderHandle: TYPE = REF Object.request.transHeader; ObjectType: TYPE = {header, request}; RequestObjectType: TYPE = {granted, waiting, transHeader}; Object: TYPE = RECORD [ requestList: Handle _ NIL, <> body: SELECT type: ObjectType FROM header => [ lockID: LockID _ TRASH, next: HeaderHandle _ NIL -- link field for hash table package ], request => [ trans: AlpineInternal.TransHandle, transList: RequestHandle, <> lockID: LockID _ TRASH, mode: LockMode, rest: SELECT type: RequestObjectType 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: HeaderHandle] RETURNS [stop: BOOL]; WaitingRequestEnumProc: TYPE = PROC [wr: WaitingRequestHandle] RETURNS [stop: BOOL]; TimeoutWaitingRequest: PROC [wr: WaitingRequestHandle]; <> LockIDFromRH: PROC [r: RequestHandle] RETURNS [LockID] = INLINE { <> hCopy: Handle; h: Handle _ r.requestList; DO IF h = r THEN ERROR; hCopy _ h; WITH hv: hCopy SELECT FROM header => RETURN [hv.lockID]; request => h _ hv.requestList; ENDCASE => ERROR; ENDLOOP; }; END. CHANGE LOG. <<>> <> <>