<> <> <> <> <<>> DIRECTORY GGStoragePools; GGStoragePoolsImpl: CEDAR MONITOR LOCKS pool USING pool: StoragePool EXPORTS GGStoragePools = BEGIN MakeStorageProc: TYPE = GGStoragePools.MakeStorageProc; AllocateProc: TYPE = GGStoragePools.AllocateProc; FreeProc: TYPE = GGStoragePools.FreeProc; StoragePoolClass: TYPE = REF StoragePoolClassObj; StoragePoolClassObj: TYPE = GGStoragePools.StoragePoolClassObj; StoragePool: TYPE = REF StoragePoolObj; StoragePoolObj: TYPE = GGStoragePools.StoragePoolObj; CreateClass: PUBLIC PROC [name: ATOM, allocate: AllocateProc, free: FreeProc] RETURNS [class: StoragePoolClass] = { class _ NEW[StoragePoolClassObj _ [name, allocate, free]]; }; CreatePool: PUBLIC PROC [class: StoragePoolClass, makeStorage: MakeStorageProc] RETURNS [pool: StoragePool] = { <> pool _ NEW[StoragePoolObj _ [class: class, data: NIL]]; makeStorage[pool]; }; <<>> Allocate: PUBLIC ENTRY PROC [pool: StoragePool] RETURNS [item: REF ANY] = { item _ pool.class.allocate[pool]; }; Free: PUBLIC ENTRY PROC [pool: StoragePool, item: REF ANY] = { pool.class.free[pool, item]; }; END.