Skip to content

Commit 9ef508e

Browse files
committed
further fixes for os.system
1 parent e3328c8 commit 9ef508e

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,23 +1045,29 @@ abstract static class SystemNode extends PythonBuiltinNode {
10451045
: new String[]{(System.getenv().getOrDefault("SHELL", "sh")), "-c"};
10461046

10471047
static class PipePump extends Thread {
1048+
private static final int MAX_READ = 8192;
10481049
private final InputStream in;
10491050
private final OutputStream out;
10501051
private final byte[] buffer;
10511052
private boolean finish;
1053+
private boolean flush;
10521054

10531055
public PipePump(InputStream in, OutputStream out) {
10541056
this.in = in;
10551057
this.out = out;
1056-
this.buffer = new byte[8192];
1058+
this.buffer = new byte[MAX_READ];
10571059
this.finish = false;
1060+
this.flush = false;
10581061
}
10591062

10601063
@Override
10611064
public void run() {
10621065
try {
1063-
while (!Thread.interrupted() && !finish) {
1064-
int read = in.read(buffer, 0, in.available());
1066+
while (!finish || (flush && in.available() > 0)) {
1067+
if (Thread.interrupted()) {
1068+
finish = true;
1069+
}
1070+
int read = in.read(buffer, 0, Math.min(MAX_READ, in.available()));
10651071
if (read == -1) {
10661072
return;
10671073
}
@@ -1071,9 +1077,15 @@ public void run() {
10711077
}
10721078
}
10731079

1074-
public void finish() {
1075-
Thread.yield();
1080+
public void finish(boolean force_flush) {
10761081
finish = true;
1082+
flush = force_flush;
1083+
if (flush) {
1084+
// If we need to flush, make ourselves max priority to pump data out as quickly
1085+
// as possible
1086+
setPriority(Thread.MAX_PRIORITY);
1087+
}
1088+
Thread.yield();
10771089
}
10781090
}
10791091

@@ -1099,9 +1111,9 @@ int system(String cmd) {
10991111
stdout.start();
11001112
stderr.start();
11011113
int exitStatus = proc.waitFor();
1102-
stdin.finish();
1103-
stdout.finish();
1104-
stderr.finish();
1114+
stdin.finish(false);
1115+
stdout.finish(true);
1116+
stderr.finish(true);
11051117
return exitStatus;
11061118
} catch (IOException | InterruptedException e) {
11071119
return -1;

0 commit comments

Comments
 (0)