diff options
Diffstat (limited to 'src/python/m5')
-rw-r--r-- | src/python/m5/simulate.py | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/python/m5/simulate.py b/src/python/m5/simulate.py index d89629d2d..5d70f4b18 100644 --- a/src/python/m5/simulate.py +++ b/src/python/m5/simulate.py @@ -312,4 +312,57 @@ def notifyFork(root): 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 |