Initial standalone code, some stuff runs
[sdl_omap.git] / test / testlock.c
CommitLineData
e14743d1 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}