Skip to content

Commit f449fdf

Browse files
committed
fix blocking arg for Lock objects
- fix allocate_lock builtin - add cast nodes to lock.acquire builtin args
1 parent 4e32099 commit f449fdf

File tree

5 files changed

+68
-29
lines changed

5 files changed

+68
-29
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/AbstractPythonLock.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public abstract class AbstractPythonLock extends PythonBuiltinObject {
4949
super(cls);
5050
}
5151

52-
private long getTimeoutInMillis(double timeout) {
52+
private static long getTimeoutInMillis(double timeout) {
5353
// TODO: look at
5454
// https://github.com/python/cpython/blob/e42b705188271da108de42b55d9344642170aa2b/Python/pytime.c
5555
// _PyTime_AsMicroseconds
@@ -65,15 +65,15 @@ private long getTimeoutInMillis(double timeout) {
6565
abstract boolean acquireTimeout(long timeout) throws InterruptedException;
6666

6767
boolean acquire() {
68-
try {
69-
return blockUntilAcquire();
70-
} catch (InterruptedException e) {
71-
return false;
72-
}
68+
return acquire(false, -1.0);
69+
}
70+
71+
boolean acquire(boolean blocking) {
72+
return acquire(blocking, -1.0);
7373
}
7474

75-
boolean acquire(int waitFlag, double timeout) {
76-
if (waitFlag == 0) {
75+
boolean acquire(boolean blocking, double timeout) {
76+
if (!blocking) {
7777
return tryToAcquire();
7878
} else {
7979
try {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/LockBuiltins.java

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ENTER__;
4444
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EXIT__;
4545
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
46+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
4647

4748
import java.util.List;
4849

@@ -52,10 +53,12 @@
5253
import com.oracle.graal.python.builtins.PythonBuiltins;
5354
import com.oracle.graal.python.builtins.objects.PNone;
5455
import com.oracle.graal.python.builtins.objects.thread.LockBuiltinsFactory.AcquireLockNodeFactory;
56+
import com.oracle.graal.python.nodes.expression.CastToBooleanNode;
5557
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5658
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5759
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
5860
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
61+
import com.oracle.graal.python.nodes.util.CastToDoubleNode;
5962
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6063
import com.oracle.truffle.api.dsl.Cached;
6164
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -69,31 +72,47 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
6972
return LockBuiltinsFactory.getFactories();
7073
}
7174

72-
@Builtin(name = "acquire", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 3, keywordArguments = {"waitflag", "timeout"})
75+
@Builtin(name = "acquire", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 3, keywordArguments = {"blocking", "timeout"})
7376
@GenerateNodeFactory
7477
abstract static class AcquireLockNode extends PythonTernaryBuiltinNode {
7578
@Specialization
7679
@TruffleBoundary
77-
boolean doAcquire(PLock self, int waitFlag, double timeout) {
78-
return self.acquire(waitFlag, timeout);
80+
boolean doAcquire(PLock self, @SuppressWarnings("unused") PNone waitFlag, @SuppressWarnings("unused") PNone timeout) {
81+
return self.acquire(true);
7982
}
8083

8184
@Specialization
8285
@TruffleBoundary
83-
boolean doAcquire(PLock self, @SuppressWarnings("unused") PNone waitFlag, double timeout) {
84-
return self.acquire(1, timeout);
86+
boolean doAcquire(PLock self, Object blocking, @SuppressWarnings("unused") PNone timeout,
87+
@Cached("createIfTrueNode()") CastToBooleanNode castToBooleanNode) {
88+
return self.acquire(castToBooleanNode.executeWith(blocking));
8589
}
8690

8791
@Specialization
8892
@TruffleBoundary
89-
boolean doAcquire(PLock self, int waitFlag, @SuppressWarnings("unused") PNone timeout) {
90-
return self.acquire(waitFlag, -1.0);
93+
boolean doAcquire(PLock self, @SuppressWarnings("unused") PNone waitFlag, Object timeout,
94+
@Cached("create()") CastToDoubleNode castToDoubleNode) {
95+
double timeoutSeconds = castToDoubleNode.execute(timeout);
96+
if (timeoutSeconds < 0) {
97+
throw raise(ValueError, "timeout value must be positive");
98+
}
99+
return self.acquire(true, timeoutSeconds);
91100
}
92101

93102
@Specialization
94103
@TruffleBoundary
95-
boolean doAcquire(PLock self, @SuppressWarnings("unused") PNone waitFlag, @SuppressWarnings("unused") PNone timeout) {
96-
return self.acquire(1, -1.0);
104+
boolean doAcquire(PLock self, Object blocking, Object timeout,
105+
@Cached("create()") CastToDoubleNode castToDoubleNode,
106+
@Cached("createIfTrueNode()") CastToBooleanNode castToBooleanNode) {
107+
boolean isBlocking = castToBooleanNode.executeWith(blocking);
108+
if (!isBlocking) {
109+
throw raise(ValueError, "can't specify a timeout for a non-blocking call");
110+
}
111+
double timeoutSeconds = castToDoubleNode.execute(timeout);
112+
if (timeoutSeconds < 0) {
113+
throw raise(ValueError, "timeout value must be positive");
114+
}
115+
return self.acquire(true, timeoutSeconds);
97116
}
98117

99118
public static AcquireLockNode create() {
@@ -160,7 +179,7 @@ abstract static class ReprLockNode extends PythonUnaryBuiltinNode {
160179
String repr(PLock self) {
161180
return String.format("<%s %s object at %s>",
162181
(self.locked()) ? "locked" : "unlocked",
163-
self.getPythonClass(),
182+
self.getPythonClass().getName(),
164183
self.hashCode());
165184
}
166185
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/RLockBuiltins.java

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ENTER__;
4444
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EXIT__;
4545
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
46+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
4647

4748
import java.util.List;
4849

@@ -53,10 +54,12 @@
5354
import com.oracle.graal.python.builtins.objects.PNone;
5455
import com.oracle.graal.python.builtins.objects.thread.RLockBuiltinsFactory.AcquireRLockNodeFactory;
5556
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
57+
import com.oracle.graal.python.nodes.expression.CastToBooleanNode;
5658
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5759
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5860
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
5961
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
62+
import com.oracle.graal.python.nodes.util.CastToDoubleNode;
6063
import com.oracle.graal.python.runtime.exception.PythonErrorType;
6164
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6265
import com.oracle.truffle.api.dsl.Cached;
@@ -72,31 +75,47 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
7275
return RLockBuiltinsFactory.getFactories();
7376
}
7477

75-
@Builtin(name = "acquire", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 3, keywordArguments = {"waitflag", "timeout"})
78+
@Builtin(name = "acquire", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 3, keywordArguments = {"blocking", "timeout"})
7679
@GenerateNodeFactory
7780
abstract static class AcquireRLockNode extends PythonTernaryBuiltinNode {
7881
@Specialization
7982
@TruffleBoundary
80-
boolean doAcquire(PRLock self, int waitFlag, double timeout) {
81-
return self.acquire(waitFlag, timeout);
83+
boolean doAcquire(PRLock self, @SuppressWarnings("unused") PNone waitFlag, @SuppressWarnings("unused") PNone timeout) {
84+
return self.acquire(true);
8285
}
8386

8487
@Specialization
8588
@TruffleBoundary
86-
boolean doAcquire(PRLock self, @SuppressWarnings("unused") PNone waitFlag, double timeout) {
87-
return self.acquire(1, timeout);
89+
boolean doAcquire(PRLock self, Object blocking, @SuppressWarnings("unused") PNone timeout,
90+
@Cached("createIfTrueNode()") CastToBooleanNode castToBooleanNode) {
91+
return self.acquire(castToBooleanNode.executeWith(blocking));
8892
}
8993

9094
@Specialization
9195
@TruffleBoundary
92-
boolean doAcquire(PRLock self, int waitFlag, @SuppressWarnings("unused") PNone timeout) {
93-
return self.acquire(waitFlag, -1.0);
96+
boolean doAcquire(PRLock self, @SuppressWarnings("unused") PNone waitFlag, Object timeout,
97+
@Cached("create()") CastToDoubleNode castToDoubleNode) {
98+
double timeoutSeconds = castToDoubleNode.execute(timeout);
99+
if (timeoutSeconds < 0) {
100+
throw raise(ValueError, "timeout value must be positive");
101+
}
102+
return self.acquire(true, timeoutSeconds);
94103
}
95104

96105
@Specialization
97106
@TruffleBoundary
98-
boolean doAcquire(PRLock self, @SuppressWarnings("unused") PNone waitFlag, @SuppressWarnings("unused") PNone timeout) {
99-
return self.acquire(1, -1.0);
107+
boolean doAcquire(PRLock self, Object blocking, Object timeout,
108+
@Cached("create()") CastToDoubleNode castToDoubleNode,
109+
@Cached("createIfTrueNode()") CastToBooleanNode castToBooleanNode) {
110+
boolean isBlocking = castToBooleanNode.executeWith(blocking);
111+
if (!isBlocking) {
112+
throw raise(ValueError, "can't specify a timeout for a non-blocking call");
113+
}
114+
double timeoutSeconds = castToDoubleNode.execute(timeout);
115+
if (timeoutSeconds < 0) {
116+
throw raise(ValueError, "timeout value must be positive");
117+
}
118+
return self.acquire(true, timeoutSeconds);
100119
}
101120

102121
public static AcquireRLockNode create() {
@@ -181,7 +200,7 @@ abstract static class ReprRLockNode extends PythonUnaryBuiltinNode {
181200
String repr(PRLock self) {
182201
return String.format("<%s %s object owner=%d count=%d at %s>",
183202
(self.locked()) ? "locked" : "unlocked",
184-
self.getPythonClass(),
203+
self.getPythonClass().getName(),
185204
self.getOwnerId(),
186205
self.getCount(),
187206
self.hashCode());

graalpython/lib-graalpython/_thread.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
TIMEOUT_MAX = 2**31
4242

4343

44+
@__builtin__
4445
def allocate_lock():
4546
return LockType()
4647

graalpython/lib-python/3/unittest/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,4 @@ def load_tests(loader, tests, pattern):
8080

8181

8282
def skipIfGraalPython(reason="Functionality not yet supported"):
83-
return skipIf(sys.implementation.name == 'graalpython', reason)
83+
return skipIf(sys.implementation.name == 'graalpython', reason)

0 commit comments

Comments
 (0)