|
44 | 44 | import org.truffleruby.builtins.Primitive;
|
45 | 45 | import org.truffleruby.builtins.PrimitiveArrayArgumentsNode;
|
46 | 46 | import org.truffleruby.builtins.YieldingCoreMethodNode;
|
| 47 | +import org.truffleruby.cext.CExtNodesFactory.CallCWithMutexNodeFactory; |
47 | 48 | import org.truffleruby.cext.CExtNodesFactory.StringToNativeNodeGen;
|
| 49 | +import org.truffleruby.cext.CExtNodesFactory.CallCWithMutexNodeFactory.CallCWithMutexNodeGen; |
48 | 50 | import org.truffleruby.core.CoreLibrary;
|
49 | 51 | import org.truffleruby.core.MarkingServiceNodes;
|
50 | 52 | import org.truffleruby.core.MarkingService.ExtensionCallStack;
|
@@ -117,6 +119,8 @@ public class CExtNodes {
|
117 | 119 | @Primitive(name = "call_with_c_mutex")
|
118 | 120 | public abstract static class CallCWithMutexNode extends PrimitiveArrayArgumentsNode {
|
119 | 121 |
|
| 122 | + public abstract Object execute(TruffleObject receiverm, DynamicObject argsArray); |
| 123 | + |
120 | 124 | @Specialization
|
121 | 125 | public Object callCWithMutex(TruffleObject receiver, DynamicObject argsArray,
|
122 | 126 | @Cached("create()") ArrayToObjectArrayNode arrayToObjectArrayNode,
|
@@ -160,49 +164,20 @@ private Object execute(TruffleObject receiver, Object[] args, Node executeNode,
|
160 | 164 | @Primitive(name = "call_with_c_mutex_and_frame")
|
161 | 165 | public abstract static class CallCWithMuteAndFramexNode extends PrimitiveArrayArgumentsNode {
|
162 | 166 |
|
| 167 | + @Child protected CallCWithMutexNode callCextNode = CallCWithMutexNodeFactory.create(EMPTY_ARRAY); |
| 168 | + |
163 | 169 | @Specialization
|
164 | 170 | public Object callCWithMutex(VirtualFrame frame, TruffleObject receiver, DynamicObject argsArray, DynamicObject block,
|
165 |
| - @Cached("create()") ArrayToObjectArrayNode arrayToObjectArrayNode, |
166 |
| - @Cached("EXECUTE.createNode()") Node executeNode, |
167 |
| - @Cached("create()") BranchProfile exceptionProfile, |
168 |
| - @Cached("createBinaryProfile()") ConditionProfile ownedProfile, |
169 | 171 | @Cached("create()") MarkingServiceNodes.GetMarkerThreadLocalDataNode getDataNode) {
|
170 |
| - final Object[] args = arrayToObjectArrayNode.executeToObjectArray(argsArray); |
171 | 172 | ExtensionCallStack extensionStack = getDataNode.execute(frame).getExtensionCallStack();
|
172 | 173 | extensionStack.push(block);
|
173 | 174 |
|
174 | 175 | try {
|
175 |
| - if (getContext().getOptions().CEXT_LOCK) { |
176 |
| - final ReentrantLock lock = getContext().getCExtensionsLock(); |
177 |
| - boolean owned = lock.isHeldByCurrentThread(); |
178 |
| - |
179 |
| - if (ownedProfile.profile(!owned)) { |
180 |
| - MutexOperations.lockInternal(getContext(), lock, this); |
181 |
| - try { |
182 |
| - return execute(receiver, args, executeNode, exceptionProfile); |
183 |
| - } finally { |
184 |
| - MutexOperations.unlockInternal(lock); |
185 |
| - } |
186 |
| - } else { |
187 |
| - return execute(receiver, args, executeNode, exceptionProfile); |
188 |
| - } |
189 |
| - } else { |
190 |
| - return execute(receiver, args, executeNode, exceptionProfile); |
191 |
| - } |
| 176 | + return callCextNode.execute(receiver, argsArray); |
192 | 177 | } finally {
|
193 | 178 | extensionStack.pop();
|
194 | 179 | }
|
195 | 180 | }
|
196 |
| - |
197 |
| - private Object execute(TruffleObject receiver, Object[] args, Node executeNode, BranchProfile exceptionProfile) { |
198 |
| - try { |
199 |
| - return ForeignAccess.sendExecute(executeNode, receiver, args); |
200 |
| - } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) { |
201 |
| - exceptionProfile.enter(); |
202 |
| - throw new JavaException(e); |
203 |
| - } |
204 |
| - } |
205 |
| - |
206 | 181 | }
|
207 | 182 |
|
208 | 183 | @ImportStatic(Message.class)
|
|
0 commit comments