SDL 1.2.13
[crawl:crawl-sdl.git] / test / torturethread.c
1
2 /* Simple test of the SDL threading code */
3
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <signal.h>
7 #include <string.h>
8
9 #include "SDL.h"
10 #include "SDL_thread.h"
11
12 #define NUMTHREADS 10
13
14 static char volatile time_for_threads_to_die[NUMTHREADS];
15
16 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
17 static void quit(int rc)
18 {
19         SDL_Quit();
20         exit(rc);
21 }
22
23 int SDLCALL SubThreadFunc(void *data) {
24         while(! *(int volatile *)data) {
25                 ; /*SDL_Delay(10);*/  /* do nothing */
26         }
27         return 0;
28 }
29
30 int SDLCALL ThreadFunc(void *data) {
31         SDL_Thread *sub_threads[NUMTHREADS];
32         int flags[NUMTHREADS];
33         int i;
34         int tid = (int)(uintptr_t)data;
35
36         fprintf(stderr, "Creating Thread %d\n", tid);
37
38         for(i = 0; i < NUMTHREADS; i++) {
39                 flags[i] = 0;
40                 sub_threads[i] = SDL_CreateThread(SubThreadFunc, &flags[i]);
41         }
42
43         printf("Thread '%d' waiting for signal\n", tid);
44         while(time_for_threads_to_die[tid] != 1) {
45                 ; /* do nothing */
46         }
47
48         printf("Thread '%d' sending signals to subthreads\n", tid);
49         for(i = 0; i <  NUMTHREADS; i++) {
50                 flags[i] = 1;
51                 SDL_WaitThread(sub_threads[i], NULL);
52         }
53
54         printf("Thread '%d' exiting!\n", tid);
55
56         return 0;
57 }
58
59 int main(int argc, char *argv[])
60 {
61         SDL_Thread *threads[NUMTHREADS];
62         int i;
63
64         /* Load the SDL library */
65         if ( SDL_Init(0) < 0 ) {
66                 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
67                 return(1);
68         }
69
70         signal(SIGSEGV, SIG_DFL);
71         for(i = 0; i < NUMTHREADS; i++) {
72                 time_for_threads_to_die[i] = 0;
73                 threads[i] = SDL_CreateThread(ThreadFunc, (void *)(uintptr_t)i);
74         
75                 if ( threads[i] == NULL ) {
76                         fprintf(stderr,
77                         "Couldn't create thread: %s\n", SDL_GetError());
78                         quit(1);
79                 }
80         }
81
82         for(i = 0; i < NUMTHREADS; i++) {
83                 time_for_threads_to_die[i] = 1;
84         }
85
86         for(i = 0; i < NUMTHREADS; i++) {
87                 SDL_WaitThread(threads[i], NULL);
88         }
89         SDL_Quit();
90         return(0);
91 }