|
11 | 11 | ** |
12 | 12 | ===========================================================*/ |
13 | 13 | #include "common.h" |
14 | | -#include "object.h" |
15 | | -#include "field.h" |
16 | | -#include "excep.h" |
17 | 14 | #include "comwaithandle.h" |
18 | 15 |
|
19 | | -FCIMPL3(INT32, WaitHandleNative::CorWaitOneNative, HANDLE handle, INT32 timeout, FC_BOOL_ARG useTrivialWaits) |
| 16 | +extern "C" INT32 QCALLTYPE WaitHandle_WaitOneCore(HANDLE handle, INT32 timeout, BOOL useTrivialWaits) |
20 | 17 | { |
21 | | - FCALL_CONTRACT; |
| 18 | + QCALL_CONTRACT; |
22 | 19 |
|
23 | 20 | INT32 retVal = 0; |
24 | | - HELPER_METHOD_FRAME_BEGIN_RET_0(); |
| 21 | + |
| 22 | + BEGIN_QCALL; |
25 | 23 |
|
26 | 24 | _ASSERTE(handle != 0); |
27 | 25 | _ASSERTE(handle != INVALID_HANDLE_VALUE); |
28 | 26 |
|
29 | 27 | Thread* pThread = GET_THREAD(); |
30 | | - |
31 | | - WaitMode waitMode = (WaitMode)((!FC_ACCESS_BOOL(useTrivialWaits) ? WaitMode_Alertable : WaitMode_None) | WaitMode_IgnoreSyncCtx); |
| 28 | + WaitMode waitMode = (WaitMode)((!useTrivialWaits ? WaitMode_Alertable : WaitMode_None) | WaitMode_IgnoreSyncCtx); |
32 | 29 | retVal = pThread->DoAppropriateWait(1, &handle, TRUE, timeout, waitMode); |
33 | 30 |
|
34 | | - HELPER_METHOD_FRAME_END(); |
| 31 | + END_QCALL; |
35 | 32 | return retVal; |
36 | 33 | } |
37 | | -FCIMPLEND |
38 | 34 |
|
39 | | -#ifdef TARGET_UNIX |
40 | | -extern "C" INT32 QCALLTYPE WaitHandle_CorWaitOnePrioritizedNative(HANDLE handle, INT32 timeoutMs) |
| 35 | +extern "C" INT32 QCALLTYPE WaitHandle_WaitMultipleIgnoringSyncContext(HANDLE *handleArray, INT32 numHandles, BOOL waitForAll, INT32 timeout) |
41 | 36 | { |
42 | 37 | QCALL_CONTRACT; |
43 | 38 |
|
44 | | - DWORD result = WAIT_FAILED; |
45 | | - |
46 | | - BEGIN_QCALL; |
47 | | - |
48 | | - _ASSERTE(handle != NULL); |
49 | | - _ASSERTE(handle != INVALID_HANDLE_VALUE); |
50 | | - |
51 | | - result = PAL_WaitForSingleObjectPrioritized(handle, timeoutMs); |
52 | | - |
53 | | - END_QCALL; |
54 | | - return (INT32)result; |
55 | | -} |
56 | | -#endif |
57 | | - |
58 | | -FCIMPL4(INT32, WaitHandleNative::CorWaitMultipleNative, HANDLE *handleArray, INT32 numHandles, FC_BOOL_ARG waitForAll, INT32 timeout) |
59 | | -{ |
60 | | - FCALL_CONTRACT; |
61 | | - |
62 | 39 | INT32 ret = 0; |
63 | | - HELPER_METHOD_FRAME_BEGIN_RET_0(); |
| 40 | + BEGIN_QCALL; |
64 | 41 |
|
65 | 42 | Thread * pThread = GET_THREAD(); |
66 | 43 |
|
67 | 44 | #ifdef FEATURE_COMINTEROP_APARTMENT_SUPPORT |
68 | 45 | // There are some issues with wait-all from an STA thread |
69 | 46 | // - https://github.com/dotnet/runtime/issues/10243#issuecomment-385117537 |
70 | | - if (FC_ACCESS_BOOL(waitForAll) && numHandles > 1 && pThread->GetApartment() == Thread::AS_InSTA) |
| 47 | + if (waitForAll && numHandles > 1 && pThread->GetApartment() == Thread::AS_InSTA) |
71 | 48 | { |
72 | 49 | COMPlusThrow(kNotSupportedException, W("NotSupported_WaitAllSTAThread")); |
73 | 50 | } |
74 | 51 | #endif // FEATURE_COMINTEROP_APARTMENT_SUPPORT |
75 | 52 |
|
76 | | - ret = pThread->DoAppropriateWait(numHandles, handleArray, FC_ACCESS_BOOL(waitForAll), timeout, (WaitMode)(WaitMode_Alertable | WaitMode_IgnoreSyncCtx)); |
| 53 | + ret = pThread->DoAppropriateWait(numHandles, handleArray, waitForAll, timeout, (WaitMode)(WaitMode_Alertable | WaitMode_IgnoreSyncCtx)); |
77 | 54 |
|
78 | | - HELPER_METHOD_FRAME_END(); |
| 55 | + END_QCALL; |
79 | 56 | return ret; |
80 | 57 | } |
81 | | -FCIMPLEND |
82 | 58 |
|
83 | | -FCIMPL3(INT32, WaitHandleNative::CorSignalAndWaitOneNative, HANDLE waitHandleSignalUNSAFE, HANDLE waitHandleWaitUNSAFE, INT32 timeout) |
| 59 | +extern "C" INT32 QCALLTYPE WaitHandle_SignalAndWait(HANDLE waitHandleSignal, HANDLE waitHandleWait, INT32 timeout) |
84 | 60 | { |
85 | | - FCALL_CONTRACT; |
| 61 | + QCALL_CONTRACT; |
86 | 62 |
|
87 | | - INT32 retVal = 0; |
| 63 | + INT32 retVal = (DWORD)-1; |
88 | 64 |
|
89 | | - HELPER_METHOD_FRAME_BEGIN_RET_0(); |
| 65 | + BEGIN_QCALL; |
90 | 66 |
|
91 | | - _ASSERTE(waitHandleSignalUNSAFE != 0); |
92 | | - _ASSERTE(waitHandleWaitUNSAFE != 0); |
| 67 | + _ASSERTE(waitHandleSignal != 0); |
| 68 | + _ASSERTE(waitHandleWait != 0); |
93 | 69 |
|
94 | 70 | Thread* pThread = GET_THREAD(); |
95 | 71 |
|
96 | | -#ifdef FEATURE_COMINTEROP |
97 | | - if (pThread->GetApartment() == Thread::AS_InSTA) { |
98 | | - COMPlusThrow(kNotSupportedException, W("NotSupported_SignalAndWaitSTAThread")); //<TODO> Change this message |
99 | | - } |
100 | | -#endif |
101 | | - |
102 | | - DWORD res = (DWORD) -1; |
103 | | - |
104 | | - HANDLE handles[2]; |
105 | | - handles[0] = waitHandleSignalUNSAFE; |
106 | | - handles[1] = waitHandleWaitUNSAFE; |
| 72 | +#ifdef FEATURE_COMINTEROP_APARTMENT_SUPPORT |
| 73 | + if (pThread->GetApartment() == Thread::AS_InSTA) |
107 | 74 | { |
108 | | - res = pThread->DoSignalAndWait(handles, timeout, TRUE /*alertable*/); |
| 75 | + COMPlusThrow(kNotSupportedException, W("NotSupported_SignalAndWaitSTAThread")); |
109 | 76 | } |
| 77 | +#endif // FEATURE_COMINTEROP_APARTMENT_SUPPORT |
110 | 78 |
|
111 | | - retVal = res; |
| 79 | + HANDLE handles[] = { waitHandleSignal, waitHandleWait }; |
| 80 | + retVal = pThread->DoSignalAndWait(handles, timeout, TRUE /*alertable*/); |
112 | 81 |
|
113 | | - HELPER_METHOD_FRAME_END(); |
| 82 | + END_QCALL; |
114 | 83 | return retVal; |
115 | 84 | } |
116 | | -FCIMPLEND |
| 85 | + |
| 86 | +#ifdef TARGET_UNIX |
| 87 | +extern "C" INT32 QCALLTYPE WaitHandle_WaitOnePrioritized(HANDLE handle, INT32 timeoutMs) |
| 88 | +{ |
| 89 | + QCALL_CONTRACT; |
| 90 | + |
| 91 | + DWORD result = WAIT_FAILED; |
| 92 | + |
| 93 | + BEGIN_QCALL; |
| 94 | + |
| 95 | + _ASSERTE(handle != NULL); |
| 96 | + _ASSERTE(handle != INVALID_HANDLE_VALUE); |
| 97 | + |
| 98 | + result = PAL_WaitForSingleObjectPrioritized(handle, timeoutMs); |
| 99 | + |
| 100 | + END_QCALL; |
| 101 | + return (INT32)result; |
| 102 | +} |
| 103 | +#endif // TARGET_UNIX |
0 commit comments