[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