aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMagnus Carlsson <magnus@galois.com>2007-03-29 14:27:46 -0700
committerMagnus Carlsson <magnus@galois.com>2007-03-29 14:27:46 -0700
commitf25b2f271cfa4319989cfa0ff0fd226824e1f3e5 (patch)
tree31c9eb0269e65f91b1234ea1f3f2a5f14c276234
parent76b2ca09df529940e080d8969a8a8d99b8300cd0 (diff)
downloadxen-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.py94
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.