Piotr Caban : msvcrt: Add ThreadScheduler::Release implementation.

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


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

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

msvcrt: Add ThreadScheduler::Release implementation.

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

---

 dlls/msvcrt/scheduler.c | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/dlls/msvcrt/scheduler.c b/dlls/msvcrt/scheduler.c
index f8afed0..48a9d1b 100644
--- a/dlls/msvcrt/scheduler.c
+++ b/dlls/msvcrt/scheduler.c
@@ -110,6 +110,7 @@ typedef struct {
 
 typedef struct {
     Scheduler scheduler;
+    LONG ref;
     unsigned int id;
     unsigned int virt_proc_no;
     SchedulerPolicy policy;
@@ -519,6 +520,12 @@ void __thiscall SchedulerPolicy_dtor(SchedulerPolicy *this)
     MSVCRT_operator_delete(this->policy_container);
 }
 
+static void ThreadScheduler_dtor(ThreadScheduler *this)
+{
+    if(this->ref != 0) WARN("ref = %d\n", this->ref);
+    SchedulerPolicy_dtor(&this->policy);
+}
+
 DEFINE_THISCALL_WRAPPER(ThreadScheduler_Id, 4)
 unsigned int __thiscall ThreadScheduler_Id(const ThreadScheduler *this)
 {
@@ -544,15 +551,22 @@ SchedulerPolicy* __thiscall ThreadScheduler_GetPolicy(
 DEFINE_THISCALL_WRAPPER(ThreadScheduler_Reference, 4)
 unsigned int __thiscall ThreadScheduler_Reference(ThreadScheduler *this)
 {
-    FIXME("(%p) stub\n", this);
-    return 0;
+    TRACE("(%p)\n", this);
+    return InterlockedIncrement(&this->ref);
 }
 
 DEFINE_THISCALL_WRAPPER(ThreadScheduler_Release, 4)
 unsigned int __thiscall ThreadScheduler_Release(ThreadScheduler *this)
 {
-    FIXME("(%p) stub\n", this);
-    return 0;
+    unsigned int ret = InterlockedDecrement(&this->ref);
+
+    TRACE("(%p)\n", this);
+
+    if(!ret) {
+        ThreadScheduler_dtor(this);
+        MSVCRT_operator_delete(this);
+    }
+    return ret;
 }
 
 DEFINE_THISCALL_WRAPPER(ThreadScheduler_RegisterShutdownEvent, 8)
@@ -604,11 +618,6 @@ MSVCRT_bool __thiscall ThreadScheduler_IsAvailableLocation(
     return FALSE;
 }
 
-static void ThreadScheduler_dtor(ThreadScheduler *this)
-{
-    SchedulerPolicy_dtor(&this->policy);
-}
-
 DEFINE_THISCALL_WRAPPER(ThreadScheduler_vector_dtor, 8)
 Scheduler* __thiscall ThreadScheduler_vector_dtor(ThreadScheduler *this, unsigned int flags)
 {
@@ -637,6 +646,7 @@ static ThreadScheduler* ThreadScheduler_ctor(ThreadScheduler *this,
     TRACE("(%p)->()\n", this);
 
     this->scheduler.vtable = &MSVCRT_ThreadScheduler_vtable;
+    this->ref = 1;
     this->id = InterlockedIncrement(&scheduler_id);
     SchedulerPolicy_copy_ctor(&this->policy, policy);
 




More information about the wine-cvs mailing list