summaryrefslogtreecommitdiff
path: root/uisimulator/win32/thread-win32.c
diff options
context:
space:
mode:
Diffstat (limited to 'uisimulator/win32/thread-win32.c')
-rw-r--r--uisimulator/win32/thread-win32.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/uisimulator/win32/thread-win32.c b/uisimulator/win32/thread-win32.c
index ca973b6662..5c452d7735 100644
--- a/uisimulator/win32/thread-win32.c
+++ b/uisimulator/win32/thread-win32.c
@@ -17,18 +17,41 @@
17 * 17 *
18 ****************************************************************************/ 18 ****************************************************************************/
19 19
20#define WINDOWS_LEAN_AND_MEAN
20#include <windows.h> 21#include <windows.h>
21#include "thread-win32.h" 22#include "thread-win32.h"
23#include "kernel.h"
22 24
23HANDLE lpThreads[256]; 25HANDLE lpThreads[256];
24int nThreads = 0, 26int nThreads = 0,
25 nPos = 0; 27 nPos = 0;
26long current_tick = 0; 28long current_tick = 0;
29CRITICAL_SECTION CriticalSection;
27 30
28 31
32void yield(void)
33{
34 LeaveCriticalSection(&CriticalSection);
35 /* Don't need a sleep here, and it can be bad, e.g., for audio playback.
36 * Increases CPU usage a lot though. Only sleep if CPU isn't boosted
37 * could be a solution.
38 */
39 /* Sleep(1); */
40 EnterCriticalSection(&CriticalSection);
41}
42
43void sim_sleep(int ticks)
44{
45 LeaveCriticalSection(&CriticalSection);
46 Sleep((1000/HZ) * ticks);
47 EnterCriticalSection(&CriticalSection);
48}
49
29DWORD WINAPI runthread (LPVOID lpParameter) 50DWORD WINAPI runthread (LPVOID lpParameter)
30{ 51{
52 EnterCriticalSection(&CriticalSection);
31 ((void(*)())lpParameter) (); 53 ((void(*)())lpParameter) ();
54 LeaveCriticalSection(&CriticalSection);
32 return 0; 55 return 0;
33} 56}
34 57
@@ -54,4 +77,6 @@ int create_thread(void (*fp)(void), void* sp, int stk_size)
54 77
55void init_threads(void) 78void init_threads(void)
56{ 79{
80 InitializeCriticalSection(&CriticalSection);
81 EnterCriticalSection(&CriticalSection);
57} 82}