Skip to content

Commit ff625ff

Browse files
committed
Fix msvcrt.locking
Related #544
1 parent 0cffc0d commit ff625ff

File tree

2 files changed

+54
-13
lines changed

2 files changed

+54
-13
lines changed

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

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,34 @@
4242

4343
import java.util.List;
4444

45+
import com.oracle.graal.python.annotations.ArgumentClinic;
4546
import com.oracle.graal.python.annotations.Builtin;
47+
import com.oracle.graal.python.annotations.PythonOS;
4648
import com.oracle.graal.python.builtins.CoreFunctions;
4749
import com.oracle.graal.python.builtins.Python3Core;
4850
import com.oracle.graal.python.builtins.PythonBuiltins;
49-
import com.oracle.graal.python.annotations.PythonOS;
5051
import com.oracle.graal.python.builtins.objects.PNone;
52+
import com.oracle.graal.python.nodes.PConstructAndRaiseNode;
5153
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
52-
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
54+
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
55+
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
56+
import com.oracle.graal.python.runtime.PosixSupportLibrary;
57+
import com.oracle.truffle.api.dsl.Bind;
58+
import com.oracle.truffle.api.dsl.Cached;
5359
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
5460
import com.oracle.truffle.api.dsl.NodeFactory;
5561
import com.oracle.truffle.api.dsl.Specialization;
5662
import com.oracle.truffle.api.frame.VirtualFrame;
63+
import com.oracle.truffle.api.library.CachedLibrary;
64+
import com.oracle.truffle.api.nodes.Node;
5765

5866
@CoreFunctions(defineModule = "msvcrt", os = PythonOS.PLATFORM_WIN32)
5967
public final class MsvcrtModuleBuiltins extends PythonBuiltins {
68+
69+
public static final int LK_LOCK = 1;
70+
public static final int LK_NBLCK = 2;
71+
public static final int LK_UNLOCK = 3;
72+
6073
@Override
6174
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
6275
return MsvcrtModuleBuiltinsFactory.getFactories();
@@ -65,18 +78,35 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
6578
@Override
6679
public void initialize(Python3Core core) {
6780
super.initialize(core);
68-
addBuiltinConstant("LK_NBLCK", 0);
69-
addBuiltinConstant("LK_UNLCK", 0);
81+
addBuiltinConstant("LK_LOCK", LK_LOCK);
82+
addBuiltinConstant("LK_NBLCK", LK_NBLCK);
83+
addBuiltinConstant("LK_UNLCK", LK_UNLOCK);
7084
}
7185

72-
@Builtin(name = "locking", minNumOfPositionalArgs = 3)
86+
@Builtin(name = "locking", minNumOfPositionalArgs = 3, parameterNames = {"fd", "mode", "nbytes"})
87+
@ArgumentClinic(name = "fd", conversion = ArgumentClinic.ClinicConversion.Int)
88+
@ArgumentClinic(name = "mode", conversion = ArgumentClinic.ClinicConversion.Int)
89+
@ArgumentClinic(name = "nbytes", conversion = ArgumentClinic.ClinicConversion.Long)
7390
@GenerateNodeFactory
74-
public abstract static class EnumKeyNode extends PythonTernaryBuiltinNode {
75-
@SuppressWarnings("unused")
91+
public abstract static class LockingNode extends PythonTernaryClinicBuiltinNode {
7692
@Specialization
77-
static Object locking(VirtualFrame frame, Object file, Object operation, Object arg) {
78-
// TODO: implement on windows, this is just here to make mesonbuild work
93+
Object locking(VirtualFrame frame, int fd, int mode, long nbytes,
94+
@Bind Node inliningTarget,
95+
@Cached SysModuleBuiltins.AuditNode auditNode,
96+
@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib,
97+
@Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) {
98+
auditNode.audit(inliningTarget, "msvcrt.locking", fd, mode, nbytes);
99+
try {
100+
posixLib.fcntlLock(getPosixSupport(), fd, mode == LK_NBLCK, mode == LK_LOCK ? 1 : 0, 0, 0, nbytes);
101+
} catch (PosixSupportLibrary.PosixException e) {
102+
throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
103+
}
79104
return PNone.NONE;
80105
}
106+
107+
@Override
108+
protected ArgumentClinicProvider getArgumentClinic() {
109+
return MsvcrtModuleBuiltinsClinicProviders.LockingNodeClinicProviderGen.INSTANCE;
110+
}
81111
}
82112
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@
4040
*/
4141
package com.oracle.graal.python.runtime;
4242

43+
import static com.oracle.graal.python.PythonLanguage.getPythonOS;
4344
import static com.oracle.graal.python.annotations.PythonOS.PLATFORM_LINUX;
4445
import static com.oracle.graal.python.annotations.PythonOS.PLATFORM_WIN32;
45-
import static com.oracle.graal.python.PythonLanguage.getPythonOS;
4646
import static com.oracle.graal.python.builtins.modules.SignalModuleBuiltins.signalFromName;
4747
import static com.oracle.graal.python.builtins.objects.thread.PThread.getThreadId;
4848
import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING;
@@ -873,9 +873,20 @@ void fcntlLock(int fd, boolean blocking, int lockType, int whence, long start, l
873873
errorBranch.enter(inliningTarget);
874874
throw posixException(OSErrorEnum.EBADFD);
875875
}
876-
boolean unlock = lockType == F_UNLCK.getValueIfDefined();
877-
boolean shared = lockType == F_RDLCK.getValueIfDefined();
878-
boolean exclusive = lockType == F_WRLCK.getValueIfDefined();
876+
boolean unlock, shared, exclusive;
877+
if (PythonLanguage.getPythonOS() == PLATFORM_WIN32) {
878+
/*
879+
* Windows doesn't expose fnctl, but we call this from MsvcrtModuleBuiltins, where we
880+
* use 0 for unlock and 1 for lock
881+
*/
882+
unlock = lockType == 0;
883+
exclusive = !unlock;
884+
shared = false;
885+
} else {
886+
unlock = lockType == F_UNLCK.getValueIfDefined();
887+
shared = lockType == F_RDLCK.getValueIfDefined();
888+
exclusive = lockType == F_WRLCK.getValueIfDefined();
889+
}
879890
if (!unlock && !shared && !exclusive) {
880891
errorBranch.enter(inliningTarget);
881892
throw posixException(OSErrorEnum.EINVAL);

0 commit comments

Comments
 (0)