Prechádzať zdrojové kódy

Added simple GC algorithm, which still seems to throw away a bit too much

Yentl Van Tendeloo 9 rokov pred
rodič
commit
58c9d93d47

+ 3 - 0
hybrid_server/classes/mvkcontroller.xml

@@ -7,6 +7,8 @@
         <body>
             <![CDATA[
             self.mvs = ModelverseState("../bootstrap/bootstrap.m")
+            # Enable Garbage Collection
+            self.mvs.GC = True
             self.root = self.mvs.read_root()[0]
             self.mvk = ModelverseKernel(self.root)
             self.all_failed = False
@@ -57,6 +59,7 @@
             while 1:
                 commands = self.mvk.execute_yields(username, operation, params, reply)
                 if commands is None:
+                    self.mvs.garbage_collect()
                     break
                 reply = [self.mvs_operations[command[0]](*(command[1]))[0] for command in commands]
             ]]>

+ 2 - 2
kernel/modelverse_kernel/main.py

@@ -59,12 +59,12 @@ class ModelverseKernel(object):
             gen = self.helper_init(user_root)
         elif isinstance(phase_v, string_types):
             if phase_v == "init" and inst in self.compiled:
-                #print("%-30s(%s)" % ("COMPILED " + str(self.primitives[inst]), phase_v))
+                print("%-30s(%s)" % ("COMPILED " + str(self.compiled[inst]), phase_v))
                 gen = self.execute_primitive(user_root, inst, username)
             elif inst_v is None:
                 raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info, inst_v, phase_v))
             else:
-                #print("%-30s(%s) -- %s" % (inst_v["value"], phase_v, username))
+                print("%-30s(%s) -- %s" % (inst_v["value"], phase_v, username))
                 gen = getattr(self, "%s_%s" % (inst_v["value"], phase_v))(user_root)
         elif inst_v is None:
             raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info, inst_v, phase_v))

+ 1 - 1
scripts/make_all.py

@@ -17,4 +17,4 @@ if __name__ == "__main__":
         for f in files:
             do_compile(address, f, str(random.random()), f, "CO")
 
-        link_and_load(address, username, files, False)
+        link_and_load(address, username, files)

+ 18 - 0
state/modelverse_state/main.py

@@ -28,6 +28,8 @@ class ModelverseState(object):
         self.incoming = defaultdict(set)
         self.values = {}
         self.nodes = set()
+        self.GC = True
+        self.to_delete = set()
 
         self.cache = {}
 
@@ -315,10 +317,15 @@ class ModelverseState(object):
             return ([self.edges[e][0] for e in matches], status.SUCCESS)
 
     def delete_node(self, node):
+        if node is self.root:
+            return (None, status.FAIL_DN_UNKNOWN)
+
         if node not in self.nodes:
             return (None, status.FAIL_DN_UNKNOWN)
 
         self.nodes.remove(node)
+        if node in self.values:
+            del self.values[node]
         s = set()
         for e in self.outgoing[node]:
             s.add(e)
@@ -338,6 +345,7 @@ class ModelverseState(object):
         s, t = self.edges[edge]
         self.incoming[t].remove(edge)
         self.outgoing[s].remove(edge)
+
         del self.edges[edge]
 
         s = set()
@@ -350,4 +358,14 @@ class ModelverseState(object):
         del self.outgoing[edge]
         del self.incoming[edge]
 
+        if (self.GC) and (not self.incoming[t]) and (t not in self.edges):
+            # Remove this node as well
+            # Edges aren't deleted like this, as they might have a reachable target and source!
+            # If they haven't, they will be removed because the source was removed.
+            self.to_delete.add(t)
+
         return (None, status.SUCCESS)
+
+    def garbage_collect(self):  
+        while self.to_delete:
+            self.delete_node(self.to_delete.pop())