# HG changeset patch # User Sam Lantinga # Date 1296197048 28800 # Node ID dc0dfdd58f27574224ab25bec9ff7dc523d5a044 # Parent 0ec550f04bbcb084c9025f428b9cf647511d0d66 Removed completely non-portable event thread hack. Next I'll be working on generalizing the event sources and making the event queue lock-free. :) diff -r 0ec550f04bbc -r dc0dfdd58f27 include/SDL.h --- a/include/SDL.h Thu Jan 27 20:51:54 2011 -0800 +++ b/include/SDL.h Thu Jan 27 22:44:08 2011 -0800 @@ -116,7 +116,6 @@ #define SDL_INIT_JOYSTICK 0x00000200 #define SDL_INIT_HAPTIC 0x00001000 #define SDL_INIT_NOPARACHUTE 0x00100000 /**< Don't catch fatal signals */ -#define SDL_INIT_EVENTTHREAD 0x01000000 /**< Not supported on all OS's */ #define SDL_INIT_EVERYTHING 0x0000FFFF /*@}*/ diff -r 0ec550f04bbc -r dc0dfdd58f27 include/SDL_video.h --- a/include/SDL_video.h Thu Jan 27 20:51:54 2011 -0800 +++ b/include/SDL_video.h Thu Jan 27 22:44:08 2011 -0800 @@ -278,8 +278,6 @@ * \param driver_name Initialize a specific driver by name, or NULL for the * default video driver. * - * \param flags FIXME: Still needed? - * * \return 0 on success, -1 on error * * This function initializes the video subsystem; setting up a connection @@ -288,8 +286,7 @@ * * \sa SDL_VideoQuit() */ -extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name, - Uint32 flags); +extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name); /** * \brief Shuts down the video subsystem. diff -r 0ec550f04bbc -r dc0dfdd58f27 src/SDL.c --- a/src/SDL.c Thu Jan 27 20:51:54 2011 -0800 +++ b/src/SDL.c Thu Jan 27 22:44:08 2011 -0800 @@ -59,7 +59,7 @@ #if !SDL_VIDEO_DISABLED /* Initialize the video/event subsystem */ if ((flags & SDL_INIT_VIDEO) && !(SDL_initialized & SDL_INIT_VIDEO)) { - if (SDL_VideoInit(NULL, (flags & SDL_INIT_EVENTTHREAD)) < 0) { + if (SDL_VideoInit(NULL) < 0) { return (-1); } SDL_initialized |= SDL_INIT_VIDEO; diff -r 0ec550f04bbc -r dc0dfdd58f27 src/events/SDL_events.c --- a/src/events/SDL_events.c Thu Jan 27 20:51:54 2011 -0800 +++ b/src/events/SDL_events.c Thu Jan 27 22:44:08 2011 -0800 @@ -27,12 +27,12 @@ #include "SDL_events.h" #include "SDL_syswm.h" #include "SDL_thread.h" -#include "SDL_sysevents.h" #include "SDL_events_c.h" #include "../timer/SDL_timer_c.h" #if !SDL_JOYSTICK_DISABLED #include "../joystick/SDL_joystick_c.h" #endif +#include "../video/SDL_sysvideo.h" /* Public data -- the event filter */ SDL_EventFilter SDL_EventOK = NULL; @@ -58,36 +58,6 @@ struct SDL_SysWMmsg wmmsg[MAXEVENTS]; } SDL_EventQ; -/* Private data -- event locking structure */ -static struct -{ - SDL_mutex *lock; - int safe; -} SDL_EventLock; - -/* Thread functions */ -static SDL_Thread *SDL_EventThread = NULL; /* Thread handle */ -static SDL_threadID event_thread; /* The event thread id */ - -void -SDL_Lock_EventThread(void) -{ - if (SDL_EventThread && (SDL_ThreadID() != event_thread)) { - /* Grab lock and spin until we're sure event thread stopped */ - SDL_mutexP(SDL_EventLock.lock); - while (!SDL_EventLock.safe) { - SDL_Delay(1); - } - } -} - -void -SDL_Unlock_EventThread(void) -{ - if (SDL_EventThread && (SDL_ThreadID() != event_thread)) { - SDL_mutexV(SDL_EventLock.lock); - } -} static __inline__ SDL_bool SDL_ShouldPollJoystick() @@ -102,106 +72,6 @@ return SDL_FALSE; } -static int SDLCALL -SDL_GobbleEvents(void *unused) -{ - event_thread = SDL_ThreadID(); - - while (SDL_EventQ.active) { - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - - /* Get events from the video subsystem */ - if (_this) { - _this->PumpEvents(_this); - } -#if !SDL_JOYSTICK_DISABLED - /* Check for joystick state change */ - if (SDL_ShouldPollJoystick()) { - SDL_JoystickUpdate(); - } -#endif - - /* Give up the CPU for the rest of our timeslice */ - SDL_EventLock.safe = 1; - SDL_Delay(1); - - /* Check for event locking. - On the P of the lock mutex, if the lock is held, this thread - will wait until the lock is released before continuing. The - safe flag will be set, meaning that the other thread can go - about it's business. The safe flag is reset before the V, - so as soon as the mutex is free, other threads can see that - it's not safe to interfere with the event thread. - */ - SDL_mutexP(SDL_EventLock.lock); - SDL_EventLock.safe = 0; - SDL_mutexV(SDL_EventLock.lock); - } - event_thread = 0; - return (0); -} - -static int -SDL_StartEventThread(Uint32 flags) -{ - /* Reset everything to zero */ - SDL_EventThread = NULL; - SDL_memset(&SDL_EventLock, 0, sizeof(SDL_EventLock)); - - /* Create the lock and set ourselves active */ -#if !SDL_THREADS_DISABLED - SDL_EventQ.lock = SDL_CreateMutex(); - if (SDL_EventQ.lock == NULL) { - return (-1); - } -#endif /* !SDL_THREADS_DISABLED */ - SDL_EventQ.active = 1; - - if ((flags & SDL_INIT_EVENTTHREAD) == SDL_INIT_EVENTTHREAD) { - SDL_EventLock.lock = SDL_CreateMutex(); - if (SDL_EventLock.lock == NULL) { - return (-1); - } - SDL_EventLock.safe = 0; - -#if (defined(__WIN32__) && !defined(_WIN32_WCE)) && !defined(HAVE_LIBC) -#undef SDL_CreateThread - SDL_EventThread = - SDL_CreateThread(SDL_GobbleEvents, NULL, NULL, NULL); -#else - SDL_EventThread = SDL_CreateThread(SDL_GobbleEvents, NULL); -#endif - if (SDL_EventThread == NULL) { - return (-1); - } - } else { - event_thread = 0; - } - return (0); -} - -static void -SDL_StopEventThread(void) -{ - SDL_EventQ.active = 0; - if (SDL_EventThread) { - SDL_WaitThread(SDL_EventThread, NULL); - SDL_EventThread = NULL; - SDL_DestroyMutex(SDL_EventLock.lock); - SDL_EventLock.lock = NULL; - } - if (SDL_EventQ.lock) { - SDL_DestroyMutex(SDL_EventQ.lock); - SDL_EventQ.lock = NULL; - } -} - -SDL_threadID -SDL_EventThreadID(void) -{ - return (event_thread); -} - /* Public functions */ void @@ -209,13 +79,10 @@ { int i; - /* Halt the event thread, if running */ - SDL_StopEventThread(); - - /* Shutdown event handlers */ - SDL_KeyboardQuit(); - SDL_MouseQuit(); - SDL_QuitQuit(); + if (SDL_EventQ.lock) { + SDL_DestroyMutex(SDL_EventQ.lock); + SDL_EventQ.lock = NULL; + } /* Clean out EventQ */ SDL_EventQ.head = 0; @@ -233,12 +100,11 @@ /* This function (and associated calls) may be called more than once */ int -SDL_StartEventLoop(Uint32 flags) +SDL_StartEventLoop(void) { int retcode; /* Clean out the event queue */ - SDL_EventThread = NULL; SDL_EventQ.lock = NULL; SDL_StopEventLoop(); @@ -246,22 +112,15 @@ SDL_EventOK = NULL; SDL_EventState(SDL_SYSWMEVENT, SDL_DISABLE); - /* Initialize event handlers */ - retcode = 0; - retcode += SDL_KeyboardInit(); - retcode += SDL_MouseInit(); - retcode += SDL_TouchInit(); - retcode += SDL_QuitInit(); - if (retcode < 0) { - /* We don't expect them to fail, but... */ + /* Create the lock and set ourselves active */ +#if !SDL_THREADS_DISABLED + SDL_EventQ.lock = SDL_CreateMutex(); + if (SDL_EventQ.lock == NULL) { return (-1); } +#endif /* !SDL_THREADS_DISABLED */ + SDL_EventQ.active = 1; - /* Create the lock and event thread */ - if (SDL_StartEventThread(flags) < 0) { - SDL_StopEventLoop(); - return (-1); - } return (0); } @@ -420,20 +279,18 @@ void SDL_PumpEvents(void) { - if (!SDL_EventThread) { - SDL_VideoDevice *_this = SDL_GetVideoDevice(); + SDL_VideoDevice *_this = SDL_GetVideoDevice(); - /* Get events from the video subsystem */ - if (_this) { - _this->PumpEvents(_this); - } + /* Get events from the video subsystem */ + if (_this) { + _this->PumpEvents(_this); + } #if !SDL_JOYSTICK_DISABLED - /* Check for joystick state change */ - if (SDL_ShouldPollJoystick()) { - SDL_JoystickUpdate(); - } + /* Check for joystick state change */ + if (SDL_ShouldPollJoystick()) { + SDL_JoystickUpdate(); + } #endif - } } /* Public functions */ diff -r 0ec550f04bbc -r dc0dfdd58f27 src/events/SDL_events_c.h --- a/src/events/SDL_events_c.h Thu Jan 27 20:51:54 2011 -0800 +++ b/src/events/SDL_events_c.h Thu Jan 27 22:44:08 2011 -0800 @@ -29,15 +29,12 @@ #include "SDL_touch_c.h" #include "SDL_windowevents_c.h" #include "SDL_gesture_c.h" + /* Start and stop the event processing loop */ -extern int SDL_StartEventLoop(Uint32 flags); +extern int SDL_StartEventLoop(void); extern void SDL_StopEventLoop(void); extern void SDL_QuitInterrupt(void); -extern void SDL_Lock_EventThread(void); -extern void SDL_Unlock_EventThread(void); -extern SDL_threadID SDL_EventThreadID(void); - extern int SDL_SendSysWMEvent(SDL_SysWMmsg * message); extern int SDL_QuitInit(void); diff -r 0ec550f04bbc -r dc0dfdd58f27 src/events/SDL_keyboard.c --- a/src/events/SDL_keyboard.c Thu Jan 27 20:51:54 2011 -0800 +++ b/src/events/SDL_keyboard.c Thu Jan 27 22:44:08 2011 -0800 @@ -26,7 +26,7 @@ #include "SDL_timer.h" #include "SDL_events.h" #include "SDL_events_c.h" -#include "SDL_sysevents.h" +#include "../video/SDL_sysvideo.h" /* Global keyboard information */ diff -r 0ec550f04bbc -r dc0dfdd58f27 src/joystick/SDL_joystick.c --- a/src/joystick/SDL_joystick.c Thu Jan 27 20:51:54 2011 -0800 +++ b/src/joystick/SDL_joystick.c Thu Jan 27 22:44:08 2011 -0800 @@ -30,12 +30,6 @@ #include "../events/SDL_events_c.h" #endif -/* This is used for Quake III Arena */ -#if SDL_EVENTS_DISABLED -#define SDL_Lock_EventThread() -#define SDL_Unlock_EventThread() -#endif - Uint8 SDL_numjoysticks = 0; SDL_Joystick **SDL_joysticks = NULL; static SDL_Joystick *default_joystick = NULL; @@ -165,11 +159,9 @@ /* Add joystick to list */ ++joystick->ref_count; - SDL_Lock_EventThread(); for (i = 0; SDL_joysticks[i]; ++i) /* Skip to next joystick */ ; SDL_joysticks[i] = joystick; - SDL_Unlock_EventThread(); return (joystick); } @@ -379,9 +371,6 @@ return; } - /* Lock the event queue - prevent joystick polling */ - SDL_Lock_EventThread(); - if (joystick == default_joystick) { default_joystick = NULL; } @@ -396,9 +385,6 @@ } } - /* Let the event thread keep running */ - SDL_Unlock_EventThread(); - /* Free the data associated with this joystick */ if (joystick->axes) { SDL_free(joystick->axes); @@ -419,9 +405,7 @@ SDL_JoystickQuit(void) { /* Stop the event polling */ - SDL_Lock_EventThread(); SDL_numjoysticks = 0; - SDL_Unlock_EventThread(); /* Quit the joystick setup */ SDL_SYS_JoystickQuit(); diff -r 0ec550f04bbc -r dc0dfdd58f27 src/video/SDL_video.c --- a/src/video/SDL_video.c Thu Jan 27 20:51:54 2011 -0800 +++ b/src/video/SDL_video.c Thu Jan 27 22:44:08 2011 -0800 @@ -31,7 +31,6 @@ #include "SDL_renderer_gl.h" #include "SDL_renderer_gles.h" #include "SDL_renderer_sw.h" -#include "../events/SDL_sysevents.h" #include "../events/SDL_events_c.h" #if SDL_VIDEO_DRIVER_WINDOWS @@ -172,7 +171,7 @@ * Initialize the video and event subsystems -- determine native pixel format */ int -SDL_VideoInit(const char *driver_name, Uint32 flags) +SDL_VideoInit(const char *driver_name) { SDL_VideoDevice *video; int index; @@ -183,18 +182,12 @@ SDL_VideoQuit(); } - /* Toggle the event thread flags, based on OS requirements */ -#if defined(MUST_THREAD_EVENTS) - flags |= SDL_INIT_EVENTTHREAD; -#elif defined(CANT_THREAD_EVENTS) - if ((flags & SDL_INIT_EVENTTHREAD) == SDL_INIT_EVENTTHREAD) { - SDL_SetError("OS doesn't support threaded events"); - return -1; - } -#endif - /* Start the event loop */ - if (SDL_StartEventLoop(flags) < 0) { + if (SDL_StartEventLoop() < 0 || + SDL_KeyboardInit() < 0 || + SDL_MouseInit() < 0 || + SDL_TouchInit() < 0 || + SDL_QuitInit() < 0) { return -1; } @@ -887,7 +880,7 @@ if (!_this) { /* Initialize the video system if needed */ - if (SDL_VideoInit(NULL, 0) < 0) { + if (SDL_VideoInit(NULL) < 0) { return NULL; } } @@ -2807,8 +2800,13 @@ if (!_this) { return; } + /* Halt event processing before doing anything else */ + SDL_QuitQuit(); + SDL_MouseQuit(); + SDL_KeyboardQuit(); SDL_StopEventLoop(); + SDL_EnableScreenSaver(); /* Clean up the system video */ diff -r 0ec550f04bbc -r dc0dfdd58f27 src/video/directfb/SDL_DirectFB_events.c --- a/src/video/directfb/SDL_DirectFB_events.c Thu Jan 27 20:51:54 2011 -0800 +++ b/src/video/directfb/SDL_DirectFB_events.c Thu Jan 27 22:44:08 2011 -0800 @@ -26,7 +26,6 @@ #include #include "../SDL_sysvideo.h" -#include "../../events/SDL_sysevents.h" #include "../../events/SDL_events_c.h" #include "../../events/SDL_keyboard_c.h" #include "../../events/scancodes_linux.h" diff -r 0ec550f04bbc -r dc0dfdd58f27 src/video/dummy/SDL_nullevents.c --- a/src/video/dummy/SDL_nullevents.c Thu Jan 27 20:51:54 2011 -0800 +++ b/src/video/dummy/SDL_nullevents.c Thu Jan 27 22:44:08 2011 -0800 @@ -24,7 +24,6 @@ /* Being a null driver, there's no event stream. We just define stubs for most of the API. */ -#include "../../events/SDL_sysevents.h" #include "../../events/SDL_events_c.h" #include "SDL_nullvideo.h" diff -r 0ec550f04bbc -r dc0dfdd58f27 src/video/nds/SDL_ndsevents.c --- a/src/video/nds/SDL_ndsevents.c Thu Jan 27 20:51:54 2011 -0800 +++ b/src/video/nds/SDL_ndsevents.c Thu Jan 27 22:44:08 2011 -0800 @@ -28,7 +28,6 @@ #include #include -#include "../../events/SDL_sysevents.h" #include "../../events/SDL_events_c.h" #include "SDL_ndsvideo.h" diff -r 0ec550f04bbc -r dc0dfdd58f27 src/video/pandora/SDL_pandora_events.c --- a/src/video/pandora/SDL_pandora_events.c Thu Jan 27 20:51:54 2011 -0800 +++ b/src/video/pandora/SDL_pandora_events.c Thu Jan 27 22:44:08 2011 -0800 @@ -24,7 +24,6 @@ /* Being a null driver, there's no event stream. We just define stubs for most of the API. */ -#include "../../events/SDL_sysevents.h" #include "../../events/SDL_events_c.h" void diff -r 0ec550f04bbc -r dc0dfdd58f27 src/video/uikit/SDL_uikitevents.m --- a/src/video/uikit/SDL_uikitevents.m Thu Jan 27 20:51:54 2011 -0800 +++ b/src/video/uikit/SDL_uikitevents.m Thu Jan 27 22:44:08 2011 -0800 @@ -21,7 +21,6 @@ */ #include "SDL_config.h" -#include "../../events/SDL_sysevents.h" #include "../../events/SDL_events_c.h" #include "SDL_uikitvideo.h" diff -r 0ec550f04bbc -r dc0dfdd58f27 test/common.c --- a/test/common.c Thu Jan 27 20:51:54 2011 -0800 +++ b/test/common.c Thu Jan 27 22:44:08 2011 -0800 @@ -616,7 +616,7 @@ fprintf(stderr, "\n"); } } - if (SDL_VideoInit(state->videodriver, 0) < 0) { + if (SDL_VideoInit(state->videodriver) < 0) { fprintf(stderr, "Couldn't initialize video driver: %s\n", SDL_GetError()); return SDL_FALSE; diff -r 0ec550f04bbc -r dc0dfdd58f27 test/testshape.c --- a/test/testshape.c Thu Jan 27 20:51:54 2011 -0800 +++ b/test/testshape.c Thu Jan 27 22:44:08 2011 -0800 @@ -60,7 +60,7 @@ exit(-1); } - if(SDL_VideoInit(NULL,0) == -1) { + if(SDL_VideoInit(NULL) == -1) { printf("Could not initialize SDL video.\n"); exit(-2); } diff -r 0ec550f04bbc -r dc0dfdd58f27 test/threadwin.c --- a/test/threadwin.c Thu Jan 27 20:51:54 2011 -0800 +++ b/test/threadwin.c Thu Jan 27 22:44:08 2011 -0800 @@ -241,16 +241,7 @@ video_flags = SDL_SWSURFACE; parsed = 1; while (parsed) { - /* If the threaded option is enabled, and the SDL library hasn't - been compiled with threaded events enabled, then the mouse and - keyboard won't respond. - */ - if ((argc >= 2) && (strcmp(argv[1], "-threaded") == 0)) { - init_flags |= SDL_INIT_EVENTTHREAD; - argc -= 1; - argv += 1; - printf("Running with threaded events\n"); - } else if ((argc >= 2) && (strcmp(argv[1], "-fullscreen") == 0)) { + if ((argc >= 2) && (strcmp(argv[1], "-fullscreen") == 0)) { video_flags |= SDL_FULLSCREEN; argc -= 1; argv += 1; @@ -320,9 +311,8 @@ /* Loop, waiting for QUIT */ while (!done) { - if (!(init_flags & SDL_INIT_EVENTTHREAD)) { - SDL_PumpEvents(); /* Needed when event thread is off */ - } + SDL_PumpEvents(); + if (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, SDL_QUIT, SDL_QUIT)) { done = 1; }