sim: Add support for notifying Drainable objects of a fork
authorAndreas Sandberg <andreas@sandberg.pp.se>
Thu, 26 Nov 2015 10:03:43 +0000 (10:03 +0000)
committerAndreas Sandberg <andreas@sandberg.pp.se>
Thu, 26 Nov 2015 10:03:43 +0000 (10:03 +0000)
When forking a gem5 process, some objects need to clean up resources
(mainly file descriptions) shared between the child and the parent of
the fork. This changeset adds the notifyFork() method to Drainable,
which is called in the child process.

Signed-off-by: Andreas Sandberg <andreas@sandberg.pp.se>
[sascha.bischoff@arm.com: Rebased patches onto a newer gem5 version]
Signed-off-by: Sascha Bischoff <sascha.bischoff@arm.com>
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
src/python/m5/simulate.py
src/sim/drain.hh

index 66344bc79ee84f4264e023e9c31476c2cd47019e..d89629d2df6d4c6c5db0b61a9c3a7c6229f46595 100644 (file)
@@ -308,4 +308,8 @@ def switchCpus(system, cpuList, verbose=True):
     for old_cpu, new_cpu in cpuList:
         new_cpu.takeOverFrom(old_cpu)
 
+def notifyFork(root):
+    for obj in root.descendants():
+        obj.notifyFork()
+
 from internal.core import disableAllListeners
index 31dbc97af77f3df271529e73581e7cba44d2c11e..370217bd6a156372e1760ca523a8711e10291f9e 100644 (file)
@@ -275,6 +275,20 @@ class Drainable
     /** Return the current drain state of an object. */
     DrainState drainState() const { return _drainState; }
 
+    /**
+     * Notify a child process of a fork.
+     *
+     * When calling fork in gem5, we need to ensure that resources
+     * shared between the parent and the child are consistent. This
+     * method is intended to be overloaded to handle that. For
+     * example, an object could use this method to re-open input files
+     * to get a separate file description with a private file offset.
+     *
+     * This method is only called in the child of the fork. The call
+     * takes place in a drained system.
+     */
+    virtual void notifyFork() {};
+
   private:
     /** DrainManager interface to request a drain operation */
     DrainState dmDrain();