From d315dfb5b1a0852d8665ef88042a9272d0b14ac5 Mon Sep 17 00:00:00 2001 From: Magnus Holmgren Date: Tue, 19 Jul 2005 20:43:21 +0000 Subject: Made Win32 thread management similar to the X11 one (previously yield() could make a thread stop, seemingly forever). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7202 a1c6a512-1295-4272-9138-f99709370657 --- uisimulator/win32/thread-win32.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'uisimulator/win32/thread-win32.c') 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 @@ * ****************************************************************************/ +#define WINDOWS_LEAN_AND_MEAN #include #include "thread-win32.h" +#include "kernel.h" HANDLE lpThreads[256]; int nThreads = 0, nPos = 0; long current_tick = 0; +CRITICAL_SECTION CriticalSection; +void yield(void) +{ + LeaveCriticalSection(&CriticalSection); + /* Don't need a sleep here, and it can be bad, e.g., for audio playback. + * Increases CPU usage a lot though. Only sleep if CPU isn't boosted + * could be a solution. + */ + /* Sleep(1); */ + EnterCriticalSection(&CriticalSection); +} + +void sim_sleep(int ticks) +{ + LeaveCriticalSection(&CriticalSection); + Sleep((1000/HZ) * ticks); + EnterCriticalSection(&CriticalSection); +} + DWORD WINAPI runthread (LPVOID lpParameter) { + EnterCriticalSection(&CriticalSection); ((void(*)())lpParameter) (); + LeaveCriticalSection(&CriticalSection); return 0; } @@ -54,4 +77,6 @@ int create_thread(void (*fp)(void), void* sp, int stk_size) void init_threads(void) { + InitializeCriticalSection(&CriticalSection); + EnterCriticalSection(&CriticalSection); } -- cgit v1.2.3