Fixed Bugzilla bug #205
authorSam Lantinga <slouken@libsdl.org>
Mon, 24 Nov 2008 00:18:42 +0000
changeset 2779 4436464c4f51
parent 2778 38dfc890ee6b
child 2780 cc15254e44b6
Fixed Bugzilla bug #205 Removed SDL_KillThread() from the API, as it isn't safe on many platforms.
include/SDL_thread.h
src/thread/SDL_systhread.h
src/thread/SDL_thread.c
src/thread/beos/SDL_systhread.c
src/thread/dc/SDL_systhread.c
src/thread/generic/SDL_systhread.c
src/thread/irix/SDL_systhread.c
src/thread/os2/SDL_systhread.c
src/thread/pth/SDL_systhread.c
src/thread/pthread/SDL_systhread.c
src/thread/riscos/SDL_systhread.c
src/thread/win32/SDL_systhread.c
test/testhread.c
test/testlock.c
--- a/include/SDL_thread.h	Sat Nov 22 06:59:22 2008 +0000
+++ b/include/SDL_thread.h	Mon Nov 24 00:18:42 2008 +0000
@@ -122,7 +122,12 @@
  */
 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);
 
 
--- a/src/thread/SDL_systhread.h	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/SDL_systhread.h	Mon Nov 24 00:18:42 2008 +0000
@@ -48,8 +48,5 @@
  */
 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: */
--- a/src/thread/SDL_thread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/SDL_thread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -306,10 +306,7 @@
 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: */
--- a/src/thread/beos/SDL_systhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/beos/SDL_systhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -98,10 +98,4 @@
     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: */
--- a/src/thread/dc/SDL_systhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/dc/SDL_systhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -58,10 +58,4 @@
     thd_wait(thread->handle);
 }
 
-void
-SDL_SYS_KillThread(SDL_Thread * thread)
-{
-    thd_destroy(thread->handle);
-}
-
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/thread/generic/SDL_systhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/generic/SDL_systhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -51,10 +51,4 @@
     return;
 }
 
-void
-SDL_SYS_KillThread(SDL_Thread * thread)
-{
-    return;
-}
-
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/thread/irix/SDL_systhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/irix/SDL_systhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -81,11 +81,4 @@
     }
 }
 
-/* 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: */
--- a/src/thread/os2/SDL_systhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/os2/SDL_systhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -102,14 +102,4 @@
     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: */
--- a/src/thread/pth/SDL_systhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/pth/SDL_systhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -101,11 +101,4 @@
     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: */
--- a/src/thread/pthread/SDL_systhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/pthread/SDL_systhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -112,17 +112,4 @@
     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: */
--- a/src/thread/riscos/SDL_systhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/riscos/SDL_systhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -54,12 +54,6 @@
     return;
 }
 
-void
-SDL_SYS_KillThread(SDL_Thread * thread)
-{
-    return;
-}
-
 #else
 
 #include <signal.h>
@@ -143,15 +137,5 @@
     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: */
--- a/src/thread/win32/SDL_systhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/src/thread/win32/SDL_systhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -164,14 +164,4 @@
     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: */
--- a/test/testhread.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/test/testhread.c	Mon Nov 24 00:18:42 2008 +0000
@@ -63,22 +63,12 @@
     SDL_WaitThread(thread, NULL);
 
     alive = 1;
+    signal(SIGTERM, killed);
     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");
-    if (thread == NULL) {
-        fprintf(stderr, "Couldn't create thread: %s\n", SDL_GetError());
-        quit(1);
-    }
     raise(SIGTERM);
 
     SDL_Quit();                 /* Never reached */
--- a/test/testlock.c	Sat Nov 22 06:59:22 2008 +0000
+++ b/test/testlock.c	Mon Nov 24 00:18:42 2008 +0000
@@ -44,8 +44,9 @@
     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 @@
 {
     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 @@
         }
         /* 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);
 }