Fixed Bugzilla bug #205

Removed SDL_KillThread() from the API, as it isn't safe on many platforms.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403240
This commit is contained in:
Sam Lantinga 2008-11-24 00:18:42 +00:00
parent 35c71403d7
commit ad347d4a12
14 changed files with 15 additions and 106 deletions

View File

@ -122,7 +122,12 @@ extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread * thread);
*/
extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status);
/* Forcefully kill a thread without worrying about its state */
/* This function is here for binary compatibility with legacy apps, but
in SDL 1.3 and later, it's a no-op. You cannot forcibly kill a thread
in a safe manner on many platforms. You should instead find a way to
alert your thread that it is time to terminate, and then have it gracefully
exit on its own. Do not ever call this function!
*/
extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread * thread);

View File

@ -48,8 +48,5 @@ extern void SDL_SYS_SetupThread(void);
*/
extern void SDL_SYS_WaitThread(SDL_Thread * thread);
/* This function kills the thread and returns */
extern void SDL_SYS_KillThread(SDL_Thread * thread);
#endif /* _SDL_systhread_h */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -306,10 +306,7 @@ SDL_GetThreadID(SDL_Thread * thread)
void
SDL_KillThread(SDL_Thread * thread)
{
if (thread) {
SDL_SYS_KillThread(thread);
SDL_WaitThread(thread, NULL);
}
/* This is a no-op in SDL 1.3 and later. */
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -98,10 +98,4 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
wait_for_thread(thread->handle, &the_status);
}
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
kill_thread(thread->handle);
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -58,10 +58,4 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
thd_wait(thread->handle);
}
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
thd_destroy(thread->handle);
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -51,10 +51,4 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
return;
}
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
return;
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -81,11 +81,4 @@ SDL_WaitThread(SDL_Thread * thread, int *status)
}
}
/* WARNING: This may not work for systems with 64-bit pid_t */
void
SDL_KillThread(SDL_Thread * thread)
{
kill(thread->handle, SIGKILL);
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -102,14 +102,4 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
DosWaitThread(&tid, DCWW_WAIT);
}
/* WARNING: This function is really a last resort.
* Threads should be signaled and then exit by themselves.
* TerminateThread() doesn't perform stack and DLL cleanup.
*/
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
DosKillThread(thread->handle);
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -101,11 +101,4 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
pth_join(thread->handle, NULL);
}
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
pth_cancel(thread->handle);
pth_join(thread->handle, NULL);
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -112,17 +112,4 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
pthread_join(thread->handle, 0);
}
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
#ifdef PTHREAD_CANCEL_ASYNCHRONOUS
pthread_cancel(thread->handle);
#else
#ifdef __FREEBSD__
#warning For some reason, this doesnt actually kill a thread - FreeBSD 3.2
#endif
pthread_kill(thread->handle, SIGKILL);
#endif
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -54,12 +54,6 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
return;
}
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
return;
}
#else
#include <signal.h>
@ -143,15 +137,5 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
pthread_join(thread->handle, 0);
}
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
#ifdef PTHREAD_CANCEL_ASYNCHRONOUS
pthread_cancel(thread->handle);
#else
pthread_kill(thread->handle, SIGKILL);
#endif
}
#endif
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -164,14 +164,4 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
CloseHandle(thread->handle);
}
/* WARNING: This function is really a last resort.
* Threads should be signaled and then exit by themselves.
* TerminateThread() doesn't perform stack and DLL cleanup.
*/
void
SDL_SYS_KillThread(SDL_Thread * thread)
{
TerminateThread(thread->handle, FALSE);
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -62,19 +62,9 @@ main(int argc, char *argv[])
alive = 0;
SDL_WaitThread(thread, NULL);
alive = 1;
thread = SDL_CreateThread(ThreadFunc, "#2");
if (thread == NULL) {
fprintf(stderr, "Couldn't create thread: %s\n", SDL_GetError());
quit(1);
}
SDL_Delay(5 * 1000);
printf("Killing thread #2\n");
SDL_KillThread(thread);
alive = 1;
signal(SIGTERM, killed);
thread = SDL_CreateThread(ThreadFunc, "#3");
thread = SDL_CreateThread(ThreadFunc, "#2");
if (thread == NULL) {
fprintf(stderr, "Couldn't create thread: %s\n", SDL_GetError());
quit(1);

View File

@ -44,8 +44,9 @@ closemutex(int sig)
Uint32 id = SDL_ThreadID();
int i;
printf("Process %u: Cleaning up...\n", id == mainthread ? 0 : id);
doterminate = 1;
for (i = 0; i < 6; ++i)
SDL_KillThread(threads[i]);
SDL_WaitThread(threads[i], NULL);
SDL_DestroyMutex(mutex);
exit(sig);
}
@ -55,7 +56,7 @@ Run(void *data)
{
if (SDL_ThreadID() == mainthread)
signal(SIGTERM, closemutex);
while (1) {
while (!doterminate) {
printf("Process %u ready to work\n", SDL_ThreadID());
if (SDL_mutexP(mutex) < 0) {
fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError());
@ -70,10 +71,10 @@ Run(void *data)
}
/* If this sleep isn't done, then threads may starve */
SDL_Delay(10);
if (SDL_ThreadID() == mainthread && doterminate) {
printf("Process %u: raising SIGTERM\n", SDL_ThreadID());
raise(SIGTERM);
}
}
if (SDL_ThreadID() == mainthread && doterminate) {
printf("Process %u: raising SIGTERM\n", SDL_ThreadID());
raise(SIGTERM);
}
return (0);
}