Cleaned up thread pool initialisation
@@ -105,6 +105,7 @@ static void threads_close(void* thread)
static BOOL InitializeThreadpool(PTP_POOL pool)
{
+ BOOL rc = FALSE;
int index;
wObject* obj;
HANDLE thread;
@@ -116,16 +117,16 @@ static BOOL InitializeThreadpool(PTP_POOL pool)
pool->Maximum = 500;
if (!(pool->PendingQueue = Queue_New(TRUE, -1, -1)))
- goto fail_queue_new;
+ goto fail;
if (!(pool->WorkComplete = CountdownEvent_New(0)))
- goto fail_countdown_event;
+ goto fail;
if (!(pool->TerminateEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
- goto fail_terminate_event;
+ goto fail;
if (!(pool->Threads = ArrayList_New(TRUE)))
- goto fail_thread_array;
+ goto fail;
obj = ArrayList_Object(pool->Threads);
obj->fnObjectFree = threads_close;
@@ -134,34 +135,23 @@ static BOOL InitializeThreadpool(PTP_POOL pool)
{
if (!(thread = CreateThread(NULL, 0, thread_pool_work_func, (void*)pool, 0, NULL)))
{
- goto fail_create_threads;
+ goto fail;
}
if (!ArrayList_Append(pool->Threads, thread))
- goto fail_create_threads;
+ {
+ CloseHandle(thread);
+ goto fail;
+ }
}
- return TRUE;
-
-fail_create_threads:
- SetEvent(pool->TerminateEvent);
- ArrayList_Free(pool->Threads);
- pool->Threads = NULL;
-fail_thread_array:
- CloseHandle(pool->TerminateEvent);
- pool->TerminateEvent = NULL;
-fail_terminate_event:
- CountdownEvent_Free(pool->WorkComplete);
- pool->WorkComplete = NULL;
-fail_countdown_event:
- Queue_Free(pool->PendingQueue);
- pool->WorkComplete = NULL;
-fail_queue_new:
+ rc = TRUE;
- return FALSE;
+fail:
+ return rc;
}
-PTP_POOL GetDefaultThreadpool()
+PTP_POOL GetDefaultThreadpool(void)
{
PTP_POOL pool = NULL;
@@ -188,7 +178,7 @@ PTP_POOL winpr_CreateThreadpool(PVOID reserved)
if (!InitializeThreadpool(pool))
{
- free(pool);
+ winpr_CloseThreadpool(pool);
return NULL;
}
@@ -212,18 +202,14 @@ VOID winpr_CloseThreadpool(PTP_POOL ptpp)
CountdownEvent_Free(ptpp->WorkComplete);
CloseHandle(ptpp->TerminateEvent);
- if (ptpp == &DEFAULT_POOL)
{
- ptpp->Threads = NULL;
- ptpp->PendingQueue = NULL;
- ptpp->WorkComplete = NULL;
- ptpp->TerminateEvent = NULL;
+ TP_POOL empty = { 0 };
+ *ptpp = empty;
}
- else
- {
+
+ if (ptpp != &DEFAULT_POOL)
free(ptpp);
}
-}
BOOL winpr_SetThreadpoolThreadMinimum(PTP_POOL ptpp, DWORD cthrdMic)
{
@@ -243,8 +229,11 @@ BOOL winpr_SetThreadpoolThreadMinimum(PTP_POOL ptpp, DWORD cthrdMic)
}
if (!ArrayList_Append(ptpp->Threads, thread))
+ {
+ CloseHandle(thread);
return FALSE;
}
+ }
return TRUE;
}
