Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
afdd5134
Kaydet (Commit)
afdd5134
authored
Kas 30, 2015
tarafından
Martin Panter
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Issue #25764: Preserve subprocess fork exception when preexec_fn used
Also fix handling of failure to release the import lock.
üst
c7217d7c
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
37 additions
and
17 deletions
+37
-17
test_subprocess.py
Lib/test/test_subprocess.py
+16
-0
NEWS
Misc/NEWS
+3
-0
_posixsubprocess.c
Modules/_posixsubprocess.c
+18
-17
No files found.
Lib/test/test_subprocess.py
Dosyayı görüntüle @
afdd5134
...
...
@@ -1416,6 +1416,22 @@ class POSIXProcessTestCase(BaseTestCase):
if
not
enabled
:
gc
.
disable
()
def
test_preexec_fork_failure
(
self
):
# The internal code did not preserve the previous exception when
# re-enabling garbage collection
try
:
from
resource
import
getrlimit
,
setrlimit
,
RLIMIT_NPROC
except
ImportError
as
err
:
self
.
skipTest
(
err
)
# RLIMIT_NPROC is specific to Linux and BSD
limits
=
getrlimit
(
RLIMIT_NPROC
)
[
_
,
hard
]
=
limits
setrlimit
(
RLIMIT_NPROC
,
(
0
,
hard
))
self
.
addCleanup
(
setrlimit
,
RLIMIT_NPROC
,
limits
)
# Forking should raise EAGAIN, translated to BlockingIOError
with
self
.
assertRaises
(
BlockingIOError
):
subprocess
.
call
([
sys
.
executable
,
'-c'
,
''
],
preexec_fn
=
lambda
:
None
)
def
test_args_string
(
self
):
# args is a string
fd
,
fname
=
tempfile
.
mkstemp
()
...
...
Misc/NEWS
Dosyayı görüntüle @
afdd5134
...
...
@@ -115,6 +115,9 @@ Core and Builtins
Library
-------
- Issue #25764: In the subprocess module, preserve any exception caused by
fork() failure when preexec_fn is used.
- Issue #6478: _strptime's regexp cache now is reset after changing timezone
with time.tzset().
...
...
Modules/_posixsubprocess.c
Dosyayı görüntüle @
afdd5134
...
...
@@ -47,17 +47,25 @@
#define POSIX_CALL(call) do { if ((call) == -1) goto error; } while (0)
/*
Given the gc module call gc.enable() and r
eturn 0 on success. */
/*
If gc was disabled, call gc.enable(). R
eturn 0 on success. */
static
int
_enable_gc
(
PyObject
*
gc_module
)
_enable_gc
(
int
need_to_reenable_gc
,
PyObject
*
gc_module
)
{
PyObject
*
result
;
_Py_IDENTIFIER
(
enable
);
PyObject
*
exctype
,
*
val
,
*
tb
;
result
=
_PyObject_CallMethodId
(
gc_module
,
&
PyId_enable
,
NULL
);
if
(
result
==
NULL
)
return
1
;
Py_DECREF
(
result
);
if
(
need_to_reenable_gc
)
{
PyErr_Fetch
(
&
exctype
,
&
val
,
&
tb
);
result
=
_PyObject_CallMethodId
(
gc_module
,
&
PyId_enable
,
NULL
);
if
(
exctype
!=
NULL
)
{
PyErr_Restore
(
exctype
,
val
,
tb
);
}
if
(
result
==
NULL
)
{
return
1
;
}
Py_DECREF
(
result
);
}
return
0
;
}
...
...
@@ -691,6 +699,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
_PyImport_ReleaseLock
()
<
0
&&
!
PyErr_Occurred
())
{
PyErr_SetString
(
PyExc_RuntimeError
,
"not holding the import lock"
);
pid
=
-
1
;
}
import_lock_held
=
0
;
...
...
@@ -702,9 +711,8 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
_Py_FreeCharPArray
(
exec_array
);
/* Reenable gc in the parent process (or if fork failed). */
if
(
need_to_reenable_gc
&&
_enable_gc
(
gc_module
))
{
Py_XDECREF
(
gc_module
);
return
NULL
;
if
(
_enable_gc
(
need_to_reenable_gc
,
gc_module
))
{
pid
=
-
1
;
}
Py_XDECREF
(
preexec_fn_args_tuple
);
Py_XDECREF
(
gc_module
);
...
...
@@ -726,14 +734,7 @@ cleanup:
Py_XDECREF
(
converted_args
);
Py_XDECREF
(
fast_args
);
Py_XDECREF
(
preexec_fn_args_tuple
);
/* Reenable gc if it was disabled. */
if
(
need_to_reenable_gc
)
{
PyObject
*
exctype
,
*
val
,
*
tb
;
PyErr_Fetch
(
&
exctype
,
&
val
,
&
tb
);
_enable_gc
(
gc_module
);
PyErr_Restore
(
exctype
,
val
,
tb
);
}
_enable_gc
(
need_to_reenable_gc
,
gc_module
);
Py_XDECREF
(
gc_module
);
return
NULL
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment