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