1#include "ATPPSPBridge.h"
9 constexpr wchar_t ATP_EVENT[] = L
"PSPBridge_ATPReady";
10 constexpr wchar_t PSP_EVENT[] = L
"PSPBridge_PSPReady";
11 constexpr wchar_t SHM_NAME[] = L
"PSPBridgeSharedMemory";
16 constexpr char ATP_EVENT[] =
"/PSPBridge_ATPReady";
17 constexpr char PSP_EVENT[] =
"/PSPBridge_PSPReady";
18 constexpr char SHM_NAME[] =
"/PSPBridgeSharedMemory";
23ATPPSPBridge::ATPPSPBridge()
27ATPPSPBridge::~ATPPSPBridge()
32bool ATPPSPBridge::Connect(
unsigned timeout,
unsigned retryInterval)
35 wxProgressDialog wait(_(
"Connecting"), _(
"Connecting to ATP, please wait."), timeout,
nullptr, wxPD_AUTO_HIDE | wxPD_SMOOTH | wxPD_CAN_ABORT);
39 if (!wait.Update(sw.Time()))
47 m_hATPReady = OpenEventW(SYNCHRONIZE, FALSE, ATP_EVENT);
52 m_hPSPReady = OpenEventW(EVENT_MODIFY_STATE | SYNCHRONIZE, FALSE, PSP_EVENT);
57 m_hMapFile = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, SHM_NAME);
61 m_data =
static_cast<SharedData*
>(MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0));
72 m_hATPReady = sem_open(ATP_EVENT, 0);
74 if (m_hATPReady != SEM_FAILED)
77 m_hPSPReady = sem_open(PSP_EVENT, 0);
79 if (m_hPSPReady != SEM_FAILED)
82 m_hMapFile = shm_open(SHM_NAME, O_RDWR, 0);
88 if (fstat(m_hMapFile, &st) == 0)
89 m_data =
static_cast<SharedData*
>(mmap(
nullptr, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, m_hMapFile, 0));
91 if (m_data != MAP_FAILED)
103 if (sw.Time() >= timeout)
106 wxMilliSleep(retryInterval);
111void ATPPSPBridge::Disconnect()
116 UnmapViewOfFile(m_data);
121 CloseHandle(m_hMapFile);
122 m_hMapFile =
nullptr;
126 CloseHandle(m_hATPReady);
127 m_hATPReady =
nullptr;
131 CloseHandle(m_hPSPReady);
132 m_hPSPReady =
nullptr;
139 if (m_hMapFile >= 0 && fstat(m_hMapFile, &st) == 0)
140 munmap(m_data, st.st_size);
145 if (m_hMapFile >= 0) {
150 if (m_hATPReady != SEM_FAILED) {
151 sem_close(m_hATPReady);
152 m_hATPReady = SEM_FAILED;
155 if (m_hPSPReady != SEM_FAILED) {
156 sem_close(m_hPSPReady);
157 m_hPSPReady = SEM_FAILED;
164bool ATPPSPBridge::WaitATP()
173 DWORD ret = WaitForSingleObject(m_hATPReady, 100);
183 if (m_atpPid != 0 && !wxProcess::Exists(m_atpPid))
194 if (m_hATPReady == SEM_FAILED)
200 if (clock_gettime(CLOCK_REALTIME, &ts) != 0)
203 ts.tv_nsec += 100000000;
205 if (ts.tv_nsec >= 1000000000)
208 ts.tv_nsec -= 1000000000;
211 if (sem_timedwait(m_hATPReady, &ts) == 0)
214 if (errno != ETIMEDOUT)
218 if (m_atpPid != 0 && !wxProcess::Exists(m_atpPid))
225bool ATPPSPBridge::ReleaseATP()
232 return SetEvent(m_hPSPReady) != FALSE;
236 if (m_hPSPReady == SEM_FAILED)
239 return sem_post(m_hPSPReady) == 0;
244SharedData& ATPPSPBridge::GetSharedData()
const
249bool ATPPSPBridge::IsConnected()
const
251 return m_data !=
nullptr;