DIRECTORY JunoStorage; JunoStorageImpl: MONITOR EXPORTS JunoStorage = BEGIN OPEN JunoStorage; pointAvail: Point _ NIL; nPoints, mPoints: INT _ 0; NewPoint: PUBLIC ENTRY PROC [coords: Coords, visible: BOOL _ FALSE] RETURNS [p: Point] = BEGIN IF pointAvail = NIL THEN THROUGH [1..50] DO pointAvail _ NEW [PointRec _ [link: pointAvail]]; mPoints _ mPoints+1 ENDLOOP; p _ pointAvail; pointAvail _ pointAvail.link; p.link _ NIL; p^ _ [coords: coords, visible: visible, link: NIL]; nPoints _ nPoints+1 END; DeletePoint: PUBLIC PROC [p, ant: Point, list: PointList] RETURNS [newList: PointList] = BEGIN IF p = list.first THEN {IF ant # NIL THEN ERROR; newList.first _ p.link} ELSE {IF ant = NIL THEN {ant _ list.first; WHILE ant.link # p DO ant _ ant.link ENDLOOP} ELSE {IF ant.link # p THEN ERROR}; ant.link _ p.link; newList.first _ list.first}; newList.last _ IF p = list.last THEN ant ELSE list.last; p.link _ NIL END; InsertPoint: PUBLIC PROC [p, ant: Point, list: PointList] RETURNS [newList: PointList] = BEGIN IF ant = NIL THEN {p.link _ list.first; newList.first _ p} ELSE {p.link _ ant.link; ant.link _ p; newList.first _ list.first}; newList.last _ IF p.link = NIL THEN p ELSE list.last END; GcPoints: PUBLIC PROC [start: Point, lim: Point _ NIL] = BEGIN t: Point; GcIt: ENTRY PROC [p: Point] = {p^ _ [link: pointAvail]; pointAvail _ p}; WHILE start # lim DO t _ start.link; GcIt[start]; start _ t ENDLOOP END; itemAvail: Item _ NIL; nItems, mItems: INT _ 0; NewItem: PUBLIC ENTRY PROC [kind: ItemKind, args: ItemArgs, frame: Frame_ nullFrame] RETURNS [item: Item] = BEGIN IF itemAvail = NIL THEN BEGIN -- Create a bunch of new records t: Item; THROUGH [1..50] DO t _ itemAvail; itemAvail _ NEW[ItemRec _ [link: t, kind: draw, frame: nullFrame, args: NIL]]; itemAvail.link _ t; mItems _ mItems+1 ENDLOOP END; item _ itemAvail; itemAvail _ itemAvail.link; item.link _ NIL; item.kind _ kind; item.frame _ frame; item.args _ args; nItems _ nItems+1 END; DeleteItem: PUBLIC PROC [item, ant: Item, list: ItemList] RETURNS [newList: ItemList] = BEGIN IF item = list.first THEN {IF ant # NIL THEN ERROR; newList.first _ item.link} ELSE {IF ant = NIL THEN {ant _ list.first; WHILE ant.link # item DO ant _ ant.link ENDLOOP} ELSE {IF ant.link # item THEN ERROR}; ant.link _ item.link; newList.first _ list.first}; newList.last _ IF item = list.last THEN ant ELSE list.last; item.link _ NIL END; InsertItem: PUBLIC PROC [item, ant: Item, list: ItemList] RETURNS [newList: ItemList] = BEGIN IF ant = NIL THEN {item.link _ list.first; newList.first _ item} ELSE {item.link _ ant.link; ant.link _ item; newList.first _ list.first}; newList.last _ IF item.link = NIL THEN item ELSE list.last END; GcItems: PUBLIC PROC [start: Item, lim: Item _ NIL] = BEGIN t: Item; GcIt: ENTRY PROC [z: Item] = {z.link _ itemAvail; itemAvail _ z}; WHILE start # lim DO t _ start.link; GcList[start.args, NIL]; GcIt[start]; start _ t ENDLOOP END; listAvail: List _ NIL; nLists, mLists: INT _ 0; Cons: PUBLIC ENTRY PROC [first: REF ANY, rest: List] RETURNS [cons: List] = BEGIN IF listAvail = NIL THEN BEGIN THROUGH [1..100] DO listAvail _ CONS[NIL, listAvail]; mLists _ mLists+1 ENDLOOP END; cons _ listAvail; listAvail _ listAvail.rest; cons.first _ first; cons.rest _ rest; nLists _ nLists+1 END; GcList: PUBLIC PROC [start: LIST OF REF ANY, lim: LIST OF REF ANY _ NIL] = BEGIN t: LIST OF REF ANY; GcIt: ENTRY PROC [s: LIST OF REF ANY] = {s.first _ NIL; s.rest _ listAvail; listAvail _ s}; WHILE start # lim DO t _ start.rest; GcIt[start]; start _ t ENDLOOP END; InitStorage: PROC = BEGIN GcPoints[NewPoint[[0, 0]], NIL]; GcItems[NewItem[kind: hor, args: NIL, frame: nullFrame], NIL]; GcList[Cons[NIL, NIL], NIL] END; InitStorage[] END. À JunoStorageImpl.mesa Coded June 81 by Greg Nelson. Last edited by GNelson (?) January 19, 1984 1:52 pm Last edited by Stolfi June 15, 1984 7:15:48 am PDT Defines record types, allocation and deallocation functions. TO FIX: Is it necessary for it to be a monitor?. TO FIX: Frames in constraints --- pass them to NewXXX procedures?. - - - - POINTS nPoints counts calls to NewPoint, mPoints counts actual allocations - - - - ITEMS (CONSTRAINTS AND ACTIONS) nItems counts total allocations, mItems counts max in use at same time - - - - LISTS nLists counts total list cell allocations, mLists counts max in use at same time - - - - INITIALIZATION Allocator warming-up exercises Êј™™J™J™3Jšœ5™5—J™=—JšœÏbœ+™2šœœ=™DšœÏk ˜ Jšœ ˜ ——Jšœœž˜Jšœžœ˜Jšœžœžœ ˜™Jšœž˜šœžœ˜J™E—š Ïn œžœžœžœžœ Ÿ˜YJšœžœžœžœžœžœ žœžœGžœEžœ4žœžœ˜È—šŸ œžœžœ"žœ˜YJš/œžœžœžœžœžœžœžœ$žœžœžœžœ)žœžœžœ žœ žœžœžœRžœžœžœžœžœ˜˜—šŸ œžœžœ"žœ˜YJšœžœžœžœžœ7žœežœ žœžœžœ žœ˜å—šŸ œžœžœžœ˜9JšœžœŸœžœžœ;žœ žœ1žœžœ˜±——™(Jšœžœ˜šœ˜JšœH™H—šœŸœžœ=ž œ˜sšœžœžœ žœž˜ JšœžœÏc!œ žœ žœ$žœ9žœ5žœžœ˜ì—JšœAžœQžœ˜™—š œŸ œžœžœ#žœ˜XJš/œžœžœžœžœžœžœžœ%žœžœžœžœ)žœžœžœ žœ žœžœžœUžœžœžœžœžœ˜©—š œŸ œžœžœ#žœ˜XJšœžœžœžœžœ>žœhžœ žœžœžœ žœ˜õ—š œŸœžœžœžœ˜6JšœžœŸœžœžœ4žœ žœ,žœ%žœžœ˜Ì——™Jšœžœ˜šœžœ˜JšœR™R—šœŸœžœžœžœ žœžœžœ˜Lšœžœžœ žœž˜ Jšœžœžœ žœžœžœ'žœžœ˜j—Jšœožœ˜s—šœŸœž œžœžœžœžœžœžœžœžœžœ˜KJš#œžœžœžœžœžœŸœžœžœžœžœžœžœžœ(žœ žœ7žœžœ˜Ô——™šœŸ œžœ˜J™ Jšœžœ žœ(žœžœžœžœžœžœ˜“—Jšœ˜—Jšœžœ˜—…—bó