home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1990-05-02 | 2.9 KB | 117 lines |
- IMPLEMENTATION MODULE HandleCollection;
-
- (* Product: Incremental Storage Manager
-
- Version: 1.0
-
- Author:
- Daniel B. Hankins
- 143 Montgomery Street
- Poughkeepsie, NY 12601
- dan-hankins@cup.portal.com
-
- Creation Date: 1989
-
- Release Date: November 21, 1989
-
- Notice of Intellectual Property:
- This material is *NOT COPYRIGHTED*. By this notice, I hereby place
- this program and all its parts in the public domain, under the definitions
- and restrictions of United States law.
-
- History of Revisions:
- None yet.
- *)
-
- FROM SYSTEM IMPORT ADDRESS, TSIZE, ADR;
- FROM Storage IMPORT ALLOCATE, DEALLOCATE;
-
- IMPORT DynamicItem;
- IMPORT FreeHandle;
-
- CONST
- NumberOfHandlesInBlock = 255;
-
- TYPE
- HandleBlockPtr = POINTER TO HandleBlock;
- HandleBlock = RECORD
- Next: HandleBlockPtr;
- Contents: ARRAY[1..NumberOfHandlesInBlock]
- OF DynamicItem.Object;
- END;
-
- VAR
- FirstFreeHandle: FreeHandle.Object;
- CurrentHandleInBlock: ADDRESS;
- CurrentHandlesLeft: CARDINAL;
- FirstBlock: HandleBlockPtr;
-
- PROCEDURE NewHandle(): ADDRESS;
- VAR
- NewItemHandle: DynamicItem.Object;
- NewBlock: HandleBlockPtr;
- BEGIN
- IF NOT(FreeHandle.Nil(FirstFreeHandle)) THEN
- NewItemHandle := DynamicItem.Object(FirstFreeHandle);
- FirstFreeHandle := FreeHandle.Next(FirstFreeHandle);
- RETURN ADDRESS(NewItemHandle);
- END;
-
- IF CurrentHandlesLeft > 0 THEN
- NewItemHandle := DynamicItem.Object(CurrentHandleInBlock);
- CurrentHandleInBlock :=
- ADDRESS(LONGCARD(CurrentHandleInBlock) + TSIZE(DynamicItem.Object));
- CurrentHandlesLeft := CurrentHandlesLeft - 1;
- RETURN ADDRESS(NewItemHandle);
- ELSE
- ALLOCATE(NewBlock, TSIZE(HandleBlock));
- IF NewBlock = NIL THEN
- RETURN NIL;
- END;
- NewBlock^.Next := FirstBlock;
- FirstBlock := NewBlock;
- NewItemHandle := DynamicItem.Object(ADR(NewBlock^.Contents));
- CurrentHandleInBlock :=
- ADDRESS(LONGCARD(NewItemHandle) + TSIZE(DynamicItem.Object));
- CurrentHandlesLeft := NumberOfHandlesInBlock - 1;
- RETURN ADDRESS(NewItemHandle);
- END;
- END NewHandle;
-
- PROCEDURE DisposeHandle(Item: ADDRESS);
- VAR
- TempItem: POINTER TO FreeHandle.Object;
- BEGIN
- TempItem := Item;
- TempItem^ := FirstFreeHandle;
- FirstFreeHandle := FreeHandle.Object(Item);
- END DisposeHandle;
-
-
- PROCEDURE DisposeAll();
- VAR
- CurrentBlock, Temp: HandleBlockPtr;
- BEGIN
- CurrentBlock := FirstBlock;
- LOOP
- IF CurrentBlock = NIL THEN
- EXIT;
- END;
- Temp := CurrentBlock^.Next;
- DEALLOCATE(CurrentBlock, TSIZE(HandleBlock));
- CurrentBlock := Temp;
- END;
- FirstFreeHandle := FreeHandle.NilObject();
- CurrentHandleInBlock := NIL;
- CurrentHandlesLeft := 0;
- FirstBlock := NIL;
- END DisposeAll;
-
-
- BEGIN
- FirstFreeHandle := FreeHandle.NilObject();
- CurrentHandleInBlock := NIL;
- CurrentHandlesLeft := 0;
- FirstBlock := NIL;
- END HandleCollection.
-