Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API.
WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid.
The code is now run through a consistent indent format:
indent -i4 -nut -nsc -br -ce
The headers are being converted to automatically generate doxygen documentation.
/* Test the thread and mutex locking functions
Also exercises the system's signal/thread interaction
*/
#include <signal.h>
#include <stdio.h>
#include "SDL.h"
#include "SDL_mutex.h"
#include "SDL_thread.h"
static SDL_mutex *mutex = NULL;
static Uint32 mainthread;
static SDL_Thread *threads[6];
static volatile int doterminate = 0;
/*
* SDL_Quit() shouldn't be used with atexit() directly because
* calling conventions may differ...
*/
static void
SDL_Quit_Wrapper (void)
{
SDL_Quit ();
}
void
printid (void)
{
printf ("Process %u: exiting\n", SDL_ThreadID ());
}
void
terminate (int sig)
{
signal (SIGINT, terminate);
doterminate = 1;
}
void
closemutex (int sig)
{
Uint32 id = SDL_ThreadID ();
int i;
printf ("Process %u: Cleaning up...\n", id == mainthread ? 0 : id);
for (i = 0; i < 6; ++i)
SDL_KillThread (threads[i]);
SDL_DestroyMutex (mutex);
exit (sig);
}
int SDLCALL
Run (void *data)
{
if (SDL_ThreadID () == mainthread)
signal (SIGTERM, closemutex);
while (1) {
printf ("Process %u ready to work\n", SDL_ThreadID ());
if (SDL_mutexP (mutex) < 0) {
fprintf (stderr, "Couldn't lock mutex: %s", SDL_GetError ());
exit (1);
}
printf ("Process %u, working!\n", SDL_ThreadID ());
SDL_Delay (1 * 1000);
printf ("Process %u, done!\n", SDL_ThreadID ());
if (SDL_mutexV (mutex) < 0) {
fprintf (stderr, "Couldn't unlock mutex: %s", SDL_GetError ());
exit (1);
}
/* 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);
}
}
return (0);
}
int
main (int argc, char *argv[])
{
int i;
int maxproc = 6;
/* Load the SDL library */
if (SDL_Init (0) < 0) {
fprintf (stderr, "%s\n", SDL_GetError ());
exit (1);
}
atexit (SDL_Quit_Wrapper);
if ((mutex = SDL_CreateMutex ()) == NULL) {
fprintf (stderr, "Couldn't create mutex: %s\n", SDL_GetError ());
exit (1);
}
mainthread = SDL_ThreadID ();
printf ("Main thread: %u\n", mainthread);
atexit (printid);
for (i = 0; i < maxproc; ++i) {
if ((threads[i] = SDL_CreateThread (Run, NULL)) == NULL)
fprintf (stderr, "Couldn't create thread!\n");
}
signal (SIGINT, terminate);
Run (NULL);
return (0); /* Never reached */
}