Huw Davies : ole32/tests: Make the two reference marshalling thread more generic.
Alexandre Julliard
julliard at winehq.org
Thu Oct 24 13:18:56 CDT 2013
Module: wine
Branch: master
Commit: 61fb28de3f18d65609f9e26af883ffd5f55694db
URL: http://source.winehq.org/git/wine.git/?a=commit;h=61fb28de3f18d65609f9e26af883ffd5f55694db
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Oct 24 16:16:48 2013 +0100
ole32/tests: Make the two reference marshalling thread more generic.
---
dlls/ole32/tests/marshal.c | 56 +++++++++++++++++++++++--------------------
1 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c
index 48f3cea..3510aad 100644
--- a/dlls/ole32/tests/marshal.c
+++ b/dlls/ole32/tests/marshal.c
@@ -346,10 +346,10 @@ static DWORD start_host_object(IStream *stream, REFIID riid, IUnknown *object, M
/* asks thread to release the marshal data because it has to be done by the
* same thread that marshaled the interface in the first place. */
-static void release_host_object(DWORD tid)
+static void release_host_object(DWORD tid, WPARAM wp)
{
HANDLE event = CreateEventA(NULL, FALSE, FALSE, NULL);
- PostThreadMessageA(tid, RELEASEMARSHALDATA, 0, (LPARAM)event);
+ PostThreadMessageA(tid, RELEASEMARSHALDATA, wp, (LPARAM)event);
ok( !WaitForSingleObject(event, 10000), "wait timed out\n" );
CloseHandle(event);
}
@@ -1130,7 +1130,7 @@ static void test_tableweak_marshal_and_unmarshal_twice(void)
todo_wine
ok_more_than_one_lock();
IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL);
- release_host_object(tid);
+ release_host_object(tid, 0);
}
/* Without IExternalConnection this line is shows the difference between weak and strong table marshaling
@@ -1171,7 +1171,7 @@ static void test_tableweak_marshal_releasedata1(void)
/* release the remaining reference on the object by calling
* CoReleaseMarshalData in the hosting thread */
IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL);
- release_host_object(tid);
+ release_host_object(tid, 0);
ok_more_than_one_lock();
ok_non_zero_external_conn();
@@ -1224,7 +1224,7 @@ static void test_tableweak_marshal_releasedata2(void)
/* release the remaining reference on the object by calling
* CoReleaseMarshalData in the hosting thread */
IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL);
- release_host_object(tid);
+ release_host_object(tid, 0);
ok_no_locks();
@@ -1244,27 +1244,27 @@ static void test_tableweak_marshal_releasedata2(void)
end_host_object(tid, thread);
}
-struct weak_and_normal_marshal_data
+struct duo_marshal_data
{
- IStream *pStreamWeak;
- IStream *pStreamNormal;
+ MSHLFLAGS marshal_flags1, marshal_flags2;
+ IStream *pStream1, *pStream2;
HANDLE hReadyEvent;
HANDLE hQuitEvent;
};
-static DWORD CALLBACK weak_and_normal_marshal_thread_proc(void *p)
+static DWORD CALLBACK duo_marshal_thread_proc(void *p)
{
HRESULT hr;
- struct weak_and_normal_marshal_data *data = p;
+ struct duo_marshal_data *data = p;
HANDLE hQuitEvent = data->hQuitEvent;
MSG msg;
pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
- hr = CoMarshalInterface(data->pStreamWeak, &IID_IClassFactory, (IUnknown*)&Test_ClassFactory, MSHCTX_INPROC, NULL, MSHLFLAGS_TABLEWEAK);
+ hr = CoMarshalInterface(data->pStream1, &IID_IClassFactory, (IUnknown*)&Test_ClassFactory, MSHCTX_INPROC, NULL, data->marshal_flags1);
ok_ole_success(hr, "CoMarshalInterface");
- hr = CoMarshalInterface(data->pStreamNormal, &IID_IClassFactory, (IUnknown*)&Test_ClassFactory, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
+ hr = CoMarshalInterface(data->pStream2, &IID_IClassFactory, (IUnknown*)&Test_ClassFactory, MSHCTX_INPROC, NULL, data->marshal_flags2);
ok_ole_success(hr, "CoMarshalInterface");
/* force the message queue to be created before signaling parent thread */
@@ -1278,7 +1278,7 @@ static DWORD CALLBACK weak_and_normal_marshal_thread_proc(void *p)
{
if (msg.hwnd == NULL && msg.message == RELEASEMARSHALDATA)
{
- CoReleaseMarshalData(data->pStreamWeak);
+ CoReleaseMarshalData(msg.wParam == 1 ? data->pStream1 : data->pStream2);
SetEvent((HANDLE)msg.lParam);
}
else
@@ -1300,33 +1300,37 @@ static void test_tableweak_and_normal_marshal_and_unmarshal(void)
IUnknown *pProxyNormal = NULL;
DWORD tid;
HANDLE thread;
- struct weak_and_normal_marshal_data data;
+ struct duo_marshal_data data;
cLocks = 0;
external_connections = 0;
data.hReadyEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
data.hQuitEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
- hr = CreateStreamOnHGlobal(NULL, TRUE, &data.pStreamWeak);
+ data.marshal_flags1 = MSHLFLAGS_TABLEWEAK;
+ data.marshal_flags2 = MSHLFLAGS_NORMAL;
+ hr = CreateStreamOnHGlobal(NULL, TRUE, &data.pStream1);
ok_ole_success(hr, CreateStreamOnHGlobal);
- hr = CreateStreamOnHGlobal(NULL, TRUE, &data.pStreamNormal);
+ hr = CreateStreamOnHGlobal(NULL, TRUE, &data.pStream2);
ok_ole_success(hr, CreateStreamOnHGlobal);
- thread = CreateThread(NULL, 0, weak_and_normal_marshal_thread_proc, &data, 0, &tid);
+ thread = CreateThread(NULL, 0, duo_marshal_thread_proc, &data, 0, &tid);
ok( !WaitForSingleObject(data.hReadyEvent, 10000), "wait timed out\n" );
CloseHandle(data.hReadyEvent);
ok_more_than_one_lock();
ok_non_zero_external_conn();
- IStream_Seek(data.pStreamWeak, ullZero, STREAM_SEEK_SET, NULL);
- hr = CoUnmarshalInterface(data.pStreamWeak, &IID_IClassFactory, (void **)&pProxyWeak);
+ /* weak */
+ IStream_Seek(data.pStream1, ullZero, STREAM_SEEK_SET, NULL);
+ hr = CoUnmarshalInterface(data.pStream1, &IID_IClassFactory, (void **)&pProxyWeak);
ok_ole_success(hr, CoUnmarshalInterface);
ok_more_than_one_lock();
- IStream_Seek(data.pStreamNormal, ullZero, STREAM_SEEK_SET, NULL);
- hr = CoUnmarshalInterface(data.pStreamNormal, &IID_IClassFactory, (void **)&pProxyNormal);
+ /* normal */
+ IStream_Seek(data.pStream2, ullZero, STREAM_SEEK_SET, NULL);
+ hr = CoUnmarshalInterface(data.pStream2, &IID_IClassFactory, (void **)&pProxyNormal);
ok_ole_success(hr, CoUnmarshalInterface);
ok_more_than_one_lock();
@@ -1347,13 +1351,13 @@ static void test_tableweak_and_normal_marshal_and_unmarshal(void)
{
todo_wine
ok_more_than_one_lock();
- IStream_Seek(data.pStreamWeak, ullZero, STREAM_SEEK_SET, NULL);
- release_host_object(tid);
+ IStream_Seek(data.pStream1, ullZero, STREAM_SEEK_SET, NULL);
+ release_host_object(tid, 1);
}
ok_no_locks();
- IStream_Release(data.pStreamWeak);
- IStream_Release(data.pStreamNormal);
+ IStream_Release(data.pStream1);
+ IStream_Release(data.pStream2);
SetEvent(data.hQuitEvent);
ok( !WaitForSingleObject(thread, 10000), "wait timed out\n" );
@@ -1403,7 +1407,7 @@ static void test_tablestrong_marshal_and_unmarshal_twice(void)
/* release the remaining reference on the object by calling
* CoReleaseMarshalData in the hosting thread */
IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL);
- release_host_object(tid);
+ release_host_object(tid, 0);
IStream_Release(pStream);
ok_no_locks();
More information about the wine-cvs
mailing list