Skip to content

Commit b98b9c7

Browse files
committed
PosixResources: add Channel ref counting and thread safety
1 parent 84764f2 commit b98b9c7

File tree

5 files changed

+165
-111
lines changed

5 files changed

+165
-111
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ public NodeFactory getNodeFactory() {
153153
@Override
154154
protected void finalizeContext(PythonContext context) {
155155
context.runShutdownHooks();
156-
context.getResources().release();
157156
super.finalizeContext(context);
158157
}
159158

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

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import java.nio.channels.ReadableByteChannel;
6565
import java.nio.channels.SeekableByteChannel;
6666
import java.nio.channels.WritableByteChannel;
67-
import java.nio.charset.StandardCharsets;
6867
import java.nio.file.AccessDeniedException;
6968
import java.nio.file.FileAlreadyExistsException;
7069
import java.nio.file.FileSystemException;
@@ -99,7 +98,6 @@
9998
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory.StatNodeFactory;
10099
import com.oracle.graal.python.builtins.objects.PNone;
101100
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
102-
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes.ToBytesNode;
103101
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
104102
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
105103
import com.oracle.graal.python.builtins.objects.bytes.PIBytesLike;
@@ -527,8 +525,6 @@ Object setInheritable(int fd, @SuppressWarnings("unused") Object inheritable) {
527525
@ImportStatic(SpecialMethodNames.class)
528526
@TypeSystemReference(PythonArithmeticTypes.class)
529527
public abstract static class StatNode extends PythonBinaryBuiltinNode {
530-
@Child private ToBytesNode toBytesNode;
531-
532528
private final BranchProfile fileNotFound = BranchProfile.create();
533529

534530
private static final int S_IFIFO = 0010000;
@@ -786,19 +782,6 @@ private static int posixPermissionsToMode(int inputMode, final Set<PosixFilePerm
786782
return mode;
787783
}
788784

789-
private String toJavaString(VirtualFrame frame, PIBytesLike bytesLike) {
790-
if (toBytesNode == null) {
791-
CompilerDirectives.transferToInterpreterAndInvalidate();
792-
toBytesNode = insert(ToBytesNode.create());
793-
}
794-
return newString(toBytesNode.execute(frame, bytesLike));
795-
}
796-
797-
@TruffleBoundary
798-
private static String newString(byte[] bytes) {
799-
return new String(bytes, StandardCharsets.UTF_8);
800-
}
801-
802785
public static StatNode create() {
803786
return StatNodeFactory.create();
804787
}
@@ -910,12 +893,20 @@ int dupOvf(PInt fd) {
910893
abstract static class Dup2Node extends PythonFileNode {
911894
@Specialization
912895
int dup(int fd, int fd2) {
913-
return getResources().dup2(fd, fd2);
896+
try {
897+
return getResources().dup2(fd, fd2);
898+
} catch (IOException e) {
899+
throw raise(OSError, "invalid fd %r", fd2);
900+
}
914901
}
915902

916903
@Specialization(rewriteOn = ArithmeticException.class)
917904
int dupPInt(PInt fd, PInt fd2) {
918-
return getResources().dup2(fd.intValueExact(), fd2.intValueExact());
905+
try {
906+
return getResources().dup2(fd.intValueExact(), fd2.intValueExact());
907+
} catch (IOException e) {
908+
throw raise(OSError, "invalid fd %r", fd2);
909+
}
919910
}
920911

921912
@Specialization(replaces = "dupPInt")
@@ -1072,7 +1063,6 @@ private static Object setPosition(long pos, int how, SeekableByteChannel fc) thr
10721063
@Builtin(name = "close", minNumOfPositionalArgs = 1)
10731064
@GenerateNodeFactory
10741065
public abstract static class CloseNode extends PythonFileNode {
1075-
private final BranchProfile gotException = BranchProfile.create();
10761066
private final ConditionProfile noFile = ConditionProfile.createBinaryProfile();
10771067

10781068
@Specialization
@@ -1993,9 +1983,7 @@ PNone killFallback(VirtualFrame frame, Object pid, Object signal,
19931983
abstract static class FSyncNode extends PythonUnaryBuiltinNode {
19941984
@Specialization
19951985
PNone fsync(VirtualFrame frame, int fd) {
1996-
try {
1997-
getContext().getResources().fsync(fd);
1998-
} catch (ArrayIndexOutOfBoundsException e) {
1986+
if (!getContext().getResources().fsync(fd)) {
19991987
throw raiseOSError(frame, OSErrorEnum.ENOENT.getNumber());
20001988
}
20011989
return PNone.NONE;

0 commit comments

Comments
 (0)