diff -r 000000000000 -r 40c8f766c9b8 src/cm/utils/thread.py --- /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())