Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
96 lines (76 loc) · 2.03 KB

torturethread.c

File metadata and controls

96 lines (76 loc) · 2.03 KB
 
Apr 26, 2001
Apr 26, 2001
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];
Sep 28, 2005
Sep 28, 2005
16
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
May 28, 2006
May 28, 2006
17
static void
May 29, 2006
May 29, 2006
18
quit(int rc)
Sep 28, 2005
Sep 28, 2005
19
{
May 29, 2006
May 29, 2006
20
21
SDL_Quit();
exit(rc);
Sep 28, 2005
Sep 28, 2005
22
23
}
May 28, 2006
May 28, 2006
24
int SDLCALL
May 29, 2006
May 29, 2006
25
SubThreadFunc(void *data)
May 28, 2006
May 28, 2006
26
27
28
29
30
{
while (!*(int volatile *) data) {
; /*SDL_Delay(10); *//* do nothing */
}
return 0;
Apr 26, 2001
Apr 26, 2001
31
32
}
May 28, 2006
May 28, 2006
33
int SDLCALL
May 29, 2006
May 29, 2006
34
ThreadFunc(void *data)
May 28, 2006
May 28, 2006
35
36
37
38
39
{
SDL_Thread *sub_threads[NUMTHREADS];
int flags[NUMTHREADS];
int i;
int tid = (int) (uintptr_t) data;
Apr 26, 2001
Apr 26, 2001
40
May 29, 2006
May 29, 2006
41
fprintf(stderr, "Creating Thread %d\n", tid);
Apr 26, 2001
Apr 26, 2001
42
May 28, 2006
May 28, 2006
43
44
for (i = 0; i < NUMTHREADS; i++) {
flags[i] = 0;
May 29, 2006
May 29, 2006
45
sub_threads[i] = SDL_CreateThread(SubThreadFunc, &flags[i]);
May 28, 2006
May 28, 2006
46
}
Apr 26, 2001
Apr 26, 2001
47
May 29, 2006
May 29, 2006
48
printf("Thread '%d' waiting for signal\n", tid);
May 28, 2006
May 28, 2006
49
50
51
while (time_for_threads_to_die[tid] != 1) {
; /* do nothing */
}
Apr 26, 2001
Apr 26, 2001
52
May 29, 2006
May 29, 2006
53
printf("Thread '%d' sending signals to subthreads\n", tid);
May 28, 2006
May 28, 2006
54
55
for (i = 0; i < NUMTHREADS; i++) {
flags[i] = 1;
May 29, 2006
May 29, 2006
56
SDL_WaitThread(sub_threads[i], NULL);
May 28, 2006
May 28, 2006
57
}
Apr 26, 2001
Apr 26, 2001
58
May 29, 2006
May 29, 2006
59
printf("Thread '%d' exiting!\n", tid);
Apr 26, 2001
Apr 26, 2001
60
May 28, 2006
May 28, 2006
61
return 0;
Apr 26, 2001
Apr 26, 2001
62
63
}
May 28, 2006
May 28, 2006
64
int
May 29, 2006
May 29, 2006
65
main(int argc, char *argv[])
Apr 26, 2001
Apr 26, 2001
66
{
May 28, 2006
May 28, 2006
67
68
69
70
SDL_Thread *threads[NUMTHREADS];
int i;
/* Load the SDL library */
May 29, 2006
May 29, 2006
71
72
if (SDL_Init(0) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
May 28, 2006
May 28, 2006
73
74
75
return (1);
}
May 29, 2006
May 29, 2006
76
signal(SIGSEGV, SIG_DFL);
May 28, 2006
May 28, 2006
77
78
for (i = 0; i < NUMTHREADS; i++) {
time_for_threads_to_die[i] = 0;
May 29, 2006
May 29, 2006
79
threads[i] = SDL_CreateThread(ThreadFunc, (void *) (uintptr_t) i);
May 28, 2006
May 28, 2006
80
81
if (threads[i] == NULL) {
May 29, 2006
May 29, 2006
82
83
fprintf(stderr, "Couldn't create thread: %s\n", SDL_GetError());
quit(1);
May 28, 2006
May 28, 2006
84
85
86
87
88
89
90
91
}
}
for (i = 0; i < NUMTHREADS; i++) {
time_for_threads_to_die[i] = 1;
}
for (i = 0; i < NUMTHREADS; i++) {
May 29, 2006
May 29, 2006
92
SDL_WaitThread(threads[i], NULL);
May 28, 2006
May 28, 2006
93
}
May 29, 2006
May 29, 2006
94
SDL_Quit();
May 28, 2006
May 28, 2006
95
return (0);
Apr 26, 2001
Apr 26, 2001
96
}