Author: Armin Rigo <[email protected]>
Branch: release-2.1.x
Changeset: r66131:4b0d83fde581
Date: 2013-08-13 19:54 +0200
http://bitbucket.org/pypy/pypy/changeset/4b0d83fde581/
Log: Hack at forkpty() to give it 2-level hooks, like a regular fork().
No tests for the translation of forkpty()... (transplanted from
39bf27304f43aa6fcaed5bafc3a8a5b178b4cef0)
diff --git a/pypy/module/posix/interp_posix.py
b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -733,11 +733,16 @@
for hook in get_fork_hooks(where):
hook(space)
-def fork(space):
+def _run_forking_function(space, kind):
run_fork_hooks('before', space)
-
try:
- pid = os.fork()
+ if kind == "F":
+ pid = os.fork()
+ master_fd = -1
+ elif kind == "P":
+ pid, master_fd = os.forkpty()
+ else:
+ raise AssertionError
except OSError, e:
try:
run_fork_hooks('parent', space)
@@ -745,12 +750,14 @@
# Don't clobber the OSError if the fork failed
pass
raise wrap_oserror(space, e)
-
if pid == 0:
run_fork_hooks('child', space)
else:
run_fork_hooks('parent', space)
+ return pid, master_fd
+def fork(space):
+ pid, irrelevant = _run_forking_function(space, "F")
return space.wrap(pid)
def openpty(space):
@@ -762,10 +769,7 @@
return space.newtuple([space.wrap(master_fd), space.wrap(slave_fd)])
def forkpty(space):
- try:
- pid, master_fd = os.forkpty()
- except OSError, e:
- raise wrap_oserror(space, e)
+ pid, master_fd = _run_forking_function(space, "P")
return space.newtuple([space.wrap(pid),
space.wrap(master_fd)])
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -1599,6 +1599,7 @@
_nowrapper = True)
def fork_llimpl():
+ # NB. keep forkpty() up-to-date, too
opaqueaddr = rthread.gc_thread_before_fork()
childpid = rffi.cast(lltype.Signed, os_fork())
rthread.gc_thread_after_fork(childpid, opaqueaddr)
@@ -1634,6 +1635,7 @@
@registering_if(os, 'forkpty')
def register_os_forkpty(self):
+ from rpython.rlib import rthread
os_forkpty = self.llexternal(
'forkpty',
[rffi.INTP, rffi.VOIDP, rffi.VOIDP, rffi.VOIDP],
@@ -1641,7 +1643,10 @@
compilation_info=ExternalCompilationInfo(libraries=['util']))
def forkpty_llimpl():
master_p = lltype.malloc(rffi.INTP.TO, 1, flavor='raw')
- childpid = os_forkpty(master_p, None, None, None)
+ opaqueaddr = rthread.gc_thread_before_fork()
+ childpid = rffi.cast(lltype.Signed,
+ os_forkpty(master_p, None, None, None))
+ rthread.gc_thread_after_fork(childpid, opaqueaddr)
master_fd = master_p[0]
lltype.free(master_p, flavor='raw')
if childpid == -1:
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit