LW_VOID LwRtlWaitWorkItems( LW_IN PLW_THREAD_POOL pPool ) { WaitWorkItems(&pPool->WorkThreads); }
VOID DestroyWorkThreads( PLW_WORK_THREADS pThreads ) { size_t i = 0; if (pThreads->pWorkThreads) { WaitWorkItems(pThreads); LOCK_THREADS(pThreads); pThreads->bShutdown = TRUE; pthread_cond_broadcast(&pThreads->Event); for (i = 0; i < pThreads->ulWorkThreadCount; i++) { if (pThreads->pWorkThreads[i].Thread != INVALID_THREAD_HANDLE) { /* We must pthread_join() outside of the lock */ UNLOCK_THREADS(pThreads); pthread_join(pThreads->pWorkThreads[i].Thread, NULL); LOCK_THREADS(pThreads); } } UNLOCK_THREADS(pThreads); RtlMemoryFree(pThreads->pWorkThreads); } if (pThreads->bDestroyLock) { pthread_mutex_destroy(&pThreads->Lock); } if (pThreads->bDestroyEvent) { pthread_cond_destroy(&pThreads->Event); } }