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/* IRIX thread management routines for SDL */
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <errno.h>
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <signal.h>
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <sys/types.h>
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <sys/wait.h>
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <sys/prctl.h>
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_thread.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, SIGCLD, SIGWINCH,
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SIGVTALRM, SIGPROF, 0
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner};
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint SDL_SYS_CreateThread(SDL_Thread *thread, void *args)
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Create the thread and go! */
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( sproc(SDL_RunThread, PR_SALL, args) < 0 ) {
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_SetError("Not enough resources to create thread");
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(-1);
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_SYS_SetupThread(void)
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int i;
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	sigset_t mask;
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Mask asynchronous signals for this thread */
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	sigemptyset(&mask);
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for ( i=0; sig_list[i]; ++i ) {
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		sigaddset(&mask, sig_list[i]);
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	sigprocmask(SIG_BLOCK, &mask, NULL);
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* WARNING:  This may not work for systems with 64-bit pid_t */
6646be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerUint32 SDL_ThreadID(void)
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return((Uint32)getpid());
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* WARNING:  This may not work for systems with 64-bit pid_t */
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_WaitThread(SDL_Thread *thread, int *status)
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	errno = 0;
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	while ( errno != ECHILD ) {
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		waitpid(thread->handle, NULL, 0);
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* WARNING:  This may not work for systems with 64-bit pid_t */
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid SDL_KillThread(SDL_Thread *thread)
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	kill(thread->handle, SIGKILL);
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
86