1
2/* Test the thread and mutex locking functions
3   Also exercises the system's signal/thread interaction
4*/
5
6#include <signal.h>
7#include <stdio.h>
8
9#include "SDL.h"
10#include "SDL_mutex.h"
11#include "SDL_thread.h"
12
13static SDL_mutex *mutex = NULL;
14static Uint32 mainthread;
15static SDL_Thread *threads[6];
16static volatile int doterminate = 0;
17
18/*
19 * SDL_Quit() shouldn't be used with atexit() directly because
20 *  calling conventions may differ...
21 */
22static void SDL_Quit_Wrapper(void)
23{
24	SDL_Quit();
25}
26
27void printid(void)
28{
29	printf("Process %u:  exiting\n", SDL_ThreadID());
30}
31
32void terminate(int sig)
33{
34	signal(SIGINT, terminate);
35	doterminate = 1;
36}
37void closemutex(int sig)
38{
39	Uint32 id = SDL_ThreadID();
40	int i;
41	printf("Process %u:  Cleaning up...\n", id == mainthread ? 0 : id);
42	for ( i=0; i<6; ++i )
43		SDL_KillThread(threads[i]);
44	SDL_DestroyMutex(mutex);
45	exit(sig);
46}
47int SDLCALL Run(void *data)
48{
49	if ( SDL_ThreadID() == mainthread )
50		signal(SIGTERM, closemutex);
51	while ( 1 ) {
52		printf("Process %u ready to work\n", SDL_ThreadID());
53		if ( SDL_mutexP(mutex) < 0 ) {
54			fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError());
55			exit(1);
56		}
57		printf("Process %u, working!\n", SDL_ThreadID());
58		SDL_Delay(1*1000);
59		printf("Process %u, done!\n", SDL_ThreadID());
60		if ( SDL_mutexV(mutex) < 0 ) {
61			fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError());
62			exit(1);
63		}
64		/* If this sleep isn't done, then threads may starve */
65		SDL_Delay(10);
66		if (SDL_ThreadID() == mainthread && doterminate) {
67			printf("Process %u:  raising SIGTERM\n", SDL_ThreadID());
68			raise(SIGTERM);
69		}
70	}
71	return(0);
72}
73
74int main(int argc, char *argv[])
75{
76	int i;
77	int maxproc = 6;
78
79	/* Load the SDL library */
80	if ( SDL_Init(0) < 0 ) {
81		fprintf(stderr, "%s\n", SDL_GetError());
82		exit(1);
83	}
84	atexit(SDL_Quit_Wrapper);
85
86	if ( (mutex=SDL_CreateMutex()) == NULL ) {
87		fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError());
88		exit(1);
89	}
90
91	mainthread = SDL_ThreadID();
92	printf("Main thread: %u\n", mainthread);
93	atexit(printid);
94	for ( i=0; i<maxproc; ++i ) {
95		if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL )
96			fprintf(stderr, "Couldn't create thread!\n");
97	}
98	signal(SIGINT, terminate);
99	Run(NULL);
100
101	return(0);	/* Never reached */
102}
103