--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/utils/thread.py Mon Nov 23 15:14:29 2009 +0100
@@ -0,0 +1,48 @@
+def synchronized(lock):
+ """ Synchronization decorator. """
+
+ def wrap(f):
+ def newFunction(*args, **kw):
+ lock.acquire()
+ try:
+ return f(*args, **kw)
+ finally:
+ lock.release()
+ return newFunction
+ return wrap
+
+import sys, os
+
+def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
+
+ # Perform first fork.
+ try:
+ pid = os.fork()
+ if pid > 0:
+ sys.exit(0) # Exit first parent.
+ except OSError, e:
+ sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
+ sys.exit(1)
+
+ # Decouple from parent environment.
+ os.chdir("/")
+ os.umask(0)
+ os.setsid()
+
+ # Perform second fork.
+ try:
+ pid = os.fork()
+ if pid > 0:
+ sys.exit(0) # Exit second parent.
+ except OSError, e:
+ sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
+ sys.exit(1)
+
+ # The process is now daemonized, redirect standard file descriptors.
+ for f in sys.stdout, sys.stderr: f.flush()
+ si = file(stdin, 'r')
+ so = file(stdout, 'a+')
+ se = file(stderr, 'a+', 0)
+ os.dup2(si.fileno(), sys.stdin.fileno())
+ os.dup2(so.fileno(), sys.stdout.fileno())
+ os.dup2(se.fileno(), sys.stderr.fileno())