146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997-2006 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Lesser General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2.1 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lesser General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Lesser General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free Software 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* BeOS thread management routines for SDL */ 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <stdio.h> 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <signal.h> 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <be/kernel/OS.h> 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_mutex.h" 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_thread.h" 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_thread_c.h" 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_systhread.h" 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int sig_list[] = { 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGALRM, SIGTERM, SIGWINCH, 0 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_MaskSignals(sigset_t *omask) 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sigset_t mask; 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i; 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sigemptyset(&mask); 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( i=0; sig_list[i]; ++i ) { 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sigaddset(&mask, sig_list[i]); 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sigprocmask(SIG_BLOCK, &mask, omask); 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_UnmaskSignals(sigset_t *omask) 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sigprocmask(SIG_SETMASK, omask, NULL); 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int32 RunThread(void *data) 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_RunThread(data); 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint SDL_SYS_CreateThread(SDL_Thread *thread, void *args) 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Create the thread and go! */ 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner thread->handle=spawn_thread(RunThread, "SDL", B_NORMAL_PRIORITY, args); 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( (thread->handle == B_NO_MORE_THREADS) || 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (thread->handle == B_NO_MEMORY) ) { 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("Not enough resources to create thread"); 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner resume_thread(thread->handle); 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_SYS_SetupThread(void) 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Mask asynchronous signals for this thread */ 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_MaskSignals(NULL); 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8146be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerUint32 SDL_ThreadID(void) 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return((Uint32)find_thread(NULL)); 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_SYS_WaitThread(SDL_Thread *thread) 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner status_t the_status; 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner wait_for_thread(thread->handle, &the_status); 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_SYS_KillThread(SDL_Thread *thread) 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner kill_thread(thread->handle); 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 97