From 1d416ff387ec0eedc9a8ee57ed97e072140d0601 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 5 Sep 2013 13:38:47 +0200 Subject: [PATCH] Fixed thread handling. --- channels/drive/client/drive_main.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/channels/drive/client/drive_main.c b/channels/drive/client/drive_main.c index d4baee68c..809123290 100644 --- a/channels/drive/client/drive_main.c +++ b/channels/drive/client/drive_main.c @@ -633,17 +633,18 @@ static void drive_process_irp_list(DRIVE_DEVICE* disk) static void* drive_thread_func(void* arg) { DRIVE_DEVICE* disk = (DRIVE_DEVICE*) arg; + HANDLE hdl[] = {disk->irpEvent, disk->stopEvent}; while (1) { - WaitForSingleObject(disk->irpEvent, INFINITE); - - if (WaitForSingleObject(disk->stopEvent, 0) == WAIT_OBJECT_0) + DWORD rc = WaitForMultipleObjects(2, hdl, FALSE, INFINITE); + if (rc == WAIT_OBJECT_0 + 1) break; ResetEvent(disk->irpEvent); drive_process_irp_list(disk); } + ExitThread(0); return NULL; } @@ -664,8 +665,10 @@ static void drive_free(DEVICE* device) DRIVE_DEVICE* disk = (DRIVE_DEVICE*) device; SetEvent(disk->stopEvent); + WaitForSingleObject(disk->thread, INFINITE); CloseHandle(disk->thread); CloseHandle(disk->irpEvent); + CloseHandle(disk->stopEvent); while ((irp = (IRP*) InterlockedPopEntrySList(disk->pIrpList)) != NULL) irp->Discard(irp); @@ -727,7 +730,7 @@ void drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, char* pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) disk); - ResumeThread(disk->thread); + ResumeThread(disk->thread); } }