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, flusherCnt: CARDINAL _ 0 ]; }. τXNSStreamPrivate.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Demers, June 12, 1986 12:55:37 pm PDT Copied Types Sequence Numbers Our Types Processes associated with stream: Timeouts: Conditions: inputSpace: CONDITION, -- Nonexistent! Most recent significant events: Ring of input buffers: SubSequenceType last seen by the stream client: Out-of-Band Attentions received and not yet read by WaitAttention: Ring of output buffers: SubSequenceType that will be assigned to next data byte written by client (this ssType is attached to outputEnqueue, and may be different from the type attached to outputSend): In-Band Attentions on the output queue: Flushing: flusherCnt>0 forces each packet to be sent with its sendAck bit on. ???? Κ$˜codešœ™Kšœ Οmœ1™Kšžœžœ ˜——™ Kšœ žœ˜-Kšœ žœD˜UIempty˜Kšœžœžœ˜ šœžœžœ˜Kšœžœ˜Kšœ˜Kšœ žœžœ˜Kšœ˜Kšœ˜Kšœžœ˜—K˜Kšœžœžœ˜ šœžœžœ˜Kšœ ˜ Kšœžœ˜K˜K˜—Kšœžœ˜K˜Kšœžœžœ˜šœžœž œžœ˜!Kšœžœ˜Kšœžœ˜Kšœžœ žœ˜Kšœžœ˜*Kšœžœ˜0Kšœžœžœ˜Kšœ-˜-Kšœžœžœ˜Kšœ žœžœ˜™!Kšœžœ˜Kšœžœ˜Kšœžœ˜ KšœžœΟc˜ —™ Kšœ&˜&K˜'Kšœ"˜"K˜'K˜"Kšœ&žœ˜,Kšœ(žœ˜.Kšœ'žœ˜,Kšœ"žœ˜'Kšœ'žœ˜,—™ Kšœ ž œ™&Kšœ ž œ‘9˜PKšœž œ‘˜,Kšœ ž œ‘;˜SKšœ ž œ‘8˜PKšœž œ‘˜/Kšœ ž œ‘˜+Kšœ ž œ‘˜+Kšœž œ‘˜«Kšœž œ‘’œ‘ ˜ΗKšœž œ‘=˜WKšœ ž œ‘˜0—™Kšœžœ˜#Kšœ$žœ˜*Kšœ"žœ˜(Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœžœ˜Kšœ žœžœ˜—™Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœ žœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜$—™/K˜!—™BKšœžœ˜—™Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜%—™°K˜"—™'Kšœžœ˜—šœR™RKšœ žœ˜—Kšœ˜——K˜——…—ΐΨ