Jacek Caban : urlmon/tests: Use the same thread for both connections in redirect tests.
Alexandre Julliard
julliard at winehq.org
Tue May 22 15:37:13 CDT 2018
Module: wine
Branch: master
Commit: 749dbd81b1cbd24e5ec3df0ce97712c1e9945c9e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=749dbd81b1cbd24e5ec3df0ce97712c1e9945c9e
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue May 22 10:13:52 2018 +0200
urlmon/tests: Use the same thread for both connections in redirect tests.
Fixes a race spotted by Zebediah Figura.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/urlmon/tests/protocol.c | 58 +++++++++++++++++++++++---------------------
1 file changed, 31 insertions(+), 27 deletions(-)
diff --git a/dlls/urlmon/tests/protocol.c b/dlls/urlmon/tests/protocol.c
index 78b882b..f5543fe 100644
--- a/dlls/urlmon/tests/protocol.c
+++ b/dlls/urlmon/tests/protocol.c
@@ -156,7 +156,7 @@ static PROTOCOLDATA protocoldata, *pdata, continue_protdata;
static DWORD prot_read, filter_state, http_post_test, thread_id;
static BOOL security_problem, test_async_req, impl_protex;
static BOOL async_read_pending, mimefilter_test, direct_read, wait_for_switch, emulate_prot, short_read, test_abort;
-static BOOL empty_file, no_mime, bind_from_cache, file_with_hash;
+static BOOL empty_file, no_mime, bind_from_cache, file_with_hash, reuse_protocol_thread;
enum {
STATE_CONNECTING,
@@ -1611,40 +1611,41 @@ static HRESULT WINAPI ProtocolEmul_QueryInterface(IInternetProtocolEx *iface, RE
static DWORD WINAPI thread_proc(PVOID arg)
{
- BOOL redirect_only = redirect_on_continue;
+ BOOL redirect = redirect_on_continue;
HRESULT hres;
memset(&protocoldata, -1, sizeof(protocoldata));
- prot_state = 0;
+ while(1) {
+ prot_state = 0;
- SET_EXPECT(ReportProgress_FINDINGRESOURCE);
- hres = IInternetProtocolSink_ReportProgress(binding_sink,
- BINDSTATUS_FINDINGRESOURCE, hostW);
- CHECK_CALLED(ReportProgress_FINDINGRESOURCE);
- ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
+ SET_EXPECT(ReportProgress_FINDINGRESOURCE);
+ hres = IInternetProtocolSink_ReportProgress(binding_sink,
+ BINDSTATUS_FINDINGRESOURCE, hostW);
+ CHECK_CALLED(ReportProgress_FINDINGRESOURCE);
+ ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
- SET_EXPECT(ReportProgress_CONNECTING);
- hres = IInternetProtocolSink_ReportProgress(binding_sink,
- BINDSTATUS_CONNECTING, winehq_ipW);
- CHECK_CALLED(ReportProgress_CONNECTING);
- ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
+ SET_EXPECT(ReportProgress_CONNECTING);
+ hres = IInternetProtocolSink_ReportProgress(binding_sink,
+ BINDSTATUS_CONNECTING, winehq_ipW);
+ CHECK_CALLED(ReportProgress_CONNECTING);
+ ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
- SET_EXPECT(ReportProgress_SENDINGREQUEST);
- hres = IInternetProtocolSink_ReportProgress(binding_sink,
- BINDSTATUS_SENDINGREQUEST, NULL);
- CHECK_CALLED(ReportProgress_SENDINGREQUEST);
- ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
+ SET_EXPECT(ReportProgress_SENDINGREQUEST);
+ hres = IInternetProtocolSink_ReportProgress(binding_sink,
+ BINDSTATUS_SENDINGREQUEST, NULL);
+ CHECK_CALLED(ReportProgress_SENDINGREQUEST);
+ ok(hres == S_OK, "ReportProgress failed: %08x\n", hres);
- prot_state = 1;
- SET_EXPECT(Switch);
- hres = IInternetProtocolSink_Switch(binding_sink, &protocoldata);
- CHECK_CALLED(Switch);
- ok(hres == S_OK, "Switch failed: %08x\n", hres);
+ prot_state = 1;
+ SET_EXPECT(Switch);
+ hres = IInternetProtocolSink_Switch(binding_sink, &protocoldata);
+ CHECK_CALLED(Switch);
+ ok(hres == S_OK, "Switch failed: %08x\n", hres);
- if(redirect_only) {
- prot_state = 0;
- return 0;
+ if(!redirect)
+ break;
+ redirect = FALSE;
}
if(!short_read) {
@@ -1799,7 +1800,8 @@ static void protocol_start(IInternetProtocolSink *pOIProtSink, IInternetBindInfo
IServiceProvider_Release(service_provider);
- CreateThread(NULL, 0, thread_proc, NULL, 0, &tid);
+ if(!reuse_protocol_thread)
+ CreateThread(NULL, 0, thread_proc, NULL, 0, &tid);
return;
}
@@ -1909,6 +1911,7 @@ static HRESULT WINAPI ProtocolEmul_Continue(IInternetProtocolEx *iface,
if(redirect_on_continue) {
redirect_on_continue = FALSE;
+ reuse_protocol_thread = TRUE;
if(bindinfo_options & BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS)
SET_EXPECT(Redirect);
@@ -2632,6 +2635,7 @@ static void init_test(int prot, DWORD flags)
bind_from_cache = (flags & TEST_FROMCACHE) != 0;
file_with_hash = FALSE;
security_problem = FALSE;
+ reuse_protocol_thread = FALSE;
bindinfo_options = 0;
if(flags & TEST_DISABLEAUTOREDIRECT)
More information about the wine-cvs
mailing list