<<-- File: FileStreamProcessCacheImpl.mesa>> <<-- Please maintain change log at end of file. -- Last Edited by -- Hagmann on December 6, 1983 4:50 pm >> <<>> DIRECTORY FileStreamPrivate USING [ BufferNodeHandle, BufferNode, FileDataHandle, FileData, NodeStatus, ProcessNode ], FS, IO, Process, Rope; FileStreamProcessCacheImpl: CEDAR MONITOR IMPORTS FileStreamPrivate, Process EXPORTS FileStreamPrivate = BEGIN ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; FileData: TYPE = FileStreamPrivate.FileData; BufferNode: TYPE = FileStreamPrivate.BufferNode; FileDataHandle: TYPE = FileStreamPrivate.FileDataHandle; BufferNodeHandle: TYPE = FileStreamPrivate.BufferNodeHandle; NumberOfProcesses: INT = 3 ; ModuleCondition: CONDITION; QueueRecord: TYPE = RECORD [ fileData: FileDataHandle, node: BufferNodeHandle <<,nodeStatus: FileStreamPrivate.NodeStatus>> <<,nodeFirstFileByteInBuffer: INT>> ]; QUEUESIZE: INT = 20 ; Queue: ARRAY [0..QUEUESIZE) OF QueueRecord ; PutQueue: INT _ 0 ; GetQueue: INT _ 0 ; NoEntries: INT _ 0 ; <> StartRequest: PUBLIC ENTRY PROC [ fileData: FileDataHandle, node: BufferNodeHandle ] = { tempCount: INT _ NoEntries ; ptr: INT _ GetQueue ; IF node.status # needsParallelRead AND node.status # needsParallelWrite THEN ERROR ; WHILE tempCount > 0 DO IF Queue[ptr].node = node THEN ERROR ; ptr _ IF ptr = QUEUESIZE-1 THEN 0 ELSE ptr+1 ; tempCount _ tempCount - 1 ; ENDLOOP; WHILE NoEntries >= QUEUESIZE - 1 DO WAIT ModuleCondition ; ENDLOOP; Queue[PutQueue] _ [fileData, node --, node.status, node.firstFileByteInBuffer--]; PutQueue _ IF PutQueue = QUEUESIZE-1 THEN 0 ELSE PutQueue+1 ; NoEntries _ NoEntries + 1; BROADCAST ModuleCondition ; }; FindSomethingToDo: ENTRY PROC [] RETURNS [fileData: FileDataHandle, node: BufferNodeHandle ]= { WHILE NoEntries = 0 DO WAIT ModuleCondition ; ENDLOOP; [fileData, node ] _ Queue[GetQueue] ; Queue[GetQueue] _ [NIL,NIL]; GetQueue _ IF GetQueue = QUEUESIZE-1 THEN 0 ELSE GetQueue+1 ; NoEntries _ NoEntries - 1; BROADCAST ModuleCondition ; }; <> FileStreamForegroundProcess: PROC [] = { DO fileData: FileDataHandle ; node: BufferNodeHandle; [fileData, node] _ FindSomethingToDo []; FileStreamPrivate.ProcessNode[fileData, node] ; ENDLOOP; }; myPriority: Process.Priority ; myPriority _ Process.GetPriority[]; Process.SetPriority[Process.priorityForeground]; FOR I:INT IN [1..NumberOfProcesses] DO process: PROCESS; process _ FORK FileStreamForegroundProcess[]; TRUSTED {Process.Detach[process]; }; ENDLOOP; Process.SetPriority[myPriority]; END. CHANGE LOG Created by Hagmann on December 6, 1983 3:02 pm <>