36 |
|
#define USECS2TICKS(USECS) (((uint64)(USECS) * frequency) / 1000000) |
37 |
|
#define TICKS2USECS(TICKS) (((uint64)(TICKS) * 1000000) / frequency) |
38 |
|
|
39 |
+ |
// From main_windows.cpp |
40 |
+ |
extern HANDLE emul_thread; |
41 |
+ |
|
42 |
|
// Global variables |
43 |
|
static uint32 frequency; // CPU frequency in Hz (< 4 GHz) |
44 |
|
static tm_time_t mac_boot_ticks; |
204 |
|
* Suspend emulator thread, virtual CPU in idle mode |
205 |
|
*/ |
206 |
|
|
207 |
+ |
struct idle_sentinel { |
208 |
+ |
idle_sentinel(); |
209 |
+ |
~idle_sentinel(); |
210 |
+ |
}; |
211 |
+ |
static idle_sentinel idle_sentinel; |
212 |
+ |
|
213 |
+ |
static int idle_sem_ok = -1; |
214 |
+ |
static HANDLE idle_sem = NULL; |
215 |
+ |
|
216 |
+ |
static HANDLE idle_lock = NULL; |
217 |
+ |
#define LOCK_IDLE WaitForSingleObject(idle_lock, INFINITE) |
218 |
+ |
#define UNLOCK_IDLE ReleaseMutex(idle_lock) |
219 |
+ |
|
220 |
+ |
idle_sentinel::idle_sentinel() |
221 |
+ |
{ |
222 |
+ |
LOCK_IDLE; |
223 |
+ |
idle_sem_ok = 1; |
224 |
+ |
if ((idle_sem = CreateSemaphore(0, 0, 1, NULL)) == NULL) |
225 |
+ |
idle_sem_ok = 0; |
226 |
+ |
if ((idle_lock = CreateMutex(NULL, FALSE, NULL)) == NULL) |
227 |
+ |
idle_sem_ok = 0; |
228 |
+ |
UNLOCK_IDLE; |
229 |
+ |
} |
230 |
+ |
|
231 |
+ |
idle_sentinel::~idle_sentinel() |
232 |
+ |
{ |
233 |
+ |
if (idle_lock) { |
234 |
+ |
ReleaseMutex(idle_lock); |
235 |
+ |
CloseHandle(idle_lock); |
236 |
+ |
} |
237 |
+ |
if (idle_sem) { |
238 |
+ |
ReleaseSemaphore(idle_sem, 1, NULL); |
239 |
+ |
CloseHandle(idle_sem); |
240 |
+ |
} |
241 |
+ |
} |
242 |
+ |
|
243 |
|
void idle_wait(void) |
244 |
|
{ |
245 |
+ |
LOCK_IDLE; |
246 |
+ |
if (idle_sem_ok > 0) { |
247 |
+ |
idle_sem_ok++; |
248 |
+ |
UNLOCK_IDLE; |
249 |
+ |
WaitForSingleObject(idle_sem, INFINITE); |
250 |
+ |
return; |
251 |
+ |
} |
252 |
+ |
UNLOCK_IDLE; |
253 |
+ |
|
254 |
+ |
// Fallback: sleep 10 ms (this should not happen though) |
255 |
|
Delay_usec(10000); |
256 |
|
} |
257 |
|
|
262 |
|
|
263 |
|
void idle_resume(void) |
264 |
|
{ |
265 |
+ |
LOCK_IDLE; |
266 |
+ |
if (idle_sem_ok > 1) { |
267 |
+ |
idle_sem_ok--; |
268 |
+ |
UNLOCK_IDLE; |
269 |
+ |
ReleaseSemaphore(idle_sem, 1, NULL); |
270 |
+ |
return; |
271 |
+ |
} |
272 |
+ |
UNLOCK_IDLE; |
273 |
|
} |