1 """This test case provides support for checking forking and wait behavior.
3 To test different wait behavior, overrise the wait_impl method.
5 We want fork1() semantics -- only the forking thread survives in the
8 On some systems (e.g. Solaris without posix threads) we find that all
9 active threads survive in the child after a fork(); this is an error.
11 While BeOS doesn't officially support fork and native threading in
12 the same application, the present example should work just fine. DC
15 import os
, sys
, time
, thread
, unittest
21 class ForkWait(unittest
.TestCase
):
29 self
.alive
[id] = os
.getpid()
31 time
.sleep(SHORTSLEEP
)
35 def wait_impl(self
, cpid
):
37 # waitpid() shouldn't hang, but some of the buildbots seem to hang
38 # in the forking tests. This is an attempt to fix the problem.
39 spid
, status
= os
.waitpid(cpid
, os
.WNOHANG
)
42 time
.sleep(2 * SHORTSLEEP
)
44 self
.assertEquals(spid
, cpid
)
45 self
.assertEquals(status
, 0, "cause = %d, exit = %d" % (status
&0xff, status
>>8))
48 for i
in range(NUM_THREADS
):
49 thread
.start_new(self
.f
, (i
,))
55 self
.assertEquals(a
, range(NUM_THREADS
))
57 prefork_lives
= self
.alive
.copy()
59 if sys
.platform
in ['unixware7']:
68 for key
in self
.alive
:
69 if self
.alive
[key
] != prefork_lives
[key
]:
77 time
.sleep(2*SHORTSLEEP
) # Wait for threads to die