Piotr Caban : msvcrt: Add Scheduler::Create implementation.

Alexandre Julliard julliard at winehq.org
Tue Mar 28 15:38:41 CDT 2017


Module: wine
Branch: master
Commit: bac1ca7033eb619968590bca0e11d08cbecff6f9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bac1ca7033eb619968590bca0e11d08cbecff6f9

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Mar 28 10:50:24 2017 +0200

msvcrt: Add Scheduler::Create implementation.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/scheduler.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 153 insertions(+), 5 deletions(-)

diff --git a/dlls/msvcrt/scheduler.c b/dlls/msvcrt/scheduler.c
index 96f8582..a1fd8ba 100644
--- a/dlls/msvcrt/scheduler.c
+++ b/dlls/msvcrt/scheduler.c
@@ -83,6 +83,15 @@ typedef struct {
 extern const vtable_ptr MSVCRT_ExternalContextBase_vtable;
 static void ExternalContextBase_ctor(ExternalContextBase*);
 
+typedef struct {
+    const vtable_ptr *vtable;
+} Scheduler;
+
+typedef struct {
+    Scheduler scheduler;
+} ThreadScheduler;
+extern const vtable_ptr MSVCRT_ThreadScheduler_vtable;
+
 static int context_tls_index = TLS_OUT_OF_INDEXES;
 
 static Context* try_get_current_context(void)
@@ -506,16 +515,134 @@ void __thiscall SchedulerPolicy_dtor(SchedulerPolicy *this)
     MSVCRT_operator_delete(this->policy_container);
 }
 
-typedef struct {
-    const vtable_ptr *vtable;
-} Scheduler;
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_Id, 4)
+unsigned int __thiscall ThreadScheduler_Id(const ThreadScheduler *this)
+{
+    FIXME("(%p) stub\n", this);
+    return 0;
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_GetNumberOfVirtualProcessors, 4)
+unsigned int __thiscall ThreadScheduler_GetNumberOfVirtualProcessors(const ThreadScheduler *this)
+{
+    FIXME("(%p) stub\n", this);
+    return 0;
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_GetPolicy, 8)
+SchedulerPolicy* __thiscall ThreadScheduler_GetPolicy(
+        const ThreadScheduler *this, SchedulerPolicy *ret)
+{
+    FIXME("(%p %p) stub\n", this, ret);
+    return NULL;
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_Reference, 4)
+unsigned int __thiscall ThreadScheduler_Reference(ThreadScheduler *this)
+{
+    FIXME("(%p) stub\n", this);
+    return 0;
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_Release, 4)
+unsigned int __thiscall ThreadScheduler_Release(ThreadScheduler *this)
+{
+    FIXME("(%p) stub\n", this);
+    return 0;
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_RegisterShutdownEvent, 8)
+void __thiscall ThreadScheduler_RegisterShutdownEvent(ThreadScheduler *this, HANDLE event)
+{
+    FIXME("(%p %p) stub\n", this, event);
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_Attach, 4)
+void __thiscall ThreadScheduler_Attach(ThreadScheduler *this)
+{
+    FIXME("(%p) stub\n", this);
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_CreateScheduleGroup_loc, 8)
+/*ScheduleGroup*/void* __thiscall ThreadScheduler_CreateScheduleGroup_loc(
+        ThreadScheduler *this, /*location*/void *placement)
+{
+    FIXME("(%p %p) stub\n", this, placement);
+    return NULL;
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_CreateScheduleGroup, 4)
+/*ScheduleGroup*/void* __thiscall ThreadScheduler_CreateScheduleGroup(ThreadScheduler *this)
+{
+    FIXME("(%p) stub\n", this);
+    return NULL;
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_ScheduleTask_loc, 16)
+void __thiscall ThreadScheduler_ScheduleTask_loc(ThreadScheduler *this,
+        void (__cdecl *proc)(void*), void* data, /*location*/void *placement)
+{
+    FIXME("(%p %p %p %p) stub\n", this, proc, data, placement);
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_ScheduleTask, 12)
+void __thiscall ThreadScheduler_ScheduleTask(ThreadScheduler *this,
+        void (__cdecl *proc)(void*), void* data)
+{
+    FIXME("(%p %p %p) stub\n", this, proc, data);
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_IsAvailableLocation, 8)
+MSVCRT_bool __thiscall ThreadScheduler_IsAvailableLocation(
+        const ThreadScheduler *this, const /*location*/void *placement)
+{
+    FIXME("(%p %p) stub\n", this, placement);
+    return FALSE;
+}
+
+static void ThreadScheduler_dtor(ThreadScheduler *this)
+{
+}
+
+DEFINE_THISCALL_WRAPPER(ThreadScheduler_vector_dtor, 8)
+Scheduler* __thiscall ThreadScheduler_vector_dtor(ThreadScheduler *this, unsigned int flags)
+{
+    TRACE("(%p %x)\n", this, flags);
+    if(flags & 2) {
+        /* we have an array, with the number of elements stored before the first object */
+        INT_PTR i, *ptr = (INT_PTR *)this-1;
+
+        for(i=*ptr-1; i>=0; i--)
+            ThreadScheduler_dtor(this+i);
+        MSVCRT_operator_delete(ptr);
+    } else {
+        ThreadScheduler_dtor(this);
+        if(flags & 1)
+            MSVCRT_operator_delete(this);
+    }
+
+    return &this->scheduler;
+}
+
+static ThreadScheduler* ThreadScheduler_ctor(ThreadScheduler *this,
+        const SchedulerPolicy *policy)
+{
+    TRACE("(%p)->()\n", this);
+
+    this->scheduler.vtable = &MSVCRT_ThreadScheduler_vtable;
+    return this;
+}
 
 /* ?Create at Scheduler@Concurrency@@SAPAV12 at ABVSchedulerPolicy@2@@Z */
 /* ?Create at Scheduler@Concurrency@@SAPEAV12 at AEBVSchedulerPolicy@2@@Z */
 Scheduler* __cdecl Scheduler_Create(const SchedulerPolicy *policy)
 {
-    FIXME("(%p) stub\n", policy);
-    return NULL;
+    ThreadScheduler *ret;
+
+    TRACE("(%p)\n", policy);
+
+    ret = MSVCRT_operator_new(sizeof(*ret));
+    return &ThreadScheduler_ctor(ret, policy)->scheduler;
 }
 
 /* ?ResetDefaultSchedulerPolicy at Scheduler@Concurrency@@SAXXZ */
