[PATCH 0/5] MR1979: msvcrt: Remaining implementations and stubs for cm3
This adds the remaining `_StructuredTaskCollection` functions and other stubs needed for Crazy Machines 3 to work and decode preview images correctly in online mode. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979
From: Torge Matthies <tmatthies(a)codeweavers.com> Signed-off-by: Torge Matthies <tmatthies(a)codeweavers.com> --- dlls/msvcr110/msvcr110.spec | 6 +++--- dlls/msvcr120/msvcr120.spec | 6 +++--- dlls/msvcr120_app/msvcr120_app.spec | 6 +++--- dlls/msvcrt/concurrency.c | 7 +++++++ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 023c992a5e3..cf68d652385 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -550,9 +550,9 @@ @ stub -arch=arm ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QAA_NXZ @ stub -arch=i386 ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QAE_NXZ @ stub -arch=win64 ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QEAA_NXZ -@ stub -arch=arm ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBA_NXZ -@ stub -arch=i386 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBE_NXZ -@ stub -arch=win64 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QEBA_NXZ +@ cdecl -arch=arm ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBA_NXZ(ptr) _Context_IsSynchronouslyBlocked +@ thiscall -arch=i386 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBE_NXZ(ptr) _Context_IsSynchronouslyBlocked +@ cdecl -arch=win64 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QEBA_NXZ(ptr) _Context_IsSynchronouslyBlocked @ stub -arch=win32 ?_Name_base(a)type_info@@CAPBDPBV1(a)PAU__type_info_node@@@Z @ stub -arch=win64 ?_Name_base(a)type_info@@CAPEBDPEBV1(a)PEAU__type_info_node@@@Z @ stub -arch=win32 ?_Name_base_internal(a)type_info@@CAPBDPBV1(a)PAU__type_info_node@@@Z diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 85c336b1205..580fb26756c 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -541,9 +541,9 @@ @ stub -arch=arm ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QAA_NXZ @ stub -arch=i386 ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QAE_NXZ @ stub -arch=win64 ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QEAA_NXZ -@ stub -arch=arm ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBA_NXZ -@ stub -arch=i386 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBE_NXZ -@ stub -arch=win64 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QEBA_NXZ +@ cdecl -arch=arm ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBA_NXZ(ptr) _Context_IsSynchronouslyBlocked +@ thiscall -arch=i386 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBE_NXZ(ptr) _Context_IsSynchronouslyBlocked +@ cdecl -arch=win64 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QEBA_NXZ(ptr) _Context_IsSynchronouslyBlocked @ stub -arch=win32 ?_Name_base(a)type_info@@CAPBDPBV1(a)PAU__type_info_node@@@Z @ stub -arch=win64 ?_Name_base(a)type_info@@CAPEBDPEBV1(a)PEAU__type_info_node@@@Z @ stub -arch=win32 ?_Name_base_internal(a)type_info@@CAPBDPBV1(a)PAU__type_info_node@@@Z diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 0b5b33bb513..afee7894a0a 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -538,9 +538,9 @@ @ stub -arch=arm ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QAA_NXZ @ stub -arch=i386 ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QAE_NXZ @ stub -arch=win64 ?_IsCanceling(a)_TaskCollection@details(a)Concurrency@@QEAA_NXZ -@ stub -arch=arm ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBA_NXZ -@ stub -arch=i386 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBE_NXZ -@ stub -arch=win64 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QEBA_NXZ +@ cdecl -arch=arm ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBA_NXZ(ptr) msvcr120.?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBA_NXZ +@ thiscall -arch=i386 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBE_NXZ(ptr) msvcr120.?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QBE_NXZ +@ cdecl -arch=win64 ?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QEBA_NXZ(ptr) msvcr120.?_IsSynchronouslyBlocked(a)_Context@details(a)Concurrency@@QEBA_NXZ @ stub -arch=win32 ?_Name_base(a)type_info@@CAPBDPBV1(a)PAU__type_info_node@@@Z @ stub -arch=win64 ?_Name_base(a)type_info@@CAPEBDPEBV1(a)PEAU__type_info_node@@@Z @ stub -arch=win32 ?_Name_base_internal(a)type_info@@CAPBDPBV1(a)PAU__type_info_node@@@Z diff --git a/dlls/msvcrt/concurrency.c b/dlls/msvcrt/concurrency.c index f7bda445bc1..ba13243b4d5 100644 --- a/dlls/msvcrt/concurrency.c +++ b/dlls/msvcrt/concurrency.c @@ -867,6 +867,13 @@ _Context *__cdecl _Context__CurrentContext(_Context *ret) ret->context = Context_CurrentContext(); return ret; } + +DEFINE_THISCALL_WRAPPER(_Context_IsSynchronouslyBlocked, 4) +BOOL __thiscall _Context_IsSynchronouslyBlocked(const _Context *this) +{ + TRACE("(%p)\n", this); + return FALSE; +} #endif DEFINE_THISCALL_WRAPPER(ExternalContextBase_GetId, 4) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1979
From: Torge Matthies <tmatthies(a)codeweavers.com> Signed-off-by: Torge Matthies <tmatthies(a)codeweavers.com> --- dlls/msvcr120/tests/msvcr120.c | 2 +- dlls/msvcrt/concurrency.c | 59 +++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index 0a4fb383e0e..51a4e856562 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -1587,7 +1587,7 @@ static void test_StructuredTaskCollection(void) ok(b, "SetEvent failed\n"); status = p__StructuredTaskCollection__RunAndWait(&task_coll, NULL); - todo_wine ok(status == 2, "_StructuredTaskCollection::_RunAndWait failed: %d\n", status); + ok(status == 2, "_StructuredTaskCollection::_RunAndWait failed: %d\n", status); call_func1(p__StructuredTaskCollection_dtor, &task_coll); CloseHandle(chore_start_evt); diff --git a/dlls/msvcrt/concurrency.c b/dlls/msvcrt/concurrency.c index fe156938e3a..bc41d2a3aae 100644 --- a/dlls/msvcrt/concurrency.c +++ b/dlls/msvcrt/concurrency.c @@ -1950,6 +1950,58 @@ static ThreadScheduler *get_thread_scheduler_from_context(Context *context) return NULL; } +static void cancel_task_collection(_StructuredTaskCollection *this) +{ + ExternalContextBase* context; + ThreadScheduler *scheduler; + void *prev_exception, *new_exception; + struct scheduled_chore *sc, *next; + LONG removed = 0; + LONG prev_finished, new_finished; + + context = (ExternalContextBase*)this->context; + if (!context) + return; + scheduler = get_thread_scheduler_from_context(context); + if (!scheduler) + return; + + new_exception = this->exception; + do { + prev_exception = new_exception; + if ((ULONG_PTR)prev_exception & 0x2) + return; + new_exception = (void*)((ULONG_PTR)prev_exception | 0x2); + } while ((new_exception = InterlockedCompareExchangePointer( + &this->exception, new_exception, prev_exception)) + != prev_exception); + + EnterCriticalSection(&scheduler->cs); + LIST_FOR_EACH_ENTRY_SAFE(sc, next, &scheduler->scheduled_chores, + struct scheduled_chore, entry) { + if (sc->chore->task_collection != this) + continue; + sc->chore->task_collection = NULL; + list_remove(&sc->entry); + removed++; + operator_delete(sc); + } + LeaveCriticalSection(&scheduler->cs); + if (!removed) + return; + + new_finished = this->finished; + do { + prev_finished = new_finished; + if (prev_finished == FINISHED_INITIAL) + new_finished = removed; + else + new_finished = prev_finished + removed; + } while ((new_finished = InterlockedCompareExchange(&this->finished, + new_finished, prev_finished)) != prev_finished); + RtlWakeAddressAll((LONG*)&this->finished); +} + struct execute_chore_data { _UnrealizedChore *chore; _StructuredTaskCollection *task_collection; @@ -1964,6 +2016,8 @@ static LONG CALLBACK execute_chore_except(EXCEPTION_POINTERS *pexc, void *_data) if (pexc->ExceptionRecord->ExceptionCode != CXX_EXCEPTION) return EXCEPTION_CONTINUE_SEARCH; + cancel_task_collection(data->task_collection); + ptr = operator_new(sizeof(*ptr)); __ExceptionPtrCreate(ptr); exception_ptr_from_record(ptr, pexc->ExceptionRecord); @@ -2200,6 +2254,8 @@ static void CALLBACK exception_ptr_rethrow_finally(BOOL normal, void *data) } __FINALLY_CTX(exception_ptr_rethrow_finally, ep) } + if (exception & 0x2) + return 2; return 1; } @@ -2210,7 +2266,8 @@ DEFINE_THISCALL_WRAPPER(_StructuredTaskCollection__Cancel, 4) void __thiscall _StructuredTaskCollection__Cancel( _StructuredTaskCollection *this) { - FIXME("(%p): stub!\n", this); + TRACE("(%p)\n", this); + cancel_task_collection(this); } /* ?_IsCanceling(a)_StructuredTaskCollection@details(a)Concurrency@@QAA_NXZ */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1979
From: Torge Matthies <tmatthies(a)codeweavers.com> The pointer is needed for Crazy Machines 3 to not crash. Signed-off-by: Torge Matthies <tmatthies(a)codeweavers.com> --- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcrt/concurrency.c | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 4fc5a069fbb..6a64474fb84 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -19,7 +19,7 @@ @ stub -arch=win64 ??0_CancellationTokenState(a)details@Concurrency@@AEAA(a)XZ @ stub -arch=arm ??0_Cancellation_beacon(a)details@Concurrency@@QAA(a)XZ @ stub -arch=i386 ??0_Cancellation_beacon(a)details@Concurrency@@QAE(a)XZ -@ stub -arch=win64 ??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ +@ cdecl -arch=win64 ??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ(ptr) _Cancellation_beacon_ctor @ cdecl -arch=arm ??0_Condition_variable(a)details@Concurrency@@QAA(a)XZ(ptr) _Condition_variable_ctor @ thiscall -arch=i386 ??0_Condition_variable(a)details@Concurrency@@QAE(a)XZ(ptr) _Condition_variable_ctor @ cdecl -arch=win64 ??0_Condition_variable(a)details@Concurrency@@QEAA(a)XZ(ptr) _Condition_variable_ctor diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 7b379830d4b..e88dcb97f06 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -16,7 +16,7 @@ @ cdecl -arch=win64 ??0SchedulerPolicy(a)Concurrency@@QEAA(a)XZ(ptr) SchedulerPolicy_ctor @ stub -arch=arm ??0_Cancellation_beacon(a)details@Concurrency@@QAA(a)XZ @ stub -arch=i386 ??0_Cancellation_beacon(a)details@Concurrency@@QAE(a)XZ -@ stub -arch=win64 ??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ +@ cdecl -arch=win64 ??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ(ptr) _Cancellation_beacon_ctor @ cdecl -arch=arm ??0_Condition_variable(a)details@Concurrency@@QAA(a)XZ(ptr) _Condition_variable_ctor @ thiscall -arch=i386 ??0_Condition_variable(a)details@Concurrency@@QAE(a)XZ(ptr) _Condition_variable_ctor @ cdecl -arch=win64 ??0_Condition_variable(a)details@Concurrency@@QEAA(a)XZ(ptr) _Condition_variable_ctor diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 37282fc54f8..705e64baf5f 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -14,7 +14,7 @@ @ cdecl -arch=win64 ??0SchedulerPolicy(a)Concurrency@@QEAA(a)XZ(ptr) msvcr120.??0SchedulerPolicy(a)Concurrency@@QEAA(a)XZ @ stub -arch=arm ??0_Cancellation_beacon(a)details@Concurrency@@QAA(a)XZ @ stub -arch=i386 ??0_Cancellation_beacon(a)details@Concurrency@@QAE(a)XZ -@ stub -arch=win64 ??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ +@ cdecl -arch=win64 ??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ(ptr) msvcr120.??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ @ cdecl -arch=arm ??0_Condition_variable(a)details@Concurrency@@QAA(a)XZ(ptr) msvcr120.??0_Condition_variable(a)details@Concurrency@@QAA(a)XZ @ thiscall -arch=i386 ??0_Condition_variable(a)details@Concurrency@@QAE(a)XZ(ptr) msvcr120.??0_Condition_variable(a)details@Concurrency@@QAE(a)XZ @ cdecl -arch=win64 ??0_Condition_variable(a)details@Concurrency@@QEAA(a)XZ(ptr) msvcr120.??0_Condition_variable(a)details@Concurrency@@QEAA(a)XZ diff --git a/dlls/msvcrt/concurrency.c b/dlls/msvcrt/concurrency.c index 5ab8db3e2f1..55d7c1cc52c 100644 --- a/dlls/msvcrt/concurrency.c +++ b/dlls/msvcrt/concurrency.c @@ -297,6 +297,10 @@ typedef struct cv_queue { LONG expired; } cv_queue; +typedef struct { + void *unknown; +} _Cancellation_beacon; + typedef struct { /* cv_queue structure is not binary compatible */ cv_queue *queue; @@ -2841,6 +2845,21 @@ int __cdecl event_wait_for_multiple(event **events, size_t count, bool wait_all, #if _MSVCR_VER >= 110 +struct { + void *unk; +} _Cancellation_beacon_unknown = { + 0x0 +}; + +/* ??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ */ +DEFINE_THISCALL_WRAPPER(_Cancellation_beacon_ctor, 4) +_Cancellation_beacon* __thiscall _Cancellation_beacon_ctor(_Cancellation_beacon *this) +{ + FIXME("(%p): stub!\n", this); + this->unknown = &_Cancellation_beacon_unknown; + return this; +} + /* ??0_Condition_variable(a)details@Concurrency@@QAE(a)XZ */ /* ??0_Condition_variable(a)details@Concurrency@@QEAA(a)XZ */ DEFINE_THISCALL_WRAPPER(_Condition_variable_ctor, 4) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1979
From: Torge Matthies <tmatthies(a)codeweavers.com> Signed-off-by: Torge Matthies <tmatthies(a)codeweavers.com> --- dlls/msvcr120/tests/msvcr120.c | 2 +- dlls/msvcrt/concurrency.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index 51a4e856562..c6b98a7b996 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -1403,7 +1403,7 @@ static void __cdecl chore_proc(_UnrealizedChore *_this) MSVCRT_bool canceling = call_func1( p__StructuredTaskCollection__IsCanceling, chore->chore.task_collection); - todo_wine ok(canceling, "Task is not canceling\n"); + ok(canceling, "Task is not canceling\n"); } } diff --git a/dlls/msvcrt/concurrency.c b/dlls/msvcrt/concurrency.c index bc41d2a3aae..5ab8db3e2f1 100644 --- a/dlls/msvcrt/concurrency.c +++ b/dlls/msvcrt/concurrency.c @@ -2277,8 +2277,8 @@ DEFINE_THISCALL_WRAPPER(_StructuredTaskCollection__IsCanceling, 4) bool __thiscall _StructuredTaskCollection__IsCanceling( _StructuredTaskCollection *this) { - FIXME("(%p): stub!\n", this); - return FALSE; + TRACE("(%p)\n", this); + return !!((ULONG_PTR)this->exception & 0x2); } /* ??0critical_section(a)Concurrency@@QAE(a)XZ */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1979
From: Torge Matthies <tmatthies(a)codeweavers.com> Signed-off-by: Torge Matthies <tmatthies(a)codeweavers.com> --- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcrt/concurrency.c | 7 +++++++ 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 6a64474fb84..023c992a5e3 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -277,7 +277,7 @@ @ stub -arch=win64 ??1_CancellationTokenState(a)details@Concurrency@@UEAA(a)XZ @ stub -arch=arm ??1_Cancellation_beacon(a)details@Concurrency@@QAA(a)XZ @ stub -arch=i386 ??1_Cancellation_beacon(a)details@Concurrency@@QAE(a)XZ -@ stub -arch=win64 ??1_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ +@ cdecl -arch=win64 ??1_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ(ptr) _Cancellation_beacon_dtor @ cdecl -arch=arm ??1_Condition_variable(a)details@Concurrency@@QAA(a)XZ(ptr) _Condition_variable_dtor @ thiscall -arch=i386 ??1_Condition_variable(a)details@Concurrency@@QAE(a)XZ(ptr) _Condition_variable_dtor @ cdecl -arch=win64 ??1_Condition_variable(a)details@Concurrency@@QEAA(a)XZ(ptr) _Condition_variable_dtor diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index e88dcb97f06..85c336b1205 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -271,7 +271,7 @@ @ cdecl -arch=win64 ??1SchedulerPolicy(a)Concurrency@@QEAA(a)XZ(ptr) SchedulerPolicy_dtor @ stub -arch=arm ??1_Cancellation_beacon(a)details@Concurrency@@QAA(a)XZ @ stub -arch=i386 ??1_Cancellation_beacon(a)details@Concurrency@@QAE(a)XZ -@ stub -arch=win64 ??1_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ +@ cdecl -arch=win64 ??1_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ(ptr) _Cancellation_beacon_dtor @ cdecl -arch=arm ??1_Condition_variable(a)details@Concurrency@@QAA(a)XZ(ptr) _Condition_variable_dtor @ thiscall -arch=i386 ??1_Condition_variable(a)details@Concurrency@@QAE(a)XZ(ptr) _Condition_variable_dtor @ cdecl -arch=win64 ??1_Condition_variable(a)details@Concurrency@@QEAA(a)XZ(ptr) _Condition_variable_dtor diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 705e64baf5f..0b5b33bb513 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -269,7 +269,7 @@ @ cdecl -arch=win64 ??1SchedulerPolicy(a)Concurrency@@QEAA(a)XZ(ptr) msvcr120.??1SchedulerPolicy(a)Concurrency@@QEAA(a)XZ @ stub -arch=arm ??1_Cancellation_beacon(a)details@Concurrency@@QAA(a)XZ @ stub -arch=i386 ??1_Cancellation_beacon(a)details@Concurrency@@QAE(a)XZ -@ stub -arch=win64 ??1_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ +@ cdecl -arch=win64 ??1_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ(ptr) msvcr120.??1_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ @ cdecl -arch=arm ??1_Condition_variable(a)details@Concurrency@@QAA(a)XZ(ptr) msvcr120.??1_Condition_variable(a)details@Concurrency@@QAA(a)XZ @ thiscall -arch=i386 ??1_Condition_variable(a)details@Concurrency@@QAE(a)XZ(ptr) msvcr120.??1_Condition_variable(a)details@Concurrency@@QAE(a)XZ @ cdecl -arch=win64 ??1_Condition_variable(a)details@Concurrency@@QEAA(a)XZ(ptr) msvcr120.??1_Condition_variable(a)details@Concurrency@@QEAA(a)XZ diff --git a/dlls/msvcrt/concurrency.c b/dlls/msvcrt/concurrency.c index 55d7c1cc52c..f7bda445bc1 100644 --- a/dlls/msvcrt/concurrency.c +++ b/dlls/msvcrt/concurrency.c @@ -2860,6 +2860,13 @@ _Cancellation_beacon* __thiscall _Cancellation_beacon_ctor(_Cancellation_beacon return this; } +/* ??1_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ */ +DEFINE_THISCALL_WRAPPER(_Cancellation_beacon_dtor, 4) +void __thiscall _Cancellation_beacon_dtor(_Cancellation_beacon *this) +{ + FIXME("(%p): stub!\n", this); +} + /* ??0_Condition_variable(a)details@Concurrency@@QAE(a)XZ */ /* ??0_Condition_variable(a)details@Concurrency@@QEAA(a)XZ */ DEFINE_THISCALL_WRAPPER(_Condition_variable_ctor, 4) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1979
Piotr Caban (@piotr) commented about dlls/msvcrt/concurrency.c:
if (pexc->ExceptionRecord->ExceptionCode != CXX_EXCEPTION) return EXCEPTION_CONTINUE_SEARCH;
+ cancel_task_collection(data->task_collection);
There's no need to define cancel_task_collection helper. You can call _StructuredTaskCollection__Cancel here. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_21771
Piotr Caban (@piotr) commented about dlls/msvcrt/concurrency.c:
+ void *prev_exception, *new_exception; + struct scheduled_chore *sc, *next; + LONG removed = 0; + LONG prev_finished, new_finished; + + context = (ExternalContextBase*)this->context; + if (!context) + return; + scheduler = get_thread_scheduler_from_context(context); + if (!scheduler) + return; + + new_exception = this->exception; + do { + prev_exception = new_exception; + if ((ULONG_PTR)prev_exception & 0x2) Please avoid using magic constants. You can define _TaskCollectionStatus and use it here instead:
typedef enum
{
TASK_COLLECTION_SUCCESS = 1,
TASK_COLLECTION_CANCELLED
} _TaskCollectionStatus;
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_21770
Piotr Caban (@piotr) commented about dlls/msvcrt/concurrency.c:
ret->context = Context_CurrentContext(); return ret; } + +DEFINE_THISCALL_WRAPPER(_Context_IsSynchronouslyBlocked, 4) +BOOL __thiscall _Context_IsSynchronouslyBlocked(const _Context *this)
I don't think it's a good idea to stub functions related to synchronization. Do you know what will it take to implement it properly? Maybe it would be enough to introduce a simple wrapper around RtlWaitOnAddress that will store information if the context is blocked. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_21773
Piotr Caban (@piotr) commented about dlls/msvcrt/concurrency.c:
#if _MSVCR_VER >= 110
+struct { + void *unk; +} _Cancellation_beacon_unknown = { + 0x0 +}; + +/* ??0_Cancellation_beacon(a)details@Concurrency@@QEAA(a)XZ */ +DEFINE_THISCALL_WRAPPER(_Cancellation_beacon_ctor, 4) +_Cancellation_beacon* __thiscall _Cancellation_beacon_ctor(_Cancellation_beacon *this)
Do you know what this function is supposed to do? I don't really like the idea of adding such a stub without understanding it better. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_21772
On Wed Jan 25 12:19:10 2023 +0000, Piotr Caban wrote:
I don't think it's a good idea to stub functions related to synchronization. Do you know what will it take to implement it properly? Maybe it would be enough to introduce a simple wrapper around RtlWaitOnAddress that will store information if the context is blocked. @piotr Do you know what "synchronously blocked" might mean? I would need to find that out, but the implementation itself shouldn't be too hard, as you said it could just be a `LONG synchronously_blocked;` that is changed using `InterlockedOr`/`InterlockedAnd`.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_28224
On Tue Mar 28 15:10:46 2023 +0000, Torge Matthies wrote:
@piotr Do you know what "synchronously blocked" might mean? I would need to find that out, but the implementation itself shouldn't be too hard, as you said it could just be a `LONG synchronously_blocked;` that is changed using `InterlockedOr`/`InterlockedAnd`. It returns true when thread is blocked (is waiting). See following code for an example:
static Context *ctx;
static critical_section cs;
static DWORD WINAPI lock_thread(void* p)
{
ctx = p_Context_CurrentContext();
trace("is blocked thread: %d\n", call_func1(p__Context_IsSynchronouslyBlocked, ctx));
call_func1(p_critical_section_lock, &cs)
return 0;
}
int main()
{
call_func1(p_critical_section_ctor, &cs);
call_func1(p_critical_section_lock, &cs)
CreateThread(NULL, 0, lock_thread, NULL, NULL, NULL);
Sleep(100);
trace("is blocked main: %d\n", call_func1(p__Context_IsSynchronouslyBlocked, ctx));
return 0;
}
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_28225
On Tue Mar 28 15:30:27 2023 +0000, Piotr Caban wrote:
It returns true when thread is blocked (is waiting). See following code for an example: ```c static Context *ctx; static critical_section cs; static DWORD WINAPI lock_thread(void* p) { ctx = p_Context_CurrentContext(); trace("is blocked thread: %d\n", call_func1(p__Context_IsSynchronouslyBlocked, ctx)); call_func1(p_critical_section_lock, &cs) return 0; } int main() { call_func1(p_critical_section_ctor, &cs); call_func1(p_critical_section_lock, &cs) CreateThread(NULL, 0, lock_thread, NULL, NULL, NULL); Sleep(100); trace("is blocked main: %d\n", call_func1(p__Context_IsSynchronouslyBlocked, ctx)); return 0; } ``` Does this apply only to ConcRT functions or to all blocking functions (e.g. `NtWaitForSingleObject` and/or `RtlWaitOnAddress`)?
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_28229
On Tue Mar 28 16:21:36 2023 +0000, Torge Matthies wrote:
Does this apply only to ConcRT functions or to all blocking functions (e.g. `NtWaitForSingleObject` and/or `RtlWaitOnAddress`)? I think it can't apply to non Concurrency functions but I didn't test it.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_28230
On Wed Jan 25 12:19:10 2023 +0000, Piotr Caban wrote:
Do you know what this function is supposed to do? I don't really like the idea of adding such a stub without understanding it better. The class is some kind of implementation detail of the public `cancellation_token` class, which can be used to cancel asynchronous operations. I tried to find out what it's supposed to point to but couldn't find an answer. A pointer to a `NULL` pointer seems to work for this game.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_28231
On Tue Mar 28 16:26:33 2023 +0000, Piotr Caban wrote:
I think it can't apply to non Concurrency functions but I didn't test it. That means I'll have to find all the places where out ConcRT implementations block and add code before and after that mark the context as blocked / not blocked. Not impossible but takes a while, is this really needed? What is this function used for, and can its use-cases be satisfied with a different stub implementation?
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/1979#note_28232
participants (3)
-
Piotr Caban (@piotr) -
Torge Matthies -
Torge Matthies (@tmatthies)