• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2006 Sam Lantinga
4 
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Lesser General Public
7     License as published by the Free Software Foundation; either
8     version 2.1 of the License, or (at your option) any later version.
9 
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Lesser General Public License for more details.
14 
15     You should have received a copy of the GNU Lesser General Public
16     License along with this library; if not, write to the Free Software
17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18 
19     Sam Lantinga
20     slouken@libsdl.org
21 */
22 #include "SDL_config.h"
23 
24 /* BeOS thread management routines for SDL */
25 
26 #include "SDL_mutex.h"
27 #include "SDL_thread.h"
28 #include "../SDL_thread_c.h"
29 #include "../SDL_systhread.h"
30 #include "mydebug.h"
31 
32 typedef struct {
33 	int (*func)(void *);
34 	void *data;
35 	SDL_Thread *info;
36 	struct Task *wait;
37 } thread_args;
38 
39 #ifndef MORPHOS
40 
41 #if defined(__SASC) && !defined(__PPC__)
RunThread(register __a0 char * args)42 __saveds __asm Uint32 RunThread(register __a0 char *args )
43 #elif defined(__PPC__)
44 Uint32 RunThread(char *args)
45 #else
46 Uint32 __saveds RunThread(char *args __asm("a0") )
47 #endif
48 {
49 	#ifdef STORMC4_WOS
50 	thread_args *data=(thread_args *)args;
51 	#else
52 	thread_args *data=(thread_args *)atol(args);
53 	#endif
54 
55 	struct Task *Father;
56 
57 	D(bug("Received data: %lx\n",data));
58 	Father=data->wait;
59 
60 	SDL_RunThread(data);
61 
62 	Signal(Father,SIGBREAKF_CTRL_F);
63 	D(bug("Thread with data %lx ended\n",data));
64 	return(0);
65 }
66 
67 #else
68 
69 #include <emul/emulinterface.h>
70 
RunTheThread(void)71 Uint32 RunTheThread(void)
72 {
73 	thread_args *data=(thread_args *)atol((char *)REG_A0);
74 	struct Task *Father;
75 
76 	D(bug("Received data: %lx\n",data));
77 	Father=data->wait;
78 
79 	SDL_RunThread(data);
80 
81 	Signal(Father,SIGBREAKF_CTRL_F);
82 	D(bug("Thread with data %lx ended\n",data));
83 	return(0);
84 }
85 
86 struct EmulLibEntry RunThreadStruct=
87 {
88 	TRAP_LIB,
89 	0,
90 	(ULONG)RunTheThread
91 };
92 
93 void *RunThread=&RunThreadStruct;
94 #endif
95 
96 
SDL_SYS_CreateThread(SDL_Thread * thread,void * args)97 int SDL_SYS_CreateThread(SDL_Thread *thread, void *args)
98 {
99 	/* Create the thread and go! */
100 	char buffer[20];
101 
102 	D(bug("Sending %lx to the new thread...\n",args));
103 
104 	if(args)
105 		SDL_snprintf(buffer, SDL_arraysize(buffer),"%ld",args);
106 
107 	#ifdef STORMC4_WOS
108 	thread->handle=CreateTaskPPCTags(TASKATTR_CODE,	RunThread,
109 					TASKATTR_NAME,	"SDL subtask",
110 					TASKATTR_STACKSIZE, 100000,
111 					(args ? TASKATTR_R3 : TAG_IGNORE), args,
112 					TASKATTR_INHERITR2, TRUE,
113 					TAG_DONE);
114 	#else
115 	thread->handle=(struct Task *)CreateNewProcTags(NP_Output,Output(),
116 					NP_Name,(ULONG)"SDL subtask",
117 					NP_CloseOutput, FALSE,
118 					NP_StackSize,20000,
119 					NP_Entry,(ULONG)RunThread,
120 					args ? NP_Arguments : TAG_IGNORE,(ULONG)buffer,
121 					TAG_DONE);
122 	#endif
123 
124 	if(!thread->handle)
125 	{
126 		SDL_SetError("Not enough resources to create thread");
127 		return(-1);
128 	}
129 
130 	return(0);
131 }
132 
SDL_SYS_SetupThread(void)133 void SDL_SYS_SetupThread(void)
134 {
135 }
136 
SDL_ThreadID(void)137 Uint32 SDL_ThreadID(void)
138 {
139 	return((Uint32)FindTask(NULL));
140 }
141 
SDL_SYS_WaitThread(SDL_Thread * thread)142 void SDL_SYS_WaitThread(SDL_Thread *thread)
143 {
144 	SetSignal(0L,SIGBREAKF_CTRL_F|SIGBREAKF_CTRL_C);
145 	Wait(SIGBREAKF_CTRL_F|SIGBREAKF_CTRL_C);
146 }
147 
SDL_SYS_KillThread(SDL_Thread * thread)148 void SDL_SYS_KillThread(SDL_Thread *thread)
149 {
150 	Signal((struct Task *)thread->handle,SIGBREAKF_CTRL_C);
151 }
152