Sha256: 1fcbeb1125119558a9c1b23c8b5c29f91c73529db7b3d5922bfddd848ac115d6

Contents?: true

Size: 1.65 KB

Versions: 30

Compression:

Stored size: 1.65 KB

Contents

"""This test checks for correct fork() behavior.

We want fork1() semantics -- only the forking thread survives in the
child after a fork().

On some systems (e.g. Solaris without posix threads) we find that all
active threads survive in the child after a fork(); this is an error.

While BeOS doesn't officially support fork and native threading in
the same application, the present example should work just fine.  DC
"""

import os, sys, time, thread
from test_support import verify, verbose, TestSkipped

try:
    os.fork
except AttributeError:
    raise TestSkipped, "os.fork not defined -- skipping test_fork1"

LONGSLEEP = 2

SHORTSLEEP = 0.5

NUM_THREADS = 4

alive = {}

stop = 0

def f(id):
    while not stop:
        alive[id] = os.getpid()
        try:
            time.sleep(SHORTSLEEP)
        except IOError:
            pass

def main():
    for i in range(NUM_THREADS):
        thread.start_new(f, (i,))

    time.sleep(LONGSLEEP)

    a = alive.keys()
    a.sort()
    verify(a == range(NUM_THREADS))

    prefork_lives = alive.copy()

    if sys.platform in ['unixware7']:
        cpid = os.fork1()
    else:
        cpid = os.fork()

    if cpid == 0:
        # Child
        time.sleep(LONGSLEEP)
        n = 0
        for key in alive.keys():
            if alive[key] != prefork_lives[key]:
                n = n+1
        os._exit(n)
    else:
        # Parent
        spid, status = os.waitpid(cpid, 0)
        verify(spid == cpid)
        verify(status == 0,
                "cause = %d, exit = %d" % (status&0xff, status>>8) )
        global stop
        # Tell threads to die
        stop = 1
        time.sleep(2*SHORTSLEEP) # Wait for threads to die

main()

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
rubyfox-server-2.19.2.0 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.17.3.2 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.17.3.1 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.17.3.0 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.16.3.2 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.16.3.1 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.16.0.4 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.16.0.3 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.16.0.2 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.16.0.1 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.16.0.0 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.13.7.3 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.13.6.2 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.13.6.1 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.13.5.1 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.13.4.1 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.13.3.1 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.12.5.1 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.12.5.0 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py
rubyfox-server-2.12.4.0 lib/rubyfox/server/data/lib/Lib/test/test_fork1.py