| 
20 | 20 | #ifdef _WIN32  | 
21 | 21 | 
 
  | 
22 | 22 | #define WIN32_LEAN_AND_MEAN  | 
 | 23 | + | 
 | 24 | +#include <assert.h>  | 
 | 25 | +#include <windows.h>  | 
 | 26 | + | 
 | 27 | +#include <mutex>  | 
 | 28 | + | 
23 | 29 | #include "ftd2xx.h"  | 
24 | 30 | #include "ftdi/abstract.h"  | 
25 | 31 | 
 
  | 
26 | 32 | static std::vector<PCSX::FTDI::Device> s_devices;  | 
27 | 33 | 
 
  | 
28 |  | -void PCSX::FTDI::DeviceList::scan() {  | 
 | 34 | +void PCSX::FTDI::Devices::scan() {  | 
29 | 35 |     FT_STATUS status;  | 
30 | 36 |     DWORD numDevs = 0;  | 
31 | 37 | 
 
  | 
@@ -55,6 +61,40 @@ void PCSX::FTDI::DeviceList::scan() {  | 
55 | 61 |     delete[] nodes;  | 
56 | 62 | }  | 
57 | 63 | 
 
  | 
58 |  | -const std::vector<PCSX::FTDI::Device>& PCSX::FTDI::DeviceList::get() { return s_devices; }  | 
 | 64 | +const std::vector<PCSX::FTDI::Device>& PCSX::FTDI::Devices::get() { return s_devices; }  | 
 | 65 | + | 
 | 66 | +static HANDLE s_thread = nullptr;  | 
 | 67 | +static HANDLE s_exitEvent = nullptr;  | 
 | 68 | +static bool s_threadRunning = false;  | 
 | 69 | + | 
 | 70 | +static DWORD WINAPI threadProc(LPVOID parameter) {  | 
 | 71 | +    bool exitting = false;  | 
 | 72 | +    SetThreadDescription(GetCurrentThread(), L"abstract ftd2xx thread");  | 
 | 73 | +    while (!exitting) {  | 
 | 74 | +        HANDLE objects[1];  | 
 | 75 | +        objects[0] = s_exitEvent;  | 
 | 76 | +        DWORD idx = WaitForMultipleObjects(1, objects, FALSE, INFINITE);  | 
 | 77 | +        exitting = idx == WAIT_OBJECT_0;  | 
 | 78 | +    }  | 
 | 79 | +    CloseHandle(s_exitEvent);  | 
 | 80 | +    s_exitEvent = nullptr;  | 
 | 81 | +    s_threadRunning = false;  | 
 | 82 | +    return 0;  | 
 | 83 | +}  | 
 | 84 | + | 
 | 85 | +void PCSX::FTDI::Devices::startThread() {  | 
 | 86 | +    assert(!s_threadRunning);  | 
 | 87 | +    s_exitEvent = CreateEvent(nullptr, FALSE, FALSE, L"abstract ftd2xx exit event");  | 
 | 88 | +    s_threadRunning = true;  | 
 | 89 | +    s_thread = CreateThread(nullptr, 0, threadProc, nullptr, 0, nullptr);  | 
 | 90 | +}  | 
 | 91 | + | 
 | 92 | +void PCSX::FTDI::Devices::stopThread() {  | 
 | 93 | +    assert(s_threadRunning);  | 
 | 94 | +    SetEvent(s_exitEvent);  | 
 | 95 | +    WaitForSingleObject(s_thread, INFINITE);  | 
 | 96 | +    s_thread = nullptr;  | 
 | 97 | +    assert(!s_threadRunning);  | 
 | 98 | +}  | 
59 | 99 | 
 
  | 
60 | 100 | #endif  | 
0 commit comments