[1/7] msvcirt: Implement ios locking control (resend)

Iván Matellanes matellanesivan at gmail.com
Mon Jul 13 14:39:00 CDT 2015


Resending, for some reason the testbot failed to apply these last time.
---
 dlls/msvcirt/msvcirt.c       | 15 +++++++++++----
 dlls/msvcirt/tests/msvcirt.c | 29 +++++++++++++++++++++++++++--
 2 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index c740049..48fd682 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -854,7 +854,11 @@ 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++;
+    if (this->sb)
+        streambuf_clrlock(this->sb);
 }
 
 /* ?delbuf at ios@@QAEXH at Z */
@@ -1002,8 +1006,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 */
@@ -1081,7 +1085,10 @@ 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--;
+    if (this->sb)
+        streambuf_setlock(this->sb);
 }
 
 /* ?sync_with_stdio at ios@@SAXXZ */
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index bb5a5ed..62e1be9 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();
@@ -861,7 +867,6 @@ static void test_ios(void)
     call_func2(p_ios_init, &ios_obj, psb);
     ok(ios_obj.sb == psb, "expected %p got %p\n", psb, ios_obj.sb);
     ok(ios_obj.state == 0x8, "expected %x got %x\n", 0x8, ios_obj.state);
-    ios_obj.delbuf = 1;
     call_func1(p_ios_dtor, &ios_obj);
 
     /* copy constructor */
@@ -895,7 +900,27 @@ 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);
-    ios_obj.delbuf = 0;
+
+    /* locking */
+    ios_obj.sb = psb;
+    ios_obj.do_lock = 1;
+    ios_obj.sb->do_lock = 0;
+    p_ios_clrlock(&ios_obj);
+    ok(ios_obj.do_lock == 1, "expected 1 got %d\n", ios_obj.do_lock);
+    ok(ios_obj.sb->do_lock == 1, "expected 1 got %d\n", ios_obj.sb->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);
+    ok(ios_obj.sb->do_lock == 1, "expected 1 got %d\n", ios_obj.sb->do_lock);
+    p_ios_setlock(&ios_obj);
+    ok(ios_obj.do_lock == 0, "expected 0 got %d\n", ios_obj.do_lock);
+    ok(ios_obj.sb->do_lock == 0, "expected 0 got %d\n", ios_obj.sb->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);
+    ok(ios_obj.sb->do_lock == -1, "expected -1 got %d\n", ios_obj.sb->do_lock);
+
+    ios_obj.delbuf = 1;
     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