|
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