Commit 9d792069 authored by Sam Lantinga's avatar Sam Lantinga

Fixed bug #935

Patrice Mandin

Hello,

I originally added pth support for threads in SDL 1.2 because on the Atari
platform we did not have any thread library.

I think pth support could be removed from SDL 1.3 for two reasons:

- Atari platform removed

- pth does not provides real (preemptive) threads, because it is user space,
and expect the application to call one of its function to give CPU to another
thread. So it is not exactly useful for applications, that expect threads to
run simultaneously.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404452
parent 73074be9
...@@ -1694,33 +1694,6 @@ AC_HELP_STRING([--enable-input-tslib], [use the Touchscreen library for input [[ ...@@ -1694,33 +1694,6 @@ AC_HELP_STRING([--enable-input-tslib], [use the Touchscreen library for input [[
fi fi
} }
dnl See if we can use GNU pth library for threads
CheckPTH()
{
dnl Check for pth support
AC_ARG_ENABLE(pth,
AC_HELP_STRING([--enable-pth], [use GNU pth library for multi-threading [[default=yes]]]),
, enable_pth=yes)
if test x$enable_threads = xyes -a x$enable_pth = xyes; then
AC_PATH_PROG(PTH_CONFIG, pth-config, no)
if test "$PTH_CONFIG" = "no"; then
use_pth=no
else
use_pth=yes
fi
AC_MSG_CHECKING(pth)
AC_MSG_RESULT($use_pth)
if test "x$use_pth" = xyes; then
AC_DEFINE(SDL_THREAD_PTH)
SOURCES="$SOURCES $srcdir/src/thread/pth/*.c"
SOURCES="$SOURCES $srcdir/src/thread/generic/SDL_syssem.c"
SDL_CFLAGS="$SDL_CFLAGS `$PTH_CONFIG --cflags`"
SDL_LIBS="$SDL_LIBS `$PTH_CONFIG --libs --all`"
have_threads=yes
fi
fi
}
dnl See what type of thread model to use on Linux and Solaris dnl See what type of thread model to use on Linux and Solaris
CheckPTHREAD() CheckPTHREAD()
{ {
...@@ -1892,8 +1865,6 @@ AC_HELP_STRING([--enable-pthread-sem], [use pthread semaphores [[default=yes]]]) ...@@ -1892,8 +1865,6 @@ AC_HELP_STRING([--enable-pthread-sem], [use pthread semaphores [[default=yes]]])
SOURCES="$SOURCES $srcdir/src/thread/pthread/SDL_syscond.c" SOURCES="$SOURCES $srcdir/src/thread/pthread/SDL_syscond.c"
have_threads=yes have_threads=yes
else
CheckPTH
fi fi
fi fi
} }
......
...@@ -236,7 +236,6 @@ ...@@ -236,7 +236,6 @@
/* Enable various threading systems */ /* Enable various threading systems */
#undef SDL_THREAD_BEOS #undef SDL_THREAD_BEOS
#undef SDL_THREAD_NDS #undef SDL_THREAD_NDS
#undef SDL_THREAD_PTH
#undef SDL_THREAD_PTHREAD #undef SDL_THREAD_PTHREAD
#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX
#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP
......
...@@ -31,10 +31,6 @@ ...@@ -31,10 +31,6 @@
#include "video/SDL_leaks.h" #include "video/SDL_leaks.h"
#endif #endif
#if SDL_THREAD_PTH
#include <pth.h>
#endif
/* Initialization/Cleanup routines */ /* Initialization/Cleanup routines */
#if !SDL_JOYSTICK_DISABLED #if !SDL_JOYSTICK_DISABLED
extern int SDL_JoystickInit(void); extern int SDL_JoystickInit(void);
...@@ -152,12 +148,6 @@ SDL_InitSubSystem(Uint32 flags) ...@@ -152,12 +148,6 @@ SDL_InitSubSystem(Uint32 flags)
int int
SDL_Init(Uint32 flags) SDL_Init(Uint32 flags)
{ {
#if !SDL_THREADS_DISABLED && SDL_THREAD_PTH
if (!pth_init()) {
return -1;
}
#endif
if (SDL_AssertionsInit() < 0) { if (SDL_AssertionsInit() < 0) {
return -1; return -1;
} }
...@@ -266,9 +256,6 @@ SDL_Quit(void) ...@@ -266,9 +256,6 @@ SDL_Quit(void)
SDL_AssertionsQuit(); SDL_AssertionsQuit();
#if !SDL_THREADS_DISABLED && SDL_THREAD_PTH
pth_kill();
#endif
#ifdef DEBUG_BUILD #ifdef DEBUG_BUILD
printf("[SDL_Quit] : Returning!\n"); printf("[SDL_Quit] : Returning!\n");
fflush(stdout); fflush(stdout);
......
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
#include "beos/SDL_systhread_c.h" #include "beos/SDL_systhread_c.h"
#elif SDL_THREAD_EPOC #elif SDL_THREAD_EPOC
#include "epoc/SDL_systhread_c.h" #include "epoc/SDL_systhread_c.h"
#elif SDL_THREAD_PTH
#include "pth/SDL_systhread_c.h"
#elif SDL_THREAD_PTHREAD #elif SDL_THREAD_PTHREAD
#include "pthread/SDL_systhread_c.h" #include "pthread/SDL_systhread_c.h"
#elif SDL_THREAD_SPROC #elif SDL_THREAD_SPROC
......
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/*
* GNU pth conditions variables
*
* Patrice Mandin
*/
#include <pth.h>
#include "SDL_thread.h"
#include "SDL_sysmutex_c.h"
struct SDL_cond
{
pth_cond_t condpth_p;
};
/* Create a condition variable */
SDL_cond *
SDL_CreateCond(void)
{
SDL_cond *cond;
cond = (SDL_cond *) SDL_malloc(sizeof(SDL_cond));
if (cond) {
if (pth_cond_init(&(cond->condpth_p)) < 0) {
SDL_SetError("pthread_cond_init() failed");
SDL_free(cond);
cond = NULL;
}
} else {
SDL_OutOfMemory();
}
return (cond);
}
/* Destroy a condition variable */
void
SDL_DestroyCond(SDL_cond * cond)
{
if (cond) {
SDL_free(cond);
}
}
/* Restart one of the threads that are waiting on the condition variable */
int
SDL_CondSignal(SDL_cond * cond)
{
int retval;
if (!cond) {
SDL_SetError("Passed a NULL condition variable");
return -1;
}
retval = 0;
if (pth_cond_notify(&(cond->condpth_p), FALSE) != 0) {
SDL_SetError("pth_cond_notify() failed");
retval = -1;
}
return retval;
}
/* Restart all threads that are waiting on the condition variable */
int
SDL_CondBroadcast(SDL_cond * cond)
{
int retval;
if (!cond) {
SDL_SetError("Passed a NULL condition variable");
return -1;
}
retval = 0;
if (pth_cond_notify(&(cond->condpth_p), TRUE) != 0) {
SDL_SetError("pth_cond_notify() failed");
retval = -1;
}
return retval;
}
/* Wait on the condition variable for at most 'ms' milliseconds.
The mutex must be locked before entering this function!
The mutex is unlocked during the wait, and locked again after the wait.
Typical use:
Thread A:
SDL_LockMutex(lock);
while ( ! condition ) {
SDL_CondWait(cond);
}
SDL_UnlockMutex(lock);
Thread B:
SDL_LockMutex(lock);
...
condition = true;
...
SDL_UnlockMutex(lock);
*/
int
SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
{
int retval;
pth_event_t ev;
int sec;
if (!cond) {
SDL_SetError("Passed a NULL condition variable");
return -1;
}
retval = 0;
sec = ms / 1000;
ev = pth_event(PTH_EVENT_TIME,
pth_timeout(sec, (ms - sec * 1000) * 1000));
if (pth_cond_await(&(cond->condpth_p), &(mutex->mutexpth_p), ev) != 0) {
SDL_SetError("pth_cond_await() failed");
retval = -1;
}
pth_event_free(ev, PTH_FREE_ALL);
return retval;
}
/* Wait on the condition variable forever */
int
SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex)
{
int retval;
if (!cond) {
SDL_SetError("Passed a NULL condition variable");
return -1;
}
retval = 0;
if (pth_cond_await(&(cond->condpth_p), &(mutex->mutexpth_p), NULL) != 0) {
SDL_SetError("pth_cond_await() failed");
retval = -1;
}
return retval;
}
/* vi: set ts=4 sw=4 expandtab: */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/*
* GNU pth mutexes
*
* Patrice Mandin
*/
#include <pth.h>
#include "SDL_mutex.h"
#include "SDL_sysmutex_c.h"
/* Create a mutex */
SDL_mutex *
SDL_CreateMutex(void)
{
SDL_mutex *mutex;
/* Allocate mutex memory */
mutex = (SDL_mutex *) SDL_malloc(sizeof(*mutex));
if (mutex) {
/* Create the mutex, with initial value signaled */
if (!pth_mutex_init(&(mutex->mutexpth_p))) {
SDL_SetError("Couldn't create mutex");
SDL_free(mutex);
mutex = NULL;
}
} else {
SDL_OutOfMemory();
}
return (mutex);
}
/* Free the mutex */
void
SDL_DestroyMutex(SDL_mutex * mutex)
{
if (mutex) {
SDL_free(mutex);
}
}
/* Lock the mutex */
int
SDL_mutexP(SDL_mutex * mutex)
{
if (mutex == NULL) {
SDL_SetError("Passed a NULL mutex");
return -1;
}
pth_mutex_acquire(&(mutex->mutexpth_p), FALSE, NULL);
return (0);
}
/* Unlock the mutex */
int
SDL_mutexV(SDL_mutex * mutex)
{
if (mutex == NULL) {
SDL_SetError("Passed a NULL mutex");
return -1;
}
pth_mutex_release(&(mutex->mutexpth_p));
return (0);
}
/* vi: set ts=4 sw=4 expandtab: */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef _SDL_SYSMUTEX_C_H_
#define _SDL_SYSMUTEX_C_H_
struct SDL_mutex
{
pth_mutex_t mutexpth_p;
};
#endif /* _SDL_SYSMUTEX_C_H_ */
/* vi: set ts=4 sw=4 expandtab: */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/*
* GNU pth threads
*
* Patrice Mandin
*/
#include <pth.h>
#include <signal.h>
#include "SDL_thread.h"
#include "../SDL_thread_c.h"
#include "../SDL_systhread.h"
/* List of signals to mask in the subthreads */
static int sig_list[] = {
SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGALRM, SIGTERM, SIGCHLD, SIGWINCH,
SIGVTALRM, SIGPROF, 0
};
static void *
RunThread(void *data)
{
SDL_RunThread(data);
pth_exit((void *) 0);
return ((void *) 0); /* Prevent compiler warning */
}
int
SDL_SYS_CreateThread(SDL_Thread * thread, void *args)
{
pth_attr_t type;
/* Create a new attribute */
type = pth_attr_new();
if (type == NULL) {
SDL_SetError("Couldn't initialize pth attributes");
return (-1);
}
pth_attr_set(type, PTH_ATTR_JOINABLE, TRUE);
/* Create the thread and go! */
thread->handle = pth_spawn(type, RunThread, args);
if (thread->handle == NULL) {
SDL_SetError("Not enough resources to create thread");
return (-1);
}
return (0);
}
void
SDL_SYS_SetupThread(void)
{
int i;
sigset_t mask;
int oldstate;
/* Mask asynchronous signals for this thread */
sigemptyset(&mask);
for (i = 0; sig_list[i]; ++i) {
sigaddset(&mask, sig_list[i]);
}
pth_sigmask(SIG_BLOCK, &mask, 0);
/* Allow ourselves to be asynchronously cancelled */
pth_cancel_state(PTH_CANCEL_ASYNCHRONOUS, &oldstate);
}
SDL_threadID
SDL_ThreadID(void)
{
return ((SDL_threadID) pth_self());
}
void
SDL_SYS_WaitThread(SDL_Thread * thread)
{
pth_join(thread->handle, NULL);
}
/* vi: set ts=4 sw=4 expandtab: */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef _SDL_SYSTHREAD_C_H_
#define _SDL_SYSTHREAD_C_H_
#include <pth.h>
typedef pth_t SYS_ThreadHandle;
#endif /* _SDL_SYSTHREAD_C_H_ */
/* vi: set ts=4 sw=4 expandtab: */
...@@ -42,10 +42,6 @@ ...@@ -42,10 +42,6 @@
#include <time.h> #include <time.h>
#endif #endif
#if SDL_THREAD_PTH
#include <pth.h>
#endif
#if SDL_THREADS_DISABLED #if SDL_THREADS_DISABLED
#define USE_ITIMER #define USE_ITIMER
#endif #endif
...@@ -94,12 +90,6 @@ SDL_GetTicks(void) ...@@ -94,12 +90,6 @@ SDL_GetTicks(void)
void void
SDL_Delay(Uint32 ms) SDL_Delay(Uint32 ms)
{ {
#if SDL_THREAD_PTH
pth_time_t tv;
tv.tv_sec = ms / 1000;
tv.tv_usec = (ms % 1000) * 1000;
pth_nap(tv);
#else
int was_error; int was_error;
#if HAVE_NANOSLEEP #if HAVE_NANOSLEEP
...@@ -138,7 +128,6 @@ SDL_Delay(Uint32 ms) ...@@ -138,7 +128,6 @@ SDL_Delay(Uint32 ms)
was_error = select(0, NULL, NULL, NULL, &tv); was_error = select(0, NULL, NULL, NULL, &tv);
#endif /* HAVE_NANOSLEEP */ #endif /* HAVE_NANOSLEEP */
} while (was_error && (errno == EINTR)); } while (was_error && (errno == EINTR));
#endif /* SDL_THREAD_PTH */
} }
#ifdef USE_ITIMER #ifdef USE_ITIMER
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment