Piotr Caban : msvcrt: Add CurrentScheduler::Get implementation.
Module: wine Branch: master Commit: 43b768d5eb86f54707ad4ce74a5bb09fbd57529c URL: http://source.winehq.org/git/wine.git/?a=commit;h=43b768d5eb86f54707ad4ce74a... Author: Piotr Caban <piotr(a)codeweavers.com> Date: Thu Mar 30 22:47:49 2017 +0200 msvcrt: Add CurrentScheduler::Get implementation. Signed-off-by: Piotr Caban <piotr(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msvcrt/scheduler.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/dlls/msvcrt/scheduler.c b/dlls/msvcrt/scheduler.c index 26ca900..93dae7f 100644 --- a/dlls/msvcrt/scheduler.c +++ b/dlls/msvcrt/scheduler.c @@ -141,6 +141,7 @@ static CRITICAL_SECTION_DEBUG default_scheduler_cs_debug = }; static CRITICAL_SECTION default_scheduler_cs = { &default_scheduler_cs_debug, -1, 0, 0, 0, 0 }; static SchedulerPolicy default_scheduler_policy; +static ThreadScheduler *default_scheduler; static Context* try_get_current_context(void) { @@ -796,12 +797,45 @@ void __cdecl CurrentScheduler_Detach(void) FIXME("() stub\n"); } +static void create_default_scheduler(void) +{ + if(default_scheduler) + return; + + EnterCriticalSection(&default_scheduler_cs); + if(!default_scheduler) { + ThreadScheduler *scheduler; + + if(!default_scheduler_policy.policy_container) + SchedulerPolicy_ctor(&default_scheduler_policy); + + scheduler = MSVCRT_operator_new(sizeof(*scheduler)); + ThreadScheduler_ctor(scheduler, &default_scheduler_policy); + default_scheduler = scheduler; + } + LeaveCriticalSection(&default_scheduler_cs); +} + /* ?Get(a)CurrentScheduler@Concurrency@@SAPAVScheduler(a)2@XZ */ /* ?Get(a)CurrentScheduler@Concurrency@@SAPEAVScheduler(a)2@XZ */ Scheduler* __cdecl CurrentScheduler_Get(void) { - FIXME("() stub\n"); - return NULL; + ExternalContextBase *context = (ExternalContextBase*)get_current_context(); + + TRACE("()\n"); + + if(context->context.vtable != &MSVCRT_ExternalContextBase_vtable) { + ERR("unknown context set\n"); + return NULL; + } + + if(context->scheduler.scheduler) + return context->scheduler.scheduler; + + create_default_scheduler(); + context->scheduler.scheduler = &default_scheduler->scheduler; + ThreadScheduler_Reference(default_scheduler); + return &default_scheduler->scheduler; } /* ?CreateScheduleGroup(a)CurrentScheduler@Concurrency@@SAPAVScheduleGroup(a)2@AAVlocation(a)2@@Z */ @@ -927,6 +961,10 @@ void msvcrt_free_scheduler(void) TlsFree(context_tls_index); if(default_scheduler_policy.policy_container) SchedulerPolicy_dtor(&default_scheduler_policy); + if(default_scheduler) { + ThreadScheduler_dtor(default_scheduler); + MSVCRT_operator_delete(default_scheduler); + } } void msvcrt_free_scheduler_thread(void)
participants (1)
-
Alexandre Julliard