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