2002-06-10 10:17:54 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* Copyright (C) 2002 Daniel Stenberg
|
|
|
|
*
|
|
|
|
* 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 <stdio.h>
|
|
|
|
#include <pthread.h>
|
|
|
|
|
2002-06-14 12:33:51 +00:00
|
|
|
#include "kernel.h"
|
|
|
|
#include <poll.h>
|
|
|
|
|
2002-06-14 12:44:51 +00:00
|
|
|
long current_tick = 0;
|
2002-06-14 12:33:51 +00:00
|
|
|
|
2002-06-10 10:17:54 +00:00
|
|
|
/*
|
|
|
|
* We emulate the target threads by using pthreads. We have a mutex that only
|
|
|
|
* allows one thread at a time to execute. It forces each thread to yield()
|
|
|
|
* for the other(s) to run.
|
|
|
|
*/
|
|
|
|
|
|
|
|
pthread_mutex_t mp;
|
|
|
|
|
|
|
|
void init_threads(void)
|
|
|
|
{
|
|
|
|
pthread_mutex_init(&mp, NULL);
|
2002-06-14 12:33:51 +00:00
|
|
|
/* get mutex to only allow one thread running at a time */
|
|
|
|
pthread_mutex_lock(&mp);
|
|
|
|
|
2002-06-14 12:44:51 +00:00
|
|
|
current_tick = time(NULL); /* give it a boost from start! */
|
2002-06-10 10:17:54 +00:00
|
|
|
}
|
|
|
|
/*
|
|
|
|
int pthread_create(pthread_t *new_thread_ID,
|
|
|
|
const pthread_attr_t *attr,
|
|
|
|
void * (*start_func)(void *), void *arg);
|
|
|
|
*/
|
|
|
|
|
2002-06-14 12:44:51 +00:00
|
|
|
void yield(void)
|
2002-06-10 10:17:54 +00:00
|
|
|
{
|
2002-06-14 12:44:51 +00:00
|
|
|
current_tick+=3;
|
2002-06-10 10:17:54 +00:00
|
|
|
pthread_mutex_unlock(&mp); /* return */
|
|
|
|
pthread_mutex_lock(&mp); /* get it again */
|
|
|
|
}
|
|
|
|
|
2002-06-14 12:33:51 +00:00
|
|
|
void newfunc(void (*func)(void))
|
|
|
|
{
|
2002-06-14 12:44:51 +00:00
|
|
|
yield();
|
|
|
|
func();
|
2002-06-14 12:33:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-06-10 10:17:54 +00:00
|
|
|
int create_thread(void* fp, void* sp, int stk_size)
|
|
|
|
{
|
|
|
|
pthread_t tid;
|
|
|
|
int i;
|
|
|
|
int error;
|
|
|
|
|
|
|
|
/* we really don't care about these arguments */
|
|
|
|
(void)sp;
|
|
|
|
(void)stk_size;
|
|
|
|
error = pthread_create(&tid,
|
2002-06-14 12:33:51 +00:00
|
|
|
NULL, /* default attributes please */
|
|
|
|
(void *(*)(void *)) newfunc, /* function to start */
|
|
|
|
fp /* start argument */);
|
2002-06-10 10:17:54 +00:00
|
|
|
if(0 != error)
|
2002-06-14 12:44:51 +00:00
|
|
|
fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
|
2002-06-10 10:17:54 +00:00
|
|
|
else
|
2002-06-14 12:44:51 +00:00
|
|
|
fprintf(stderr, "Thread %ld is running\n", (long)tid);
|
2002-06-10 10:17:54 +00:00
|
|
|
|
2002-06-14 12:33:51 +00:00
|
|
|
yield();
|
2002-06-10 10:17:54 +00:00
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
2002-06-14 12:33:51 +00:00
|
|
|
|
|
|
|
/* ticks is HZ per second */
|
2004-06-10 13:29:52 +00:00
|
|
|
void sim_sleep(int ticks)
|
2002-06-14 12:33:51 +00:00
|
|
|
{
|
2002-06-14 12:44:51 +00:00
|
|
|
current_tick+=5;
|
2002-06-14 12:33:51 +00:00
|
|
|
pthread_mutex_unlock(&mp); /* return */
|
|
|
|
/* portable subsecond "sleep" */
|
|
|
|
poll((void *)0, 0, ticks * 1000/HZ);
|
|
|
|
|
|
|
|
pthread_mutex_lock(&mp); /* get it again */
|
|
|
|
}
|