Skip to content

Commit f1da59d

Browse files
committed
threads: unify Lock and RLock builtins
1 parent ba3c2a8 commit f1da59d

File tree

2 files changed

+16
-129
lines changed

2 files changed

+16
-129
lines changed

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

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
import com.oracle.truffle.api.dsl.Specialization;
7373
import com.oracle.truffle.api.profiles.ConditionProfile;
7474

75-
@CoreFunctions(extendClasses = PythonBuiltinClassType.PLock)
75+
@CoreFunctions(extendClasses = {PythonBuiltinClassType.PLock, PythonBuiltinClassType.PRLock})
7676
public class LockBuiltins extends PythonBuiltins {
7777
@Override
7878
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
@@ -104,7 +104,7 @@ private CastToBooleanNode getCastToBooleanNode() {
104104
}
105105

106106
@Specialization
107-
boolean doAcquire(PLock self, Object blocking, Object timeout) {
107+
boolean doAcquire(AbstractPythonLock self, Object blocking, Object timeout) {
108108
// args setup
109109
boolean isBlocking = (blocking instanceof PNone) ? DEFAULT_BLOCKING : getCastToBooleanNode().executeWith(blocking);
110110
double timeoutSeconds = DEFAULT_TIMEOUT;
@@ -153,7 +153,7 @@ Object acquire(PLock self, Object blocking, Object timeout,
153153
@GenerateNodeFactory
154154
abstract static class EnterLockNode extends PythonTernaryBuiltinNode {
155155
@Specialization
156-
Object acquire(PLock self, Object blocking, Object timeout,
156+
Object acquire(AbstractPythonLock self, Object blocking, Object timeout,
157157
@Cached("create()") AcquireLockNode acquireLockNode) {
158158
return acquireLockNode.execute(self, blocking, timeout);
159159
}
@@ -164,7 +164,7 @@ Object acquire(PLock self, Object blocking, Object timeout,
164164
abstract static class ReleaseLockNode extends PythonUnaryBuiltinNode {
165165
@Specialization
166166
@TruffleBoundary
167-
Object doRelease(PLock self) {
167+
Object doRelease(AbstractPythonLock self) {
168168
self.release();
169169
return PNone.NONE;
170170
}
@@ -175,7 +175,7 @@ Object doRelease(PLock self) {
175175
abstract static class ExitLockNode extends PythonBuiltinNode {
176176
@Specialization
177177
@TruffleBoundary
178-
Object exit(PLock self, @SuppressWarnings("unused") Object type, @SuppressWarnings("unused") Object value, @SuppressWarnings("unused") Object traceback) {
178+
Object exit(AbstractPythonLock self, @SuppressWarnings("unused") Object type, @SuppressWarnings("unused") Object value, @SuppressWarnings("unused") Object traceback) {
179179
self.release();
180180
return PNone.NONE;
181181
}
@@ -201,5 +201,16 @@ String repr(PLock self) {
201201
self.getPythonClass().getName(),
202202
self.hashCode());
203203
}
204+
205+
@Specialization
206+
@TruffleBoundary
207+
String repr(PRLock self) {
208+
return String.format("<%s %s object owner=%d count=%d at %s>",
209+
(self.locked()) ? "locked" : "unlocked",
210+
self.getPythonClass().getName(),
211+
self.getOwnerId(),
212+
self.getCount(),
213+
self.hashCode());
214+
}
204215
}
205216
}

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

Lines changed: 0 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -40,34 +40,17 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.thread;
4242

43-
import static com.oracle.graal.python.builtins.objects.thread.AbstractPythonLock.DEFAULT_BLOCKING;
44-
import static com.oracle.graal.python.builtins.objects.thread.AbstractPythonLock.DEFAULT_TIMEOUT;
45-
import static com.oracle.graal.python.builtins.objects.thread.AbstractPythonLock.TIMEOUT_MAX;
46-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ENTER__;
47-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EXIT__;
48-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
49-
import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError;
50-
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
51-
5243
import java.util.List;
5344

5445
import com.oracle.graal.python.builtins.Builtin;
5546
import com.oracle.graal.python.builtins.CoreFunctions;
5647
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5748
import com.oracle.graal.python.builtins.PythonBuiltins;
5849
import com.oracle.graal.python.builtins.objects.PNone;
59-
import com.oracle.graal.python.builtins.objects.thread.RLockBuiltinsFactory.AcquireRLockNodeFactory;
6050
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
61-
import com.oracle.graal.python.nodes.expression.CastToBooleanNode;
6251
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
63-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
64-
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
6552
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
66-
import com.oracle.graal.python.nodes.util.CastToDoubleNode;
6753
import com.oracle.graal.python.runtime.exception.PythonErrorType;
68-
import com.oracle.truffle.api.CompilerDirectives;
69-
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
70-
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
7154
import com.oracle.truffle.api.dsl.Cached;
7255
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
7356
import com.oracle.truffle.api.dsl.NodeFactory;
@@ -81,98 +64,6 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
8164
return RLockBuiltinsFactory.getFactories();
8265
}
8366

84-
@Builtin(name = "acquire", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 3, keywordArguments = {"blocking", "timeout"})
85-
@GenerateNodeFactory
86-
abstract static class AcquireRLockNode extends PythonTernaryBuiltinNode {
87-
private @Child CastToDoubleNode castToDoubleNode;
88-
private @Child CastToBooleanNode castToBooleanNode;
89-
private @CompilationFinal ConditionProfile isBlockingProfile = ConditionProfile.createBinaryProfile();
90-
private @CompilationFinal ConditionProfile defaultTimeoutProfile = ConditionProfile.createBinaryProfile();
91-
92-
private CastToDoubleNode getCastToDoubleNode() {
93-
if (castToDoubleNode == null) {
94-
CompilerDirectives.transferToInterpreterAndInvalidate();
95-
castToDoubleNode = insert(CastToDoubleNode.create());
96-
}
97-
return castToDoubleNode;
98-
}
99-
100-
private CastToBooleanNode getCastToBooleanNode() {
101-
if (castToBooleanNode == null) {
102-
CompilerDirectives.transferToInterpreterAndInvalidate();
103-
castToBooleanNode = insert(CastToBooleanNode.createIfTrueNode());
104-
}
105-
return castToBooleanNode;
106-
}
107-
108-
@Specialization
109-
boolean doAcquire(PRLock self, Object blocking, Object timeout) {
110-
// args setup
111-
boolean isBlocking = (blocking instanceof PNone) ? DEFAULT_BLOCKING : getCastToBooleanNode().executeWith(blocking);
112-
double timeoutSeconds = DEFAULT_TIMEOUT;
113-
if (!(timeout instanceof PNone)) {
114-
if (!isBlocking) {
115-
throw raise(ValueError, "can't specify a timeout for a non-blocking call");
116-
}
117-
118-
timeoutSeconds = getCastToDoubleNode().execute(timeout);
119-
120-
if (timeoutSeconds < 0) {
121-
throw raise(ValueError, "timeout value must be positive");
122-
} else if (timeoutSeconds > TIMEOUT_MAX) {
123-
throw raise(OverflowError, "timeout value is too large");
124-
}
125-
}
126-
127-
// acquire lock
128-
if (isBlockingProfile.profile(!isBlocking)) {
129-
return self.acquireNonBlocking();
130-
} else {
131-
if (defaultTimeoutProfile.profile(timeoutSeconds == DEFAULT_TIMEOUT)) {
132-
return self.acquireBlocking();
133-
} else {
134-
return self.acquireTimeout(timeoutSeconds);
135-
}
136-
}
137-
}
138-
139-
public static AcquireRLockNode create() {
140-
return AcquireRLockNodeFactory.create();
141-
}
142-
}
143-
144-
@Builtin(name = __ENTER__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 3, keywordArguments = {"blocking", "timeout"})
145-
@GenerateNodeFactory
146-
abstract static class EnterRLockNode extends PythonTernaryBuiltinNode {
147-
@Specialization
148-
Object acquire(PRLock self, Object blocking, Object timeout,
149-
@Cached("create()") AcquireRLockNode acquireLockNode) {
150-
return acquireLockNode.execute(self, blocking, timeout);
151-
}
152-
}
153-
154-
@Builtin(name = "release", fixedNumOfPositionalArgs = 1)
155-
@GenerateNodeFactory
156-
abstract static class ReleaseRLockNode extends PythonUnaryBuiltinNode {
157-
@Specialization
158-
@TruffleBoundary
159-
Object doRelease(PRLock self) {
160-
self.release();
161-
return PNone.NONE;
162-
}
163-
}
164-
165-
@Builtin(name = __EXIT__, fixedNumOfPositionalArgs = 4)
166-
@GenerateNodeFactory
167-
abstract static class ExitRLockNode extends PythonBuiltinNode {
168-
@Specialization
169-
@TruffleBoundary
170-
Object exit(PRLock self, @SuppressWarnings("unused") Object type, @SuppressWarnings("unused") Object value, @SuppressWarnings("unused") Object traceback) {
171-
self.release();
172-
return PNone.NONE;
173-
}
174-
}
175-
17667
@Builtin(name = "_is_owned", fixedNumOfPositionalArgs = 1)
17768
@GenerateNodeFactory
17869
abstract static class IsOwnedRLockNode extends PythonUnaryBuiltinNode {
@@ -209,19 +100,4 @@ Object releaseSave(PRLock self,
209100
return retVal;
210101
}
211102
}
212-
213-
@Builtin(name = __REPR__, fixedNumOfPositionalArgs = 1)
214-
@GenerateNodeFactory
215-
abstract static class ReprRLockNode extends PythonUnaryBuiltinNode {
216-
@Specialization
217-
@TruffleBoundary
218-
String repr(PRLock self) {
219-
return String.format("<%s %s object owner=%d count=%d at %s>",
220-
(self.locked()) ? "locked" : "unlocked",
221-
self.getPythonClass().getName(),
222-
self.getOwnerId(),
223-
self.getCount(),
224-
self.hashCode());
225-
}
226-
}
227103
}

0 commit comments

Comments
 (0)