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"
|
|
|
|
#include "debug.h"
|
|
|
|
|
|
|
|
SDL_Thread *threads[256];
|
|
|
|
int threadCount = 0;
|
|
|
|
long current_tick = 0;
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2006-02-12 12:47:20 +00:00
|
|
|
yield();
|
|
|
|
|
2006-02-03 15:19:58 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-09-03 21:00:19 +00:00
|
|
|
int create_thread_on_core(void (*core)(void), void (*fp)(void), void* sp, int stk_size)
|
|
|
|
{
|
|
|
|
(void)core;
|
|
|
|
return create_thread(fp, sp, stk_size);
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|