home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 375.lha / IncrStorageManager_v1.0 / HandleCollection.mod < prev    next >
Text File  |  1990-05-02  |  3KB  |  117 lines

  1. IMPLEMENTATION MODULE HandleCollection;
  2.  
  3. (* Product: Incremental Storage Manager
  4.  
  5.    Version: 1.0
  6.  
  7.    Author:
  8.         Daniel B. Hankins
  9.         143 Montgomery Street
  10.         Poughkeepsie, NY 12601
  11.         dan-hankins@cup.portal.com
  12.  
  13.    Creation Date: 1989
  14.  
  15.    Release  Date: November 21, 1989
  16.  
  17.    Notice of Intellectual Property:
  18.         This material is *NOT COPYRIGHTED*.  By this notice, I hereby place
  19.    this program and all its parts in the public domain, under the definitions
  20.    and restrictions of United States law.
  21.  
  22.    History of Revisions:
  23.         None yet.
  24. *)
  25.  
  26. FROM SYSTEM  IMPORT ADDRESS, TSIZE, ADR;
  27. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  28.  
  29. IMPORT DynamicItem;
  30. IMPORT FreeHandle;
  31.  
  32. CONST
  33.   NumberOfHandlesInBlock = 255;
  34.  
  35. TYPE
  36.   HandleBlockPtr = POINTER TO HandleBlock;
  37.   HandleBlock = RECORD
  38.                   Next: HandleBlockPtr;
  39.                   Contents: ARRAY[1..NumberOfHandlesInBlock]
  40.                             OF DynamicItem.Object;
  41.                 END;
  42.  
  43. VAR
  44.   FirstFreeHandle:      FreeHandle.Object;
  45.   CurrentHandleInBlock: ADDRESS;
  46.   CurrentHandlesLeft:   CARDINAL;
  47.   FirstBlock:           HandleBlockPtr;
  48.  
  49. PROCEDURE NewHandle(): ADDRESS;
  50. VAR
  51.   NewItemHandle: DynamicItem.Object;
  52.   NewBlock:      HandleBlockPtr;
  53. BEGIN
  54.   IF NOT(FreeHandle.Nil(FirstFreeHandle)) THEN
  55.     NewItemHandle   := DynamicItem.Object(FirstFreeHandle);
  56.     FirstFreeHandle := FreeHandle.Next(FirstFreeHandle);
  57.     RETURN ADDRESS(NewItemHandle);
  58.   END;
  59.  
  60.   IF CurrentHandlesLeft > 0 THEN
  61.     NewItemHandle := DynamicItem.Object(CurrentHandleInBlock);
  62.     CurrentHandleInBlock :=
  63.       ADDRESS(LONGCARD(CurrentHandleInBlock) + TSIZE(DynamicItem.Object));
  64.     CurrentHandlesLeft := CurrentHandlesLeft - 1;
  65.     RETURN ADDRESS(NewItemHandle);
  66.   ELSE
  67.     ALLOCATE(NewBlock, TSIZE(HandleBlock));
  68.     IF NewBlock = NIL THEN
  69.       RETURN NIL;
  70.     END;
  71.     NewBlock^.Next := FirstBlock;
  72.     FirstBlock := NewBlock;
  73.     NewItemHandle := DynamicItem.Object(ADR(NewBlock^.Contents));
  74.     CurrentHandleInBlock :=
  75.       ADDRESS(LONGCARD(NewItemHandle) + TSIZE(DynamicItem.Object));
  76.     CurrentHandlesLeft := NumberOfHandlesInBlock - 1;
  77.     RETURN ADDRESS(NewItemHandle);
  78.   END;
  79. END NewHandle;
  80.  
  81. PROCEDURE DisposeHandle(Item: ADDRESS);
  82. VAR
  83.   TempItem: POINTER TO FreeHandle.Object;
  84. BEGIN
  85.   TempItem  := Item;
  86.   TempItem^ := FirstFreeHandle;
  87.   FirstFreeHandle := FreeHandle.Object(Item);
  88. END DisposeHandle;
  89.  
  90.  
  91. PROCEDURE DisposeAll();
  92. VAR
  93.   CurrentBlock, Temp: HandleBlockPtr;
  94. BEGIN
  95.   CurrentBlock := FirstBlock;
  96.   LOOP
  97.     IF CurrentBlock = NIL THEN
  98.       EXIT;
  99.     END;
  100.     Temp := CurrentBlock^.Next;
  101.     DEALLOCATE(CurrentBlock, TSIZE(HandleBlock));
  102.     CurrentBlock := Temp;
  103.   END;
  104.   FirstFreeHandle      := FreeHandle.NilObject();
  105.   CurrentHandleInBlock := NIL;
  106.   CurrentHandlesLeft   := 0;
  107.   FirstBlock           := NIL;
  108. END DisposeAll;
  109.  
  110.  
  111. BEGIN
  112.   FirstFreeHandle      := FreeHandle.NilObject();
  113.   CurrentHandleInBlock := NIL;
  114.   CurrentHandlesLeft   := 0;
  115.   FirstBlock           := NIL;
  116. END HandleCollection.
  117.