summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2001-11-02 23:59:11 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2001-11-02 23:59:11 (GMT)
commitdedbe255d32ace4b92fbe099aea454775701edf4 (patch)
tree867b6e6971d5ceafcd42fd74652433b6bfa9669d
parentb7b32601281f25ffed50f8187c78a3802fa14039 (diff)
downloadcpython-dedbe255d32ace4b92fbe099aea454775701edf4.zip
cpython-dedbe255d32ace4b92fbe099aea454775701edf4.tar.gz
cpython-dedbe255d32ace4b92fbe099aea454775701edf4.tar.bz2
Patch #474169: Move fdopen calls out of critical section.
-rw-r--r--Modules/posixmodule.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 65e09c0..20765e1 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -2274,13 +2274,15 @@ popen(const char *command, const char *mode, int pipesize, int *err)
if (dup2(whan, 1) == 0) { /* Connect STDOUT to Pipe Write Side */
DosClose(whan); /* Close Now-Unused Pipe Write Handle */
- if (async_system(command) == NO_ERROR)
- retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
+ rc = async_system(command);
}
dup2(oldfd, 1); /* Reconnect STDOUT to Original Handle */
DosExitCritSec(); /* Now Allow Other Threads to Run */
+ if (rc == NO_ERROR)
+ retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
+
close(oldfd); /* And Close Saved STDOUT Handle */
return retfd; /* Return fd of Pipe or NULL if Error */
@@ -2293,13 +2295,15 @@ popen(const char *command, const char *mode, int pipesize, int *err)
if (dup2(rhan, 0) == 0) { /* Connect STDIN to Pipe Read Side */
DosClose(rhan); /* Close Now-Unused Pipe Read Handle */
- if (async_system(command) == NO_ERROR)
- retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
+ rc = async_system(command);
}
dup2(oldfd, 0); /* Reconnect STDIN to Original Handle */
DosExitCritSec(); /* Now Allow Other Threads to Run */
+ if (rc == NO_ERROR)
+ retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
+
close(oldfd); /* And Close Saved STDIN Handle */
return retfd; /* Return fd of Pipe or NULL if Error */