From a3f03e1cd2ef8517645d6242ab5c16ed005405fb Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 13 Nov 2002 19:40:50 +0000 Subject: [PATCH] Add a counter to keep track of the number of outstanding async requests. This gets around a problem where a SetEvent could be called before a previous event had been dealt with. --- dlls/wininet/internet.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index f8fe153eb97..2a31c3a2e84 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -89,6 +89,7 @@ VOID INTERNET_ExecuteWork(); DWORD g_dwTlsErrIndex = TLS_OUT_OF_INDEXES; DWORD dwNumThreads; DWORD dwNumIdleThreads; +DWORD dwNumJobs; HANDLE hEventArray[2]; #define hQuitEvent hEventArray[0] #define hWorkEvent hEventArray[1] @@ -127,6 +128,7 @@ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) dwNumThreads = 0; dwNumIdleThreads = 0; + dwNumJobs = 0; case DLL_THREAD_ATTACH: { @@ -1674,6 +1676,10 @@ DWORD INTERNET_WorkerThreadFunc(LPVOID *lpvParam) while (1) { + if(dwNumJobs > 0) { + INTERNET_ExecuteWork(); + continue; + } dwWaitRes = WaitForMultipleObjects(2, hEventArray, FALSE, MAX_IDLE_WORKER); if (dwWaitRes == WAIT_OBJECT_0 + 1) @@ -1724,6 +1730,7 @@ BOOL INTERNET_InsertWorkRequest(LPWORKREQUEST lpWorkRequest) LeaveCriticalSection(&csQueue); bSuccess = TRUE; + InterlockedIncrement(&dwNumJobs); } return bSuccess; @@ -1762,6 +1769,7 @@ BOOL INTERNET_GetWorkRequest(LPWORKREQUEST lpWorkRequest) memcpy(lpWorkRequest, lpRequest, sizeof(WORKREQUEST)); HeapFree(GetProcessHeap(), 0, lpRequest); bSuccess = TRUE; + InterlockedDecrement(&dwNumJobs); } return bSuccess; @@ -1824,6 +1832,7 @@ VOID INTERNET_ExecuteWork() if (INTERNET_GetWorkRequest(&workRequest)) { + TRACE("Got work %d\n", workRequest.asyncall); switch (workRequest.asyncall) { case FTPPUTFILEA: