diff options
Diffstat (limited to 'distrib/sdl-1.2.12/src/thread/amigaos')
-rw-r--r-- | distrib/sdl-1.2.12/src/thread/amigaos/SDL_syssem.c | 148 | ||||
-rw-r--r-- | distrib/sdl-1.2.12/src/thread/amigaos/SDL_systhread.c | 151 | ||||
-rw-r--r-- | distrib/sdl-1.2.12/src/thread/amigaos/SDL_systhread_c.h | 61 | ||||
-rw-r--r-- | distrib/sdl-1.2.12/src/thread/amigaos/SDL_thread.c | 278 |
4 files changed, 0 insertions, 638 deletions
diff --git a/distrib/sdl-1.2.12/src/thread/amigaos/SDL_syssem.c b/distrib/sdl-1.2.12/src/thread/amigaos/SDL_syssem.c deleted file mode 100644 index a31a213..0000000 --- a/distrib/sdl-1.2.12/src/thread/amigaos/SDL_syssem.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* An implementation of semaphores using mutexes and condition variables */ - -#include "SDL_thread.h" -#include "SDL_systhread_c.h" - - -struct SDL_semaphore -{ - struct SignalSemaphore Sem; -}; - -#undef D - -#define D(x) - -SDL_sem *SDL_CreateSemaphore(Uint32 initial_value) -{ - SDL_sem *sem; - - sem = (SDL_sem *)SDL_malloc(sizeof(*sem)); - - if ( ! sem ) { - SDL_OutOfMemory(); - return(0); - } - - D(bug("Creating semaphore %lx...\n",sem)); - - SDL_memset(sem,0,sizeof(*sem)); - - InitSemaphore(&sem->Sem); - - return(sem); -} - -void SDL_DestroySemaphore(SDL_sem *sem) -{ - D(bug("Destroying semaphore %lx...\n",sem)); - - if ( sem ) { -// Condizioni per liberare i task in attesa? - SDL_free(sem); - } -} - -int SDL_SemTryWait(SDL_sem *sem) -{ - if ( ! sem ) { - SDL_SetError("Passed a NULL semaphore"); - return -1; - } - - D(bug("TryWait semaphore...%lx\n",sem)); - - ObtainSemaphore(&sem->Sem); -// ReleaseSemaphore(&sem->Sem); - - return 1; -} - -int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) -{ - int retval; - - - if ( ! sem ) { - SDL_SetError("Passed a NULL semaphore"); - return -1; - } - - D(bug("WaitTimeout (%ld) semaphore...%lx\n",timeout,sem)); - - /* A timeout of 0 is an easy case */ - if ( timeout == 0 ) { - ObtainSemaphore(&sem->Sem); - return 1; - } - if(!(retval=AttemptSemaphore(&sem->Sem))) - { - SDL_Delay(timeout); - retval=AttemptSemaphore(&sem->Sem); - } - - if(retval==TRUE) - { -// ReleaseSemaphore(&sem->Sem); - retval=1; - } - - return retval; -} - -int SDL_SemWait(SDL_sem *sem) -{ - ObtainSemaphore(&sem->Sem); - return 0; -} - -Uint32 SDL_SemValue(SDL_sem *sem) -{ - Uint32 value; - - value = 0; - if ( sem ) { - #ifdef STORMC4_WOS - value = sem->Sem.ssppc_SS.ss_NestCount; - #else - value = sem->Sem.ss_NestCount; - #endif - } - return value; -} - -int SDL_SemPost(SDL_sem *sem) -{ - if ( ! sem ) { - SDL_SetError("Passed a NULL semaphore"); - return -1; - } - D(bug("SemPost semaphore...%lx\n",sem)); - - ReleaseSemaphore(&sem->Sem); - return 0; -} - diff --git a/distrib/sdl-1.2.12/src/thread/amigaos/SDL_systhread.c b/distrib/sdl-1.2.12/src/thread/amigaos/SDL_systhread.c deleted file mode 100644 index c6b42e7..0000000 --- a/distrib/sdl-1.2.12/src/thread/amigaos/SDL_systhread.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* BeOS thread management routines for SDL */ - -#include "SDL_mutex.h" -#include "SDL_thread.h" -#include "../SDL_thread_c.h" -#include "../SDL_systhread.h" -#include "mydebug.h" - -typedef struct { - int (*func)(void *); - void *data; - SDL_Thread *info; - struct Task *wait; -} thread_args; - -#ifndef MORPHOS - -#if defined(__SASC) && !defined(__PPC__) -__saveds __asm Uint32 RunThread(register __a0 char *args ) -#elif defined(__PPC__) -Uint32 RunThread(char *args) -#else -Uint32 __saveds RunThread(char *args __asm("a0") ) -#endif -{ - #ifdef STORMC4_WOS - thread_args *data=(thread_args *)args; - #else - thread_args *data=(thread_args *)atol(args); - #endif - - struct Task *Father; - - D(bug("Received data: %lx\n",data)); - Father=data->wait; - - SDL_RunThread(data); - - Signal(Father,SIGBREAKF_CTRL_F); - D(bug("Thread with data %lx ended\n",data)); - return(0); -} - -#else - -#include <emul/emulinterface.h> - -Uint32 RunTheThread(void) -{ - thread_args *data=(thread_args *)atol((char *)REG_A0); - struct Task *Father; - - D(bug("Received data: %lx\n",data)); - Father=data->wait; - - SDL_RunThread(data); - - Signal(Father,SIGBREAKF_CTRL_F); - D(bug("Thread with data %lx ended\n",data)); - return(0); -} - -struct EmulLibEntry RunThreadStruct= -{ - TRAP_LIB, - 0, - (ULONG)RunTheThread -}; - -void *RunThread=&RunThreadStruct; -#endif - - -int SDL_SYS_CreateThread(SDL_Thread *thread, void *args) -{ - /* Create the thread and go! */ - char buffer[20]; - - D(bug("Sending %lx to the new thread...\n",args)); - - if(args) - SDL_snprintf(buffer, SDL_arraysize(buffer),"%ld",args); - - #ifdef STORMC4_WOS - thread->handle=CreateTaskPPCTags(TASKATTR_CODE, RunThread, - TASKATTR_NAME, "SDL subtask", - TASKATTR_STACKSIZE, 100000, - (args ? TASKATTR_R3 : TAG_IGNORE), args, - TASKATTR_INHERITR2, TRUE, - TAG_DONE); - #else - thread->handle=(struct Task *)CreateNewProcTags(NP_Output,Output(), - NP_Name,(ULONG)"SDL subtask", - NP_CloseOutput, FALSE, - NP_StackSize,20000, - NP_Entry,(ULONG)RunThread, - args ? NP_Arguments : TAG_IGNORE,(ULONG)buffer, - TAG_DONE); - #endif - - if(!thread->handle) - { - SDL_SetError("Not enough resources to create thread"); - return(-1); - } - - return(0); -} - -void SDL_SYS_SetupThread(void) -{ -} - -Uint32 SDL_ThreadID(void) -{ - return((Uint32)FindTask(NULL)); -} - -void SDL_SYS_WaitThread(SDL_Thread *thread) -{ - SetSignal(0L,SIGBREAKF_CTRL_F|SIGBREAKF_CTRL_C); - Wait(SIGBREAKF_CTRL_F|SIGBREAKF_CTRL_C); -} - -void SDL_SYS_KillThread(SDL_Thread *thread) -{ - Signal((struct Task *)thread->handle,SIGBREAKF_CTRL_C); -} diff --git a/distrib/sdl-1.2.12/src/thread/amigaos/SDL_systhread_c.h b/distrib/sdl-1.2.12/src/thread/amigaos/SDL_systhread_c.h deleted file mode 100644 index 53ba3c8..0000000 --- a/distrib/sdl-1.2.12/src/thread/amigaos/SDL_systhread_c.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#include <exec/exec.h> -#include <dos/dos.h> -#include <dos/dostags.h> -#if defined (__SASC) || defined(STORMC4_WOS) -#include <proto/dos.h> -#include <proto/exec.h> -#else -#include <inline/dos.h> -#include <inline/exec.h> -#endif - -#include "mydebug.h" - -extern struct ExecBase *SysBase; -extern struct DosLibrary *DOSBase; - -#ifdef STORMC4_WOS -#include <proto/powerpc.h> - -/* use powerpc.library functions instead og exec */ -#define SYS_ThreadHandle struct TaskPPC * -#define Signal SignalPPC -#define Wait WaitPPC -#define Task TaskPPC -#define FindTask FindTaskPPC -#define SetSignal SetSignalPPC - -#define InitSemaphore InitSemaphorePPC -#define ObtainSemaphore ObtainSemaphorePPC -#define AttemptSemaphore AttemptSemaphorePPC -#define ReleaseSemaphore ReleaseSemaphorePPC -#define SignalSemaphore SignalSemaphorePPC - -#else - -#define SYS_ThreadHandle struct Task * -#endif /*STORMC4_WOS*/ - diff --git a/distrib/sdl-1.2.12/src/thread/amigaos/SDL_thread.c b/distrib/sdl-1.2.12/src/thread/amigaos/SDL_thread.c deleted file mode 100644 index 7698f49..0000000 --- a/distrib/sdl-1.2.12/src/thread/amigaos/SDL_thread.c +++ /dev/null @@ -1,278 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* System independent thread management routines for SDL */ - -#include "SDL_mutex.h" -#include "SDL_thread.h" -#include "../SDL_thread_c.h" -#include "../SDL_systhread.h" - -#define ARRAY_CHUNKSIZE 32 -/* The array of threads currently active in the application - (except the main thread) - The manipulation of an array here is safer than using a linked list. -*/ -static int SDL_maxthreads = 0; -static int SDL_numthreads = 0; -static SDL_Thread **SDL_Threads = NULL; -static struct SignalSemaphore thread_lock; -int thread_lock_created = 0; - -int SDL_ThreadsInit(void) -{ - InitSemaphore(&thread_lock); - thread_lock_created=1; - return 0; -} - -/* This should never be called... - If this is called by SDL_Quit(), we don't know whether or not we should - clean up threads here. If any threads are still running after this call, - they will no longer have access to any per-thread data. - */ -void SDL_ThreadsQuit() -{ - thread_lock_created=0; -} - -/* Routines for manipulating the thread list */ -static void SDL_AddThread(SDL_Thread *thread) -{ - SDL_Thread **threads; - - /* WARNING: - If the very first threads are created simultaneously, then - there could be a race condition causing memory corruption. - In practice, this isn't a problem because by definition there - is only one thread running the first time this is called. - */ - if ( !thread_lock_created ) { - if ( SDL_ThreadsInit() < 0 ) { - return; - } - } - ObtainSemaphore(&thread_lock); - - /* Expand the list of threads, if necessary */ -#ifdef DEBUG_THREADS - printf("Adding thread (%d already - %d max)\n", - SDL_numthreads, SDL_maxthreads); -#endif - if ( SDL_numthreads == SDL_maxthreads ) { - threads=(SDL_Thread **)SDL_malloc((SDL_maxthreads+ARRAY_CHUNKSIZE)* - (sizeof *threads)); - if ( threads == NULL ) { - SDL_OutOfMemory(); - goto done; - } - SDL_memcpy(threads, SDL_Threads, SDL_numthreads*(sizeof *threads)); - SDL_maxthreads += ARRAY_CHUNKSIZE; - if ( SDL_Threads ) { - SDL_free(SDL_Threads); - } - SDL_Threads = threads; - } - SDL_Threads[SDL_numthreads++] = thread; -done: - ReleaseSemaphore(&thread_lock); -} - -static void SDL_DelThread(SDL_Thread *thread) -{ - int i; - - if ( thread_lock_created ) { - ObtainSemaphore(&thread_lock); - for ( i=0; i<SDL_numthreads; ++i ) { - if ( thread == SDL_Threads[i] ) { - break; - } - } - if ( i < SDL_numthreads ) { - --SDL_numthreads; - while ( i < SDL_numthreads ) { - SDL_Threads[i] = SDL_Threads[i+1]; - ++i; - } -#ifdef DEBUG_THREADS - printf("Deleting thread (%d left - %d max)\n", - SDL_numthreads, SDL_maxthreads); -#endif - } - ReleaseSemaphore(&thread_lock); - } -} - -/* The default (non-thread-safe) global error variable */ -static SDL_error SDL_global_error; - -/* Routine to get the thread-specific error variable */ -SDL_error *SDL_GetErrBuf(void) -{ - SDL_error *errbuf; - - errbuf = &SDL_global_error; - if ( SDL_Threads ) { - int i; - Uint32 this_thread; - - this_thread = SDL_ThreadID(); - ObtainSemaphore(&thread_lock); - for ( i=0; i<SDL_numthreads; ++i ) { - if ( this_thread == SDL_Threads[i]->threadid ) { - errbuf = &SDL_Threads[i]->errbuf; - break; - } - } - ReleaseSemaphore(&thread_lock); - } - return(errbuf); -} - - -/* Arguments and callback to setup and run the user thread function */ -typedef struct { - int (*func)(void *); - void *data; - SDL_Thread *info; - struct Task *wait; -} thread_args; - -void SDL_RunThread(void *data) -{ - thread_args *args; - int (*userfunc)(void *); - void *userdata; - int *statusloc; - - /* Perform any system-dependent setup - - this function cannot fail, and cannot use SDL_SetError() - */ - SDL_SYS_SetupThread(); - - /* Get the thread id */ - args = (thread_args *)data; - args->info->threadid = SDL_ThreadID(); - - /* Figure out what function to run */ - userfunc = args->func; - userdata = args->data; - statusloc = &args->info->status; - - /* Wake up the parent thread */ - Signal(args->wait,SIGBREAKF_CTRL_E); - - /* Run the function */ - *statusloc = userfunc(userdata); -} - -SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data) -{ - SDL_Thread *thread; - thread_args *args; - int ret; - - /* Allocate memory for the thread info structure */ - thread = (SDL_Thread *)SDL_malloc(sizeof(*thread)); - if ( thread == NULL ) { - SDL_OutOfMemory(); - return(NULL); - } - SDL_memset(thread, 0, (sizeof *thread)); - thread->status = -1; - - /* Set up the arguments for the thread */ - args = (thread_args *)SDL_malloc(sizeof(*args)); - if ( args == NULL ) { - SDL_OutOfMemory(); - SDL_free(thread); - return(NULL); - } - args->func = fn; - args->data = data; - args->info = thread; - args->wait = FindTask(NULL); - if ( args->wait == NULL ) { - SDL_free(thread); - SDL_free(args); - SDL_OutOfMemory(); - return(NULL); - } - - /* Add the thread to the list of available threads */ - SDL_AddThread(thread); - - D(bug("Starting thread...\n")); - - /* Create the thread and go! */ - ret = SDL_SYS_CreateThread(thread, args); - if ( ret >= 0 ) { - D(bug("Waiting for thread CTRL_E...\n")); - /* Wait for the thread function to use arguments */ - Wait(SIGBREAKF_CTRL_E); - D(bug(" Arrived.")); - } else { - /* Oops, failed. Gotta free everything */ - SDL_DelThread(thread); - SDL_free(thread); - thread = NULL; - } - SDL_free(args); - - /* Everything is running now */ - return(thread); -} - -void SDL_WaitThread(SDL_Thread *thread, int *status) -{ - if ( thread ) { - SDL_SYS_WaitThread(thread); - if ( status ) { - *status = thread->status; - } - SDL_DelThread(thread); - SDL_free(thread); - } -} - -Uint32 SDL_GetThreadID(SDL_Thread *thread) -{ - Uint32 id; - - if ( thread ) { - id = thread->threadid; - } else { - id = SDL_ThreadID(); - } - return(id); -} - -void SDL_KillThread(SDL_Thread *thread) -{ - if ( thread ) { - SDL_SYS_KillThread(thread); - SDL_WaitThread(thread, NULL); - } -} - |