BufferDefs:
DEFINITIONS =
BEGIN
Opaque Data TYPEs gets value through EXPORTED TYPEs
Network: TYPE [2]; -- defined by DriverDefs.Network
Basic Data TYPEs
Byte: TYPE = [0..377B];
PupAddress: TYPE = PupTypes.PupAddress;
PupHostID: TYPE = PupTypes.PupHostID;
PupNetID: TYPE = PupTypes.PupNetID;
PupSocketID: TYPE = PupTypes.PupSocketID;
QUEUE
Queue: TYPE = REF QueueObject;
QueueObject:
TYPE =
PRIVATE
RECORD [
length: PUBLIC CARDINAL, first, last: Buffer, seal: DriverTypes.Seal];
Buffer Access
BufferAccessHandle: TYPE = REF BufferAccessObject;
BufferAccessObject:
TYPE =
PRIVATE
RECORD [
receiveInUse, sendInUse: CARDINAL,
receive, send, total, reserve: CARDINAL,
active: BOOLEAN,
madeForSystem: BOOLEAN,
filler: [0..37777B),
bufferAvailable: CONDITION,
recovered: CARDINAL,
firstBuffer: Buffer,
wordsPerBuffer: CARDINAL,
next: BufferAccessHandle,
seal: DriverTypes.Seal ];
systemAccessHandle: BufferAccessHandle; -- ReadOnly but two modules here use it
Enqueue: PROCEDURE [Queue, Buffer];
Dequeue: PROCEDURE [Queue] RETURNS [Buffer];
ExtractFromQueue: PUBLIC PROCEDURE [Queue, Buffer] RETURNS [Buffer];
QueueLength:
PROCEDURE [q: Queue]
RETURNS [
CARDINAL] =
INLINE
BEGIN RETURN[q.length]; END;
QueueEmpty:
PROCEDURE [q: Queue]
RETURNS [
BOOLEAN] =
INLINE
BEGIN RETURN[q.length = 0]; END;
QueueInitialize: PROCEDURE [Queue];
QueueCleanup: PROCEDURE [Queue];
PupBufferObject: TYPE = pup BufferObject;
PupBuffer: TYPE = LONG POINTER TO PupBufferObject;
OisBufferObject: TYPE = ois BufferObject;
OisBuffer: TYPE = LONG POINTER TO OisBufferObject;
SppBufferObject: TYPE = spp ois BufferObject;
SppBuffer: TYPE = LONG POINTER TO OisBufferObject;
MakeBufferPool:
PROCEDURE [
total: CARDINAL, send: CARDINAL ← 0, receive: CARDINAL ← 0,
reserve: CARDINAL ← 0, forSystemUse: BOOLEAN ← TRUE]
RETURNS [BufferAccessHandle];
FreeBufferPool: PROCEDURE [BufferAccessHandle];
BuffersLeft:
PROCEDURE [aH: BufferAccessHandle ← systemAccessHandle]
RETURNS [CARDINAL];
SendBuffersLeft: PROCEDURE [BufferAccessHandle] RETURNS [CARDINAL];
ReceiveBuffersLeft: PROCEDURE [BufferAccessHandle] RETURNS [CARDINAL];
EnumerateBuffersInPool: PROCEDURE [BufferAccessHandle, PROCEDURE [Buffer]];
GetFreeBuffer:
PROCEDURE [
bufType: BufferType ← raw, aH: BufferAccessHandle ← systemAccessHandle,
bufFunc: BufferFunction ← systemUse] RETURNS [Buffer];
MaybeGetFreeBuffer:
PROCEDURE [
bufType: BufferType ← raw, aH: BufferAccessHandle ← systemAccessHandle,
bufFunc: BufferFunction ← systemUse] RETURNS [Buffer];
ReturnFreeBuffer: PROCEDURE [Buffer];
AdjustBufferSize: PROCEDURE [bufferSize: CARDINAL];
GetBufferSize: PROCEDURE RETURNS [bufferSize: CARDINAL];
DataWordsPerRawBuffer: PROCEDURE RETURNS [CARDINAL];
DataWordsPerPupBuffer: PROCEDURE RETURNS [CARDINAL];
DataWordsPerOisBuffer: PROCEDURE RETURNS [CARDINAL];
DataWordsPerSppBuffer: PROCEDURE RETURNS [CARDINAL];
defaultSystemBufferPoolSize: CARDINAL = 0;
defaultSystemBuffersToReserve: CARDINAL = 0;
defaultDataWordsPerSystemBuffer:
CARDINAL =
MAX[
PupTypes.maxDataWordsPerGatewayPup, OISCPTypes.maxDataWordsPerSpp];
BUFFER
BufferFunction: TYPE = {send, receive, systemUse};
BufferType: TYPE = {raw, pup, ois, oisSpp, rejected, processed};
Buffer: TYPE = LONG POINTER TO BufferObject;
BufferObject:
TYPE =
MACHINE
DEPENDENT
RECORD [
next: PRIVATE Buffer,
queue: PRIVATE Queue,
pool: PRIVATE BufferAccessHandle,
currentOwner: PRIVATE BufferAccessHandle,
requeueProcedure: PROCEDURE [Buffer],
requeueData: UNSPECIFIED,
requeueRef: REF ANY, -- BEWARE: storing into here is not reference-counted
seal: PRIVATE DriverTypes.Seal,
length: PRIVATE CARDINAL,
network: PRIVATE Network,
iocbChain: PRIVATE LONG POINTER,
status: PRIVATE WORD,
time: PRIVATE LONG CARDINAL--System.Pulses--,
tries: PRIVATE CARDINAL,
allNets: PRIVATE BOOLEAN,
bypassZeroNet: PRIVATE BOOLEAN,
device: PRIVATE DriverTypes.DeviceType,
type: BufferType,
bufFunc: BufferFunction,
spare: [0..37B],
debug: PRIVATE UNSPECIFIED,
encapsulation: PRIVATE DriverTypes.Encapsulation,
bufferBody:
SELECT
OVERLAID BufferType
FROM
raw => [rawWords: ARRAY [0..0) OF WORD],
pup => [
pupLength: CARDINAL, -- in bytes, includes header
pupTransportControl: Byte, -- 4 bits of hopcount, 4 spares
pupType: PupTypes.PupType,
pupID: PupTypes.Pair,
dest, source: PupAddress,
pupBody:
SELECT
OVERLAID *
FROM
pupWords => [pupWords: ARRAY [0..0) OF WORD],
pupBytes => [pupBytes: PACKED ARRAY [0..0) OF Byte],
pupChars => [pupChars: PACKED ARRAY [0..0) OF CHARACTER],
pupString => [pupString: StringBody],
rfc => [address: PupAddress],
ack => [
maximumBytesPerPup: CARDINAL,
numberOfPupsAhead: CARDINAL,
numberOfBytesAhead: CARDINAL],
abort => [
abortCode: WORD, abortText: PACKED ARRAY [0..0) OF CHARACTER],
error => [
see [MAXC]<PUP>Error.ears
errorHeader: ARRAY [0..9] OF WORD,
errorCode: PupTypes.PupErrorCode,
errorOptions: WORD,
errorText: PACKED ARRAY [0..0) OF CHARACTER],
ENDCASE],
software checksum (1 word) comes after all the data
ois => [ois: OISCPTypes.BufferBody]
ENDCASE];
Magic numbers describing the buffer
zz: PRIVATE POINTER TO BufferObject = NIL;
wordsPerNonVarientBufferOverhead:
CARDINAL =
LOOPHOLE[@zz.bufferBody, CARDINAL] - LOOPHOLE[zz, CARDINAL];
END.