[1/4] msvcirt: Implement ios locking control

Iván Matellanes matellanesivan at gmail.com
Tue Jul 7 14:00:30 CDT 2015


---
 dlls/msvcirt/msvcirt.c       | 11 +++++++----
 dlls/msvcirt/tests/msvcirt.c | 20 ++++++++++++++++++++
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index 04c195d..a2f5189 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -852,7 +852,9 @@ void __thiscall ios_clear(ios *this, int state)
 /* ?clrlock at ios@@QEAAXXZ */
 void __cdecl ios_clrlock(ios *this)
 {
-    FIXME("(%p) stub\n", this);
+    TRACE("(%p)\n", this);
+    if (this->do_lock <= 0)
+        this->do_lock++;
 }
 
 /* ?delbuf at ios@@QAEXH at Z */
@@ -1000,8 +1002,8 @@ void __cdecl ios_lockc(void)
 DEFINE_THISCALL_WRAPPER(ios_lockptr, 4)
 CRITICAL_SECTION* __thiscall ios_lockptr(ios *this)
 {
-    FIXME("(%p) stub\n", this);
-    return NULL;
+    TRACE("(%p)\n", this);
+    return &this->lock;
 }
 
 /* ?oct@@YAAAVios@@AAV1@@Z */
@@ -1079,7 +1081,8 @@ LONG __thiscall ios_setf_mask(ios *this, LONG flags, LONG mask)
 /* ?setlock at ios@@QEAAXXZ */
 void __cdecl ios_setlock(ios *this)
 {
-    FIXME("(%p) stub\n", this);
+    TRACE("(%p)\n", this);
+    this->do_lock--;
 }
 
 /* ?sync_with_stdio at ios@@SAXXZ */
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index aded18f..f53afd8 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -128,6 +128,8 @@ static ios* (*__thiscall p_ios_sb_ctor)(ios*, streambuf*);
 static ios* (*__thiscall p_ios_assign)(ios*, const ios*);
 static void (*__thiscall p_ios_init)(ios*, streambuf*);
 static void (*__thiscall p_ios_dtor)(ios*);
+static void (*__cdecl p_ios_clrlock)(ios*);
+static void (*__cdecl p_ios_setlock)(ios*);
 
 /* Emulate a __thiscall */
 #ifdef __i386__
@@ -230,6 +232,8 @@ static BOOL init(void)
         SET(p_ios_assign, "??4ios@@IEAAAEAV0 at AEBV0@@Z");
         SET(p_ios_init, "?init at ios@@IEAAXPEAVstreambuf@@@Z");
         SET(p_ios_dtor, "??1ios@@UEAA at XZ");
+        SET(p_ios_clrlock, "?clrlock at ios@@QEAAXXZ");
+        SET(p_ios_setlock, "?setlock at ios@@QEAAXXZ");
     } else {
         p_operator_new = (void*)GetProcAddress(msvcrt, "??2 at YAPAXI@Z");
 
@@ -262,6 +266,8 @@ static BOOL init(void)
         SET(p_ios_assign, "??4ios@@IAEAAV0 at ABV0@@Z");
         SET(p_ios_init, "?init at ios@@IAEXPAVstreambuf@@@Z");
         SET(p_ios_dtor, "??1ios@@UAE at XZ");
+        SET(p_ios_clrlock, "?clrlock at ios@@QAAXXZ");
+        SET(p_ios_setlock, "?setlock at ios@@QAAXXZ");
     }
 
     init_thiscall_thunk();
@@ -893,6 +899,20 @@ static void test_ios(void)
     ok(ios_obj.fill == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.fill);
     ok(ios_obj.width == (char)0xab, "expected %d got %d\n", (char)0xab, ios_obj.width);
     ok(ios_obj.do_lock == 2, "expected 2 got %d\n", ios_obj.do_lock);
+
+    /* locking */
+    ios_obj.do_lock = 1;
+    p_ios_clrlock(&ios_obj);
+    ok(ios_obj.do_lock == 1, "expected 1 got %d\n", ios_obj.do_lock);
+    ios_obj.do_lock = 0;
+    p_ios_clrlock(&ios_obj);
+    ok(ios_obj.do_lock == 1, "expected 1 got %d\n", ios_obj.do_lock);
+    p_ios_setlock(&ios_obj);
+    ok(ios_obj.do_lock == 0, "expected 0 got %d\n", ios_obj.do_lock);
+    ios_obj.do_lock = -1;
+    p_ios_setlock(&ios_obj);
+    ok(ios_obj.do_lock == -2, "expected -2 got %d\n", ios_obj.do_lock);
+
     ios_obj.delbuf = 0;
     call_func1(p_ios_dtor, &ios_obj);
     ok(ios_obj.state == IOSTATE_badbit, "expected %x got %x\n", IOSTATE_badbit, ios_obj.state);
-- 
2.1.4




More information about the wine-patches mailing list