<> <> <> DIRECTORY Environment, Space, PDInterpSysCalls; PDInterpSysCallsCedar4Impl: MONITOR IMPORTS Space EXPORTS PDInterpSysCalls ~ BEGIN spaces: LIST OF Space.Handle; SetDisplayLights: PUBLIC ENTRY PROC [value: [0..9999]] = {}; AllocateSpace: PUBLIC ENTRY PROC [words: INT] RETURNS [LONG POINTER] ~ { ENABLE UNWIND => NULL; pages: CARDINAL _ (words+Environment.wordsPerPage)/Environment.wordsPerPage; space: Space.Handle _ Space.Create[size: pages, parent: Space.virtualMemory]; Space.Map[space]; IF pages > 16 THEN Space.CreateUniformSwapUnits[16, space]; spaces _ CONS[space, spaces]; RETURN [Space.LongPointer[space]]; }; FreeSpace: PUBLIC ENTRY PROC [pointer: LONG POINTER] ~ { ENABLE UNWIND => NULL; prev: LIST OF Space.Handle _ NIL; FOR s: LIST OF Space.Handle _ spaces, s.rest UNTIL s = NIL DO IF Space.LongPointer[s.first] = pointer THEN { Space.Delete[s.first]; IF prev = NIL THEN spaces _ s.rest ELSE prev.rest _ s.rest; RETURN; }; prev _ s; ENDLOOP; BadFreeSpaceRequest[]; }; BadFreeSpaceRequest: PUBLIC ERROR ~ CODE; END.