@@ -536,6 +663,10 @@ DEFINE_RTTI_DATA0(Context, 0, ".?AVContext at Concurrency@@")
 DEFINE_RTTI_DATA1(ContextBase, 0, &Context_rtti_base_descriptor, ".?AVContextBase at details@Concurrency@@")
 DEFINE_RTTI_DATA2(ExternalContextBase, 0, &ContextBase_rtti_base_descriptor,
         &Context_rtti_base_descriptor, ".?AVExternalContextBase at details@Concurrency@@")
+DEFINE_RTTI_DATA0(Scheduler, 0, ".?AVScheduler at Concurrency@@")
+DEFINE_RTTI_DATA1(SchedulerBase, 0, &Scheduler_rtti_base_descriptor, ".?AVSchedulerBase at details@Concurrency@@")
+DEFINE_RTTI_DATA2(ThreadScheduler, 0, &SchedulerBase_rtti_base_descriptor,
+        &Scheduler_rtti_base_descriptor, ".?AVThreadScheduler at details@Concurrency@@")
 
 #ifndef __GNUC__
 void __asm_dummy_vtables(void) {
@@ -547,6 +678,20 @@ void __asm_dummy_vtables(void) {
             VTABLE_ADD_FUNC(ExternalContextBase_Unblock)
             VTABLE_ADD_FUNC(ExternalContextBase_IsSynchronouslyBlocked)
             VTABLE_ADD_FUNC(ExternalContextBase_vector_dtor));
+    __ASM_VTABLE(ThreadScheduler,
+            VTABLE_ADD_FUNC(ThreadScheduler_vector_dtor)
+            VTABLE_ADD_FUNC(ThreadScheduler_Id)
+            VTABLE_ADD_FUNC(ThreadScheduler_GetNumberOfVirtualProcessors)
+            VTABLE_ADD_FUNC(ThreadScheduler_GetPolicy)
+            VTABLE_ADD_FUNC(ThreadScheduler_Reference)
+            VTABLE_ADD_FUNC(ThreadScheduler_Release)
+            VTABLE_ADD_FUNC(ThreadScheduler_RegisterShutdownEvent)
+            VTABLE_ADD_FUNC(ThreadScheduler_Attach)
+            VTABLE_ADD_FUNC(ThreadScheduler_CreateScheduleGroup_loc)
+            VTABLE_ADD_FUNC(ThreadScheduler_CreateScheduleGroup)
+            VTABLE_ADD_FUNC(ThreadScheduler_ScheduleTask_loc)
+            VTABLE_ADD_FUNC(ThreadScheduler_ScheduleTask)
+            VTABLE_ADD_FUNC(ThreadScheduler_IsAvailableLocation));
 #ifndef __GNUC__
 }
 #endif
@@ -557,6 +702,9 @@ void msvcrt_init_scheduler(void *base)
     init_Context_rtti(base);
     init_ContextBase_rtti(base);
     init_ExternalContextBase_rtti(base);
+    init_Scheduler_rtti(base);
+    init_SchedulerBase_rtti(base);
+    init_ThreadScheduler_rtti(base);
 #endif
 }
 




More information about the wine-cvs mailing list