src/cm/utils/thread.py
author gibus
Wed, 11 Sep 2013 23:13:01 +0200
changeset 532 0bad3613f59d
parent 0 40c8f766c9b8
permissions -rw-r--r--
Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.
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())