diff options
Diffstat (limited to 'otherlibs/win32unix/winworker.c')
-rw-r--r-- | otherlibs/win32unix/winworker.c | 62 |
1 files changed, 22 insertions, 40 deletions
diff --git a/otherlibs/win32unix/winworker.c b/otherlibs/win32unix/winworker.c index aa83684b2..57f95a9ae 100644 --- a/otherlibs/win32unix/winworker.c +++ b/otherlibs/win32unix/winworker.c @@ -47,7 +47,6 @@ LPWORKER lpWorkers = NULL; DWORD nWorkersCurrent = 0; DWORD nWorkersMax = 0; HANDLE hWorkersMutex = INVALID_HANDLE_VALUE; -HANDLE hWorkerHeap = INVALID_HANDLE_VALUE; DWORD WINAPI worker_wait (LPVOID _data) { @@ -57,7 +56,7 @@ DWORD WINAPI worker_wait (LPVOID _data) lpWorker = (LPWORKER )_data; bExit = FALSE; - DBUG_PRINT("Worker %x starting", lpWorker); + DEBUG_PRINT("Worker %x starting", lpWorker); while ( !bExit && SignalObjectAndWait( @@ -66,7 +65,7 @@ DWORD WINAPI worker_wait (LPVOID _data) INFINITE, TRUE) == WAIT_OBJECT_0) { - DBUG_PRINT("Worker %x running", lpWorker); + DEBUG_PRINT("Worker %x running", lpWorker); switch (lpWorker->ECommand) { case WORKER_CMD_NONE: @@ -86,7 +85,7 @@ DWORD WINAPI worker_wait (LPVOID _data) break; } }; - DBUG_PRINT("Worker %x exiting", lpWorker); + DEBUG_PRINT("Worker %x exiting", lpWorker); return 0; } @@ -95,13 +94,7 @@ LPWORKER worker_new (void) { LPWORKER lpWorker = NULL; - if (!HeapLock(hWorkerHeap)) - { - win32_maperr(GetLastError()); - uerror("worker_new", Nothing); - }; - lpWorker = (LPWORKER)HeapAlloc(hWorkerHeap, 0, sizeof(WORKER)); - HeapUnlock(hWorkerHeap); + lpWorker = (LPWORKER)caml_stat_alloc(sizeof(WORKER)); list_init((LPLIST)lpWorker); lpWorker->hJobStarted = CreateEvent(NULL, TRUE, FALSE, NULL); lpWorker->hJobStop = CreateEvent(NULL, TRUE, FALSE, NULL); @@ -124,14 +117,14 @@ LPWORKER worker_new (void) void worker_free (LPWORKER lpWorker) { /* Wait for termination of the worker */ - DBUG_PRINT("Shutting down worker %x", lpWorker); + DEBUG_PRINT("Shutting down worker %x", lpWorker); WaitForSingleObject(lpWorker->hWorkerReady, INFINITE); lpWorker->ECommand = WORKER_CMD_STOP; SetEvent(lpWorker->hCommandReady); WaitForSingleObject(lpWorker->hThread, INFINITE); /* Free resources */ - DBUG_PRINT("Freeing resources of worker %x", lpWorker); + DEBUG_PRINT("Freeing resources of worker %x", lpWorker); if (lpWorker->hThread != INVALID_HANDLE_VALUE) { CloseHandle(lpWorker->hThread); @@ -171,13 +164,7 @@ void worker_free (LPWORKER lpWorker) lpWorker->hCommandReady = INVALID_HANDLE_VALUE; } - if (!HeapLock(hWorkerHeap)) - { - win32_maperr(GetLastError()); - uerror("worker_new", Nothing); - }; - HeapFree(hWorkerHeap, 0, lpWorker); - HeapUnlock(hWorkerHeap); + caml_stat_free(lpWorker); }; LPWORKER worker_pop (void) @@ -193,7 +180,7 @@ LPWORKER worker_pop (void) } nWorkersCurrent++; nWorkersMax = (nWorkersCurrent > nWorkersMax ? nWorkersCurrent : nWorkersMax); - DBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", + DEBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", nWorkersCurrent, nWorkersMax, list_length((LPLIST)lpWorkers)); @@ -224,16 +211,16 @@ void worker_push(LPWORKER lpWorker) bFreeWorker = TRUE; WaitForSingleObject(hWorkersMutex, INFINITE); - DBUG_PRINT("Testing if we are under the maximum number of running workers"); + DEBUG_PRINT("Testing if we are under the maximum number of running workers"); if (list_length((LPLIST)lpWorkers) < THREAD_WORKERS_MAX) { - DBUG_PRINT("Saving this worker for future use"); - DBUG_PRINT("Next: %x", ((LPLIST)lpWorker)->lpNext); + DEBUG_PRINT("Saving this worker for future use"); + DEBUG_PRINT("Next: %x", ((LPLIST)lpWorker)->lpNext); lpWorkers = (LPWORKER)list_concat((LPLIST)lpWorker, (LPLIST)lpWorkers); bFreeWorker = FALSE; }; nWorkersCurrent--; - DBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", + DEBUG_PRINT("Workers running current/runnning max/waiting: %d/%d/%d", nWorkersCurrent, nWorkersMax, list_length((LPLIST)lpWorkers)); @@ -241,7 +228,7 @@ void worker_push(LPWORKER lpWorker) if (bFreeWorker) { - DBUG_PRINT("Freeing worker %x", lpWorker); + DEBUG_PRINT("Freeing worker %x", lpWorker); worker_free(lpWorker); } } @@ -253,16 +240,11 @@ void worker_init (void) /* Init a shared variable. The only way to ensure that no other worker will be at the same point is to use a critical section. */ - DBUG_PRINT("Allocating mutex for workers"); + DEBUG_PRINT("Allocating mutex for workers"); if (hWorkersMutex == INVALID_HANDLE_VALUE) { hWorkersMutex = CreateMutex(NULL, FALSE, NULL); } - - if (hWorkerHeap == INVALID_HANDLE_VALUE) - { - hWorkerHeap = HeapCreate(0, sizeof(WORKER) * THREAD_WORKERS_MAX * 4, 0); - } } void worker_cleanup(void) @@ -276,13 +258,13 @@ void worker_cleanup(void) if (hWorkersMutex != INVALID_HANDLE_VALUE) { WaitForSingleObject(hWorkersMutex, INFINITE); - DBUG_PRINT("Freeing global resource of workers"); + DEBUG_PRINT("Freeing global resource of workers"); /* Empty the queue of worker worker */ while (lpWorkers != NULL) { ReleaseMutex(hWorkersMutex); lpWorker = worker_pop(); - DBUG_PRINT("Freeing worker %x", lpWorker); + DEBUG_PRINT("Freeing worker %x", lpWorker); WaitForSingleObject(hWorkersMutex, INFINITE); worker_free(lpWorker); }; @@ -298,18 +280,18 @@ LPWORKER worker_job_submit (WORKERFUNC f, void *user_data) { LPWORKER lpWorker = worker_pop(); - DBUG_PRINT("Waiting for worker to be ready"); + DEBUG_PRINT("Waiting for worker to be ready"); enter_blocking_section(); WaitForSingleObject(lpWorker->hWorkerReady, INFINITE); ResetEvent(lpWorker->hWorkerReady); leave_blocking_section(); - DBUG_PRINT("Worker is ready"); + DEBUG_PRINT("Worker is ready"); lpWorker->hJobFunc = f; lpWorker->lpJobUserData = user_data; lpWorker->ECommand = WORKER_CMD_EXEC; - DBUG_PRINT("Call worker (func: %x, worker: %x)", f, lpWorker); + DEBUG_PRINT("Call worker (func: %x, worker: %x)", f, lpWorker); SetEvent(lpWorker->hCommandReady); return (LPWORKER)lpWorker; @@ -322,14 +304,14 @@ HANDLE worker_job_event_done (LPWORKER lpWorker) void worker_job_stop (LPWORKER lpWorker) { - DBUG_PRINT("Sending stop signal to worker %x", lpWorker); + DEBUG_PRINT("Sending stop signal to worker %x", lpWorker); SetEvent(lpWorker->hJobStop); - DBUG_PRINT("Signal sent to worker %x", lpWorker); + DEBUG_PRINT("Signal sent to worker %x", lpWorker); } void worker_job_finish (LPWORKER lpWorker) { - DBUG_PRINT("Finishing call of worker %x", lpWorker); + DEBUG_PRINT("Finishing call of worker %x", lpWorker); enter_blocking_section(); WaitForSingleObject(lpWorker->hJobDone, INFINITE); leave_blocking_section(); |