2006-02-03 15:19:58 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* 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"
|
2007-03-24 01:27:29 +00:00
|
|
|
#include "thread.h"
|
2006-02-03 15:19:58 +00:00
|
|
|
#include "debug.h"
|
|
|
|
|
|
|
|
SDL_Thread *threads[256];
|
|
|
|
int threadCount = 0;
|
2007-06-25 20:58:15 +00:00
|
|
|
volatile long current_tick = 0;
|
2006-02-03 15:19:58 +00:00
|
|
|
SDL_mutex *m;
|
|
|
|
|
|
|
|
void yield(void)
|
|
|
|
{
|
2006-07-31 15:02:39 +00:00
|
|
|
static int counter = 0;
|
2006-09-03 20:21:21 +00:00
|
|
|
|
2006-02-03 15:19:58 +00:00
|
|
|
SDL_mutexV(m);
|
2006-07-31 15:13:31 +00:00
|
|
|
if (counter++ >= 50)
|
2006-07-31 15:02:39 +00:00
|
|
|
{
|
|
|
|
SDL_Delay(1);
|
|
|
|
counter = 0;
|
|
|
|
}
|
2006-02-03 15:19:58 +00:00
|
|
|
SDL_mutexP(m);
|
|
|
|
}
|
|
|
|
|
|
|
|
void sim_sleep(int ticks)
|
|
|
|
{
|
|
|
|
SDL_mutexV(m);
|
|
|
|
SDL_Delay((1000/HZ) * ticks);
|
|
|
|
SDL_mutexP(m);
|
|
|
|
}
|
|
|
|
|
|
|
|
int runthread(void *data)
|
|
|
|
{
|
2006-02-12 12:47:20 +00:00
|
|
|
SDL_mutexP(m);
|
2006-02-03 15:19:58 +00:00
|
|
|
((void(*)())data) ();
|
|
|
|
SDL_mutexV(m);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-03-24 01:27:29 +00:00
|
|
|
struct thread_entry*
|
|
|
|
create_thread(void (*function)(void), void* stack, int stack_size,
|
|
|
|
const char *name)
|
2006-02-03 15:19:58 +00:00
|
|
|
{
|
|
|
|
/** Avoid compiler warnings */
|
2007-03-24 01:27:29 +00:00
|
|
|
(void)stack;
|
|
|
|
(void)stack_size;
|
|
|
|
(void)name;
|
|
|
|
SDL_Thread* t;
|
2006-02-03 15:19:58 +00:00
|
|
|
|
|
|
|
if (threadCount == 256) {
|
2007-03-24 01:27:29 +00:00
|
|
|
return NULL;
|
2006-02-03 15:19:58 +00:00
|
|
|
}
|
|
|
|
|
2007-03-24 01:27:29 +00:00
|
|
|
t = SDL_CreateThread(runthread, function);
|
|
|
|
threads[threadCount++] = t;
|
2006-02-03 15:19:58 +00:00
|
|
|
|
2006-02-12 12:47:20 +00:00
|
|
|
yield();
|
|
|
|
|
2007-03-24 01:27:29 +00:00
|
|
|
/* The return value is never de-referenced outside thread.c so this
|
|
|
|
nastiness should be fine. However, a better solution would be nice.
|
|
|
|
*/
|
|
|
|
return (struct thread_entry*)t;
|
2006-02-03 15:19:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void init_threads(void)
|
|
|
|
{
|
|
|
|
m = SDL_CreateMutex();
|
|
|
|
|
|
|
|
if (SDL_mutexP(m) == -1) {
|
|
|
|
fprintf(stderr, "Couldn't lock mutex\n");
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
}
|
2007-03-30 16:02:42 +00:00
|
|
|
|
|
|
|
void remove_thread(struct thread_entry *thread)
|
|
|
|
{
|
|
|
|
SDL_KillThread((SDL_Thread*) thread);
|
|
|
|
}
|