for obj in root.descendants():
obj.notifyFork()
+fork_count = 0
+def fork(simout="%(parent)s.f%(fork_seq)i"):
+ """Fork the simulator.
+
+ This function forks the simulator. After forking the simulator,
+ the child process gets its output files redirected to a new output
+ directory. The default name of the output directory is the same as
+ the parent with the suffix ".fN" added where N is the fork
+ sequence number. The name of the output directory can be
+ overridden using the simout keyword argument.
+
+ Output file formatting dictionary:
+ parent -- Path to the parent process's output directory.
+ fork_seq -- Fork sequence number.
+ pid -- PID of the child process.
+
+ Keyword Arguments:
+ simout -- New simulation output directory.
+
+ Return Value:
+ pid of the child process or 0 if running in the child.
+ """
+ from m5 import options
+ global fork_count
+
+ if not internal.core.listenersDisabled():
+ raise RuntimeError, "Can not fork a simulator with listeners enabled"
+
+ drain()
+
+ try:
+ pid = os.fork()
+ except OSError, e:
+ raise e
+
+ if pid == 0:
+ # In child, notify objects of the fork
+ root = objects.Root.getInstance()
+ notifyFork(root)
+ # Setup a new output directory
+ parent = options.outdir
+ options.outdir = simout % {
+ "parent" : parent,
+ "fork_seq" : fork_count,
+ "pid" : os.getpid(),
+ }
+ core.setOutputDir(options.outdir)
+ else:
+ fork_count += 1
+
+ return pid
+
from internal.core import disableAllListeners
+from internal.core import listenersDisabled
inline void disableAllListeners() { ListenSocket::disableAll(); }
+inline bool listenersDisabled() { return ListenSocket::allDisabled(); }
+
inline void
seedRandom(uint64_t seed)
{
void setOutputDir(const std::string &dir);
void doExitCleanup();
void disableAllListeners();
+bool listenersDisabled();
void seedRandom(uint64_t seed);
%immutable compileDate;