diff options
author | Magnus Holmgren <magnushol@gmail.com> | 2005-07-19 20:43:21 +0000 |
---|---|---|
committer | Magnus Holmgren <magnushol@gmail.com> | 2005-07-19 20:43:21 +0000 |
commit | d315dfb5b1a0852d8665ef88042a9272d0b14ac5 (patch) | |
tree | 09b541b54e1fd5a2c74287ea58f882aa2cdf25cf /uisimulator/win32/thread-win32.c | |
parent | d83b659fa7206b150779274635a013def1ed850e (diff) | |
download | rockbox-d315dfb5b1a0852d8665ef88042a9272d0b14ac5.tar.gz rockbox-d315dfb5b1a0852d8665ef88042a9272d0b14ac5.zip |
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
Diffstat (limited to 'uisimulator/win32/thread-win32.c')
-rw-r--r-- | uisimulator/win32/thread-win32.c | 25 |
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 | ||
23 | HANDLE lpThreads[256]; | 25 | HANDLE lpThreads[256]; |
24 | int nThreads = 0, | 26 | int nThreads = 0, |
25 | nPos = 0; | 27 | nPos = 0; |
26 | long current_tick = 0; | 28 | long current_tick = 0; |
29 | CRITICAL_SECTION CriticalSection; | ||
27 | 30 | ||
28 | 31 | ||
32 | void 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 | |||
43 | void sim_sleep(int ticks) | ||
44 | { | ||
45 | LeaveCriticalSection(&CriticalSection); | ||
46 | Sleep((1000/HZ) * ticks); | ||
47 | EnterCriticalSection(&CriticalSection); | ||
48 | } | ||
49 | |||
29 | DWORD WINAPI runthread (LPVOID lpParameter) | 50 | DWORD 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 | ||
55 | void init_threads(void) | 78 | void init_threads(void) |
56 | { | 79 | { |
80 | InitializeCriticalSection(&CriticalSection); | ||
81 | EnterCriticalSection(&CriticalSection); | ||
57 | } | 82 | } |