Piotr Caban : msvcrt: Add CurrentScheduler::Get implementation.
Alexandre Julliard
julliard at winehq.org
Fri Mar 31 14:26:28 CDT 2017
Module: wine
Branch: master
Commit: 43b768d5eb86f54707ad4ce74a5bb09fbd57529c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=43b768d5eb86f54707ad4ce74a5bb09fbd57529c
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Mar 30 22:47:49 2017 +0200
msvcrt: Add CurrentScheduler::Get implementation.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 at CurrentScheduler@Concurrency@@SAPAVScheduler at 2@XZ */
/* ?Get at CurrentScheduler@Concurrency@@SAPEAVScheduler at 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 at CurrentScheduler@Concurrency@@SAPAVScheduleGroup at 2@AAVlocation at 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)
More information about the wine-cvs
mailing list