aboutsummaryrefslogtreecommitdiff
path: root/src/kompsos-collector.adb
diff options
context:
space:
mode:
authorJedidiah Barber <contact@jedbarber.id.au>2026-01-19 13:43:42 +1300
committerJedidiah Barber <contact@jedbarber.id.au>2026-01-19 13:43:42 +1300
commit0c3e440a6eaf45e83654e9d8f5471e88a2eacf77 (patch)
treef1f3383b85f64a538be5edb1f622765e6cad0a9c /src/kompsos-collector.adb
parentdb8422a9f4e331fcbb0a17e20e919bc12824b111 (diff)
Cached results now freed after being used by all possible branches
Diffstat (limited to 'src/kompsos-collector.adb')
-rw-r--r--src/kompsos-collector.adb80
1 files changed, 48 insertions, 32 deletions
diff --git a/src/kompsos-collector.adb b/src/kompsos-collector.adb
index 592979f..7d48196 100644
--- a/src/kompsos-collector.adb
+++ b/src/kompsos-collector.adb
@@ -14,6 +14,23 @@ with
package body Kompsos.Collector is
+ ----------------------
+ -- Progress State --
+ ----------------------
+
+ Cache : Cache_Maps.Map;
+ Book : Eval_Maps.Map;
+
+ Global_Var : Variable := Relation.Next_Var;
+
+ Next_Index : Long_Positive := 1;
+ Next_State : State;
+ State_Valid : Boolean := False;
+ Exhausted : Boolean := False;
+
+
+
+
-------------------------
-- Memory Management --
-------------------------
@@ -22,9 +39,14 @@ package body Kompsos.Collector is
procedure Free is new Ada.Unchecked_Deallocation (State, State_Access);
procedure Finalize
- (This : in out Managed_Map) is
+ (This : in out Collector_Final_Controller) is
begin
- for Datum of This.Actual loop
+ for Memo of Cache loop
+ for Line of Memo.Data loop
+ Free (Line.Data);
+ end loop;
+ end loop;
+ for Datum of Book loop
if Datum.Kind = Conjunct_Data then
Free (Datum.Con_Base);
Free (Datum.Con_Part);
@@ -35,25 +57,6 @@ package body Kompsos.Collector is
- ----------------------
- -- Progress State --
- ----------------------
-
- Cache_Memo : Cache_Maps.Map := Cache_Maps.Empty_Map;
- Bookkeep : Managed_Map := (Ada.Finalization.Controlled with Actual => Eval_Maps.Empty_Map);
-
- Book : Eval_Maps.Map renames Bookkeep.Actual;
-
- Global_Var : Variable := Relation.Next_Var;
-
- Next_Index : Long_Positive := 1;
- Next_State : State;
- State_Valid : Boolean := False;
- Exhausted : Boolean := False;
-
-
-
-
------------------------
-- Internal Helpers --
------------------------
@@ -151,7 +154,12 @@ package body Kompsos.Collector is
return;
end if;
- Cache_Memo.Exclude (Ptr.Actual);
+ if Cache.Contains (Ptr.Actual) then
+ for Line of Cache (Ptr.Actual).Data loop
+ Free (Line.Data);
+ end loop;
+ Cache.Delete (Ptr.Actual);
+ end if;
case Ptr.Actual.Kind is
when Unify_Node =>
@@ -354,8 +362,10 @@ package body Kompsos.Collector is
Book.Insert (Ptr, (Kind => Recurse_Data, others => <>));
if Ptr.Rec_Goal.Actual = null then
Book (Ptr).Rec_Cache := False;
- elsif not Cache_Memo.Contains (Ptr.Rec_Goal.Actual) then
- Cache_Memo.Insert (Ptr.Rec_Goal.Actual, State_Vectors.Empty_Vector);
+ elsif not Cache.Contains (Ptr.Rec_Goal.Actual) then
+ Cache.Insert (Ptr.Rec_Goal.Actual, (True, State_Vectors.Empty_Vector));
+ else
+ Cache (Ptr.Rec_Goal.Actual).Keep := True;
end if;
end if;
if Book (Ptr).Rec_Gone then
@@ -376,7 +386,7 @@ package body Kompsos.Collector is
end if;
end loop;
if Book (Ptr).Rec_Cache and Ptr.Rec_Goal.Actual.Counter = 1 then
- Cache_Memo (Ptr.Rec_Goal.Actual).Append (Result);
+ Cache (Ptr.Rec_Goal.Actual).Data.Append ((1, new State'(Result)));
end if;
Book (Ptr).Rec_Next := Book.Element (Ptr).Rec_Next + 1;
return True;
@@ -400,19 +410,25 @@ package body Kompsos.Collector is
else
return False;
end if;
- elsif Cache_Memo.Contains (Ptr.Actual) and then
- Index <= Cache_Memo (Ptr.Actual).Last_Index
+ elsif Cache.Contains (Ptr.Actual) and then
+ Index <= Cache (Ptr.Actual).Data.Last_Index
then
- Result := Cache_Memo (Ptr.Actual) (Index);
+ Result := Cache (Ptr.Actual).Data (Index).Data.all;
+ Cache (Ptr.Actual).Data (Index).Used := Cache (Ptr.Actual).Data (Index).Used + 1;
+ if not Cache (Ptr.Actual).Keep and then
+ Natural (Cache (Ptr.Actual).Data (Index).Used) >= Ptr.Actual.Counter
+ then
+ Free (Cache (Ptr.Actual).Data (Index).Data);
+ end if;
return True;
else
return Found : constant Boolean := Do_Get_Next (Ptr.Actual, Base, Index, Result) do
if Found and Ptr.Actual.Counter > 1 then
- if not Cache_Memo.Contains (Ptr.Actual) then
- Cache_Memo.Insert (Ptr.Actual, State_Vectors.Empty_Vector);
+ if not Cache.Contains (Ptr.Actual) then
+ Cache.Insert (Ptr.Actual, (False, State_Vectors.Empty_Vector));
end if;
- pragma Assert (Index = Cache_Memo (Ptr.Actual).Last_Index + 1);
- Cache_Memo (Ptr.Actual).Append (Result);
+ pragma Assert (Index = Cache (Ptr.Actual).Data.Last_Index + 1);
+ Cache (Ptr.Actual).Data.Append ((1, new State'(Result)));
end if;
end return;
end if;