diff options
author | Magnus Carlsson <magnus@galois.com> | 2007-03-29 14:27:46 -0700 |
---|---|---|
committer | Magnus Carlsson <magnus@galois.com> | 2007-03-29 14:27:46 -0700 |
commit | f25b2f271cfa4319989cfa0ff0fd226824e1f3e5 (patch) | |
tree | 31c9eb0269e65f91b1234ea1f3f2a5f14c276234 | |
parent | 76b2ca09df529940e080d8969a8a8d99b8300cd0 (diff) | |
download | xen-f25b2f271cfa4319989cfa0ff0fd226824e1f3e5.tar.gz xen-f25b2f271cfa4319989cfa0ff0fd226824e1f3e5.tar.bz2 xen-f25b2f271cfa4319989cfa0ff0fd226824e1f3e5.zip |
Made tracing thread safe, and also print thread name.
-rw-r--r-- | tools/python/xen/xend/server/SrvDaemon.py | 94 |
1 files changed, 50 insertions, 44 deletions
diff --git a/tools/python/xen/xend/server/SrvDaemon.py b/tools/python/xen/xend/server/SrvDaemon.py index adb83b679c..262de4e259 100644 --- a/tools/python/xen/xend/server/SrvDaemon.py +++ b/tools/python/xen/xend/server/SrvDaemon.py @@ -38,7 +38,8 @@ class Daemon: self.traceon = False self.tracefile = None self.traceindent = 0 - self.child = 0 + self.child = 0 + self.traceLock = threading.Lock() def cleanup_xend(self, kill): @@ -253,6 +254,7 @@ class Daemon: pass def print_trace(self, string): + self.tracefile.write("%s: "% threading.currentThread().getName()) for i in range(self.traceindent): ch = " " if (i % 5): @@ -263,50 +265,54 @@ class Daemon: self.tracefile.write(string) def trace(self, frame, event, arg): - if not self.traceon: - print >>self.tracefile - print >>self.tracefile, '-' * 20, 'TRACE OFF', '-' * 20 - self.tracefile.close() - self.tracefile = None - return None - if event == 'call': - code = frame.f_code - filename = code.co_filename - m = re.search('.*xend/(.*)', filename) - if not m: - return None - modulename = m.group(1) - if modulename.endswith('.pyc'): - modulename = modulename[:-1] - if modulename == 'sxp.py' or \ - modulename == 'XendLogging.py' or \ - modulename == 'XendMonitor.py' or \ - modulename == 'server/SrvServer.py': - return None - self.traceindent += 1 - self.print_trace("> %s:%s\n" - % (modulename, code.co_name)) - elif event == 'line': - filename = frame.f_code.co_filename - lineno = frame.f_lineno - self.print_trace("%4d %s" % - (lineno, linecache.getline(filename, lineno))) - elif event == 'return': - code = frame.f_code - filename = code.co_filename - m = re.search('.*xend/(.*)', filename) - if not m: + self.traceLock.acquire() + try: + if not self.traceon: + print >>self.tracefile + print >>self.tracefile, '-' * 20, 'TRACE OFF', '-' * 20 + self.tracefile.close() + self.tracefile = None return None - modulename = m.group(1) - self.print_trace("< %s:%s\n" - % (modulename, code.co_name)) - self.traceindent -= 1 - elif event == 'exception': - self.print_trace("! Exception:\n") - (ex, val, tb) = arg - traceback.print_exception(ex, val, tb, 10, self.tracefile) - #del tb - return self.trace + if event == 'call': + code = frame.f_code + filename = code.co_filename + m = re.search('.*xend/(.*)', filename) + if not m: + return None + modulename = m.group(1) + if modulename.endswith('.pyc'): + modulename = modulename[:-1] + if modulename == 'sxp.py' or \ + modulename == 'XendLogging.py' or \ + modulename == 'XendMonitor.py' or \ + modulename == 'server/SrvServer.py': + return None + self.traceindent += 1 + self.print_trace("> %s:%s\n" + % (modulename, code.co_name)) + elif event == 'line': + filename = frame.f_code.co_filename + lineno = frame.f_lineno + self.print_trace("%4d %s" % + (lineno, linecache.getline(filename, lineno))) + elif event == 'return': + code = frame.f_code + filename = code.co_filename + m = re.search('.*xend/(.*)', filename) + if not m: + return None + modulename = m.group(1) + self.print_trace("< %s:%s\n" + % (modulename, code.co_name)) + self.traceindent -= 1 + elif event == 'exception': + self.print_trace("! Exception:\n") + (ex, val, tb) = arg + traceback.print_exception(ex, val, tb, 10, self.tracefile) + #del tb + return self.trace + finally: + self.traceLock.release() def set_user(self): # Set the UID. |