src/cm/utils/thread.py
author Production Moz <dev@sopinspace.com>
Wed, 26 Jun 2013 23:43:08 +0200
changeset 515 0be906e586e6
parent 0 40c8f766c9b8
permissions -rw-r--r--
Fix south migration problem caused by 0003_update_keys_to_textversion using TextVersion model which is updated only in 0010_auto__add_field_textversion_category_1__add_field_textversion_category, same with 0007_populate_id_key_in_comments using Comment model updated in 0011_auto__add_field_comment_category.

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())