summaryrefslogtreecommitdiffstats
path: root/uisimulator/sdl/thread-sdl.c
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2006-02-03 15:19:58 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2006-02-03 15:19:58 +0000
commitfc72c5375813a6bbc0845aca984147a944a7e62a (patch)
tree347a6a9297f9f4d3131c8268f450d6ba227d0246 /uisimulator/sdl/thread-sdl.c
parent347992e9d93ed0f91cde7e2d580cfdc8d5eb95f4 (diff)
downloadrockbox-fc72c5375813a6bbc0845aca984147a944a7e62a.tar.gz
rockbox-fc72c5375813a6bbc0845aca984147a944a7e62a.tar.bz2
rockbox-fc72c5375813a6bbc0845aca984147a944a7e62a.zip
Patch #1417462 by Dan Everton - Improved SDL simulator
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8546 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator/sdl/thread-sdl.c')
-rw-r--r--uisimulator/sdl/thread-sdl.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/uisimulator/sdl/thread-sdl.c b/uisimulator/sdl/thread-sdl.c
new file mode 100644
index 0000000000..41a60c9bc5
--- /dev/null
+++ b/uisimulator/sdl/thread-sdl.c
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2006 Dan Everton
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <time.h>
+#include <SDL.h>
+#include <SDL_thread.h>
+#include <stdlib.h>
+#include "thread-sdl.h"
+#include "kernel.h"
+#include "debug.h"
+
+SDL_Thread *threads[256];
+int threadCount = 0;
+long current_tick = 0;
+SDL_mutex *m;
+
+void yield(void)
+{
+ SDL_mutexV(m);
+ SDL_Delay(1);
+ SDL_mutexP(m);
+}
+
+void sim_sleep(int ticks)
+{
+ SDL_mutexV(m);
+ SDL_Delay((1000/HZ) * ticks);
+ SDL_mutexP(m);
+}
+
+int runthread(void *data)
+{
+ SDL_mutexV(m);
+ ((void(*)())data) ();
+ SDL_mutexV(m);
+ return 0;
+}
+
+int create_thread(void (*fp)(void), void* sp, int stk_size)
+{
+ /** Avoid compiler warnings */
+ (void)sp;
+ (void)stk_size;
+
+ if (threadCount == 256) {
+ return -1;
+ }
+
+ threads[threadCount++] = SDL_CreateThread(runthread, fp);
+
+ return 0;
+}
+
+void init_threads(void)
+{
+ m = SDL_CreateMutex();
+
+ if (SDL_mutexP(m) == -1) {
+ fprintf(stderr, "Couldn't lock mutex\n");
+ exit(-1);
+ }
+}