<> <> <> DIRECTORY BasicTime USING [Pulses], Endian USING [FWORD, HWORD], Rope USING [ROPE], XNS USING [Address], XNSBuf USING [Buffer], XNSSocket USING [Handle], XNSSPPBuf USING [Buffer, maxBodyBytes], XNSStream USING [AttentionType, CloseReason, Milliseconds, SubSequenceType]; XNSStreamPrivate: CEDAR DEFINITIONS ~ { <> BYTE: TYPE ~ [0..100H); FWORD: TYPE ~ Endian.FWORD; HWORD: TYPE ~ Endian.HWORD; XNSBuffer: TYPE ~ XNSBuf.Buffer; SPPBuffer: TYPE ~ XNSSPPBuf.Buffer; SubSequenceType: TYPE ~ XNSStream.SubSequenceType; AttentionType: TYPE ~ XNSStream.AttentionType; <> SignedDiff: PROC [a, b: CARDINAL] RETURNS [INTEGER] ~ INLINE { RETURN [ LOOPHOLE[a-b] ] }; <> BufIndex: TYPE = [0..XNSSPPBuf.maxBodyBytes]; FingerState: TYPE ~ { empty, emptying, halfEmpty, filling, halfFull, full, sending }; Finger: TYPE ~ REF FingerObject; FingerObject: TYPE ~ RECORD [ next: Finger _ NIL, state: FingerState _ empty, attention: BOOL _ FALSE, index: BufIndex _ 0, bytes: BufIndex _ 0, buffer: SPPBuffer _ NIL ]; OBAttn: TYPE ~ REF OBAttnObject; OBAttnObject: TYPE ~ RECORD [ next: OBAttn, seqNum: CARDINAL, attentionType: AttentionType]; unknownConnectionID: HWORD ~ 0; Handle: TYPE = REF Object; Object: TYPE = MONITORED RECORD [ next: Handle _ NIL, socket: XNSSocket.Handle _ NIL, remote: XNS.Address _ NULL, connectionID: HWORD _ unknownConnectionID, remoteConnectionID: HWORD _ unknownConnectionID, closed: BOOL _ FALSE, closeReason: XNSStream.CloseReason _ unknown, closeText: Rope.ROPE _ NIL, finished: BOOL _ FALSE, <> push1: PROCESS, push2: PROCESS, mgr: PROCESS, pull: PROCESS, -- TEMPORARY ???? <> roundTripPulses: BasicTime.Pulses _ 0, getTimeout: XNSStream.Milliseconds _ 0, getPulseOut: BasicTime.Pulses _ 0, putTimeout: XNSStream.Milliseconds _ 0, putPulseOut: BasicTime.Pulses _ 0, waitForAckPulseOut: BasicTime.Pulses _ NULL, waitForAllocPulseOut: BasicTime.Pulses _ NULL, cacheFlushPulseOut: BasicTime.Pulses _ NULL, probePulseOut: BasicTime.Pulses _ NULL, noActivityPulseOut: BasicTime.Pulses _ NULL, <> <> inputReady: CONDITION, -- (B, T~getTimeout). There's a newly-full input buffer. doneEmptying: CONDITION, -- (B, T~infinity). outputSpace: CONDITION, -- (B, T~putTimeout). There's a newly-empty output buffer. outputReady: CONDITION, -- (N, T~infinity). There's a newly-full output buffer. recvdNewAlloc: CONDITION, -- (B, T~putTimeout). doneFilling: CONDITION, -- (B, T~infinity). doneSending: CONDITION, -- (B, T~infinity). mgrShortWakeup: CONDITION, -- (X, T~waitForAck). This is how mgr times out on overdue Ack or Alloc. May be NOTIFYed by InputDequeue if it's time to send a system packet. mgrLongWakeup: CONDITION, -- (X, T~probe). This is how mgr times out to send a probe if there's no other activity. NOTIFYed whenever an ack request is sent, and whenever mgrShortWakeup is NOTIFYed. flusherWakeup: CONDITION, -- (B, T set by client). Broadcast whenever ??? is received. recvdOBAttn: CONDITION, -- (B, T set by client). <> recvdTime: BasicTime.Pulses _ NULL, cacheFlushedTime: BasicTime.Pulses _ NULL, sentAckReqTime: BasicTime.Pulses _ NULL, expectedAckNum: CARDINAL _ 0, sentAllocNum: CARDINAL _ 0, recvdAllocNum: CARDINAL _ 0, heWantsAlloc: BOOL _ FALSE, mustSendAck: BOOL _ FALSE, <> inputEnqueue: Finger _ NIL, inputEnqueueNum: CARDINAL _ 0, inputAck: Finger _ NIL, inputAckNum: CARDINAL _ 0, inputDequeue: Finger _ NIL, inputDequeueNum: CARDINAL _ 0, inputBuffersAllocated: CARDINAL _ 0, <> inputSSType: SubSequenceType _ 0, <> recvdOBAttnList: OBAttn _ NIL, <> outputEnqueue: Finger _ NIL, outputEnqueueNum: CARDINAL _ 0, outputSend: Finger _ NIL, outputSendNum: CARDINAL _ 0, outputDequeue: Finger _ NIL, outputDequeueNum: CARDINAL _ 0, outputBuffersAllocated: CARDINAL _ 0, <> outputSSType: SubSequenceType _ 0, <> outputIBAttnCnt: CARDINAL _ 0, <0 forces each packet to be sent with its sendAck bit on. ????>> flusherCnt: CARDINAL _ 0 ]; }.