view TODO @ 3069:caefe2344f65

Date: Thu, 27 Dec 2007 07:38:25 +0000 From: John Bartholomew Subject: [SDL] SDL Semaphore implementation broken on Windows? Hi, Over the past couple of days, I've been battling with SDL, SDL_Mixer and SMPEG to try to find an audio hang bug. I believe I've found the problem, which I think is a race condition inside SDL's semaphore implementation (at least the Windows implementation). The semaphore code uses Windows' built in semaphore functions, but it also maintains a separate count value. This count value is updated with bare increment and decrement operations in SemPost and SemWaitTimeout - no locking primitives to protect them. In tracking down the apparent audio bug, I found that at some point a semaphore's count value was being decremented to -1, which is clearly not a valid value for it to take. I'm still not certain exactly what sequence of operations is occuring for this to happen, but I believe that overall it's a race condition between a thread calling SemPost (which increments the count) and the thread on the other end calling SemWait (which decrements it). I will try to make a test case to verify this, but I'm not sure if I'll be able to (threading errors being difficult to reproduce even in the best circumstances). However, assuming this is the cause of my problems, there is a very simple fix: Windows provides InterlockedIncrement() and InterlockedDecrement() functions to perform increments and decrements which are guaranteed to be atomic. So the fix is in thread/win32/SDL_syssem.c: replace occurrences of --sem->count with InterlockedDecrement(&sem->count); and replace occurrences of ++sem->count with InterlockedIncrement(&sem->count); This is using SDL v1.2.12, built with VC++ 2008 Express, running on a Core 2 duo processor.
author Sam Lantinga <slouken@libsdl.org>
date Tue, 17 Feb 2009 05:39:18 +0000
parents a728b8b779d1
children 4ccdf20bad6f
line wrap: on
line source


1.3 release checklist:
 * Add higher precision timers for profiling
 * Implement YUV texture support
   - in progress, software support is done, Ryan is working on OpenGL shaders
 * Implement desktop video mode change notification?
 * Add OpenGL 3.0 context support
 * Finish multiple display support
 * Open windows on display that is selected when creating a window
 * Create testing plan - becoming more and more important...
   - unit tests for each feature and combination with expected output
     and actual output comparison.
 * Public license for SDL_compat.c, tests, and SDL_main*
 * Verify mouse grab support
 * Properly handle mouse grab with Vista DPI scaling
 * Make sure the mouse is where it's supposed to be when un-grabbed
 * Plan how to handle events on foreign windows
 * Add keyboard enumeration / name query API
 * Implement NET_WM_PING and NET_WM_PID/WM_CLIENT_MACHINE (?)
   - http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html#KILLINGWINDOWS
 * Add a timeout parameter for SDL_WaitEvent() (?)
   - http://lists.libsdl.org/pipermail/sdl-libsdl.org/2008-May/thread.html#65067
 * Implement key repeat at the driver level
 * Add name -> keysym and name -> scancode lookup functions
 * Fix building haptic system on win32
 * Add always on top window styles
 * Add video modes that have an alpha channel?

Wish list for the 1.3 development branch:
http://bugzilla.libsdl.org/

 * Add a way to register custom events
 * DirectInput joystick support needs to be implemented
 * Explicit vertical retrace wait (maybe separate from SDL_Flip?)
 * Shaped windows, windows without borders
 * Multiple display support
 * Add a timestamp to events
 * Add audio input API
 * Add modifier state to key and button events

In the jump from 1.2 to 1.3, we should change the SDL_Rect members to
int and evaluate all the rest of the datatypes.  This is the only place
we should do it though, since the 1.2 series should not break binary
compatibility in this way.

Requests:
 * PCM and CDROM volume control (deprecated, but possible)