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
14static char volatile time_for_threads_to_die[NUMTHREADS];
15
16/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
17static void quit(int rc)
18{
19	SDL_Quit();
20	exit(rc);
21}
22
23int SDLCALL SubThreadFunc(void *data) {
24	while(! *(int volatile *)data) {
25		; /*SDL_Delay(10);*/  /* do nothing */
26	}
27	return 0;
28}
29
30int 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
59int 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}
92