src/cm/utils/thread.py
author Production Moz <dev@sopinspace.com>
Tue, 15 May 2012 14:15:34 +0200
changeset 435 96c16cc6408b
parent 0 40c8f766c9b8
permissions -rw-r--r--
Fixed comments filter by name when name is empty
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
def synchronized(lock):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
    """ Synchronization decorator. """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
    def wrap(f):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
        def newFunction(*args, **kw):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
            lock.acquire()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
            try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
                return f(*args, **kw)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
            finally:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
                lock.release()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
        return newFunction
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
    return wrap
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
import sys, os
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
    # Perform first fork.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
    try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
        pid = os.fork()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
        if pid > 0:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
            sys.exit(0) # Exit first parent.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
    except OSError, e:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
        sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
        sys.exit(1)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
    # Decouple from parent environment.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
    os.chdir("/")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
    os.umask(0)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
    os.setsid()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
    # Perform second fork.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
        pid = os.fork()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
        if pid > 0:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
            sys.exit(0) # Exit second parent.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
    except OSError, e:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
        sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
        sys.exit(1)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
    # The process is now daemonized, redirect standard file descriptors.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
    for f in sys.stdout, sys.stderr: f.flush()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
    si = file(stdin, 'r')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
    so = file(stdout, 'a+')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
    se = file(stderr, 'a+', 0)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
    os.dup2(si.fileno(), sys.stdin.fileno())
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    os.dup2(so.fileno(), sys.stdout.fileno())
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
    os.dup2(se.fileno(), sys.stderr.fileno())