src/cm/utils/thread.py
changeset 0 40c8f766c9b8
equal deleted inserted replaced
-1:000000000000 0:40c8f766c9b8
       
     1 def synchronized(lock):
       
     2     """ Synchronization decorator. """
       
     3     
       
     4     def wrap(f):
       
     5         def newFunction(*args, **kw):
       
     6             lock.acquire()
       
     7             try:
       
     8                 return f(*args, **kw)
       
     9             finally:
       
    10                 lock.release()
       
    11         return newFunction
       
    12     return wrap
       
    13 
       
    14 import sys, os
       
    15 
       
    16 def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
       
    17 
       
    18     # Perform first fork.
       
    19     try:
       
    20         pid = os.fork()
       
    21         if pid > 0:
       
    22             sys.exit(0) # Exit first parent.
       
    23     except OSError, e:
       
    24         sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
       
    25         sys.exit(1)
       
    26 
       
    27     # Decouple from parent environment.
       
    28     os.chdir("/")
       
    29     os.umask(0)
       
    30     os.setsid()
       
    31 
       
    32     # Perform second fork.
       
    33     try:
       
    34         pid = os.fork()
       
    35         if pid > 0:
       
    36             sys.exit(0) # Exit second parent.
       
    37     except OSError, e:
       
    38         sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
       
    39         sys.exit(1)
       
    40 
       
    41     # The process is now daemonized, redirect standard file descriptors.
       
    42     for f in sys.stdout, sys.stderr: f.flush()
       
    43     si = file(stdin, 'r')
       
    44     so = file(stdout, 'a+')
       
    45     se = file(stderr, 'a+', 0)
       
    46     os.dup2(si.fileno(), sys.stdin.fileno())
       
    47     os.dup2(so.fileno(), sys.stdout.fileno())
       
    48     os.dup2(se.fileno(), sys.stderr.fileno())