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

Latest commit

 

History

History
111 lines (97 loc) · 2.5 KB

testlock.c

File metadata and controls

111 lines (97 loc) · 2.5 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Test the thread and mutex locking functions
Also exercises the system's signal/thread interaction
*/
#include <signal.h>
#include <stdio.h>
#include "SDL.h"
#include "SDL_mutex.h"
#include "SDL_thread.h"
static SDL_mutex *mutex = NULL;
static Uint32 mainthread;
static SDL_Thread *threads[6];
May 7, 2006
May 7, 2006
16
static volatile int doterminate = 0;
Apr 26, 2001
Apr 26, 2001
17
Sep 28, 2005
Sep 28, 2005
18
19
20
21
/*
* SDL_Quit() shouldn't be used with atexit() directly because
* calling conventions may differ...
*/
Jul 10, 2006
Jul 10, 2006
22
23
static void
SDL_Quit_Wrapper(void)
Sep 28, 2005
Sep 28, 2005
24
{
Jul 10, 2006
Jul 10, 2006
25
SDL_Quit();
Sep 28, 2005
Sep 28, 2005
26
27
}
Jul 10, 2006
Jul 10, 2006
28
29
void
printid(void)
Apr 26, 2001
Apr 26, 2001
30
{
Jul 10, 2006
Jul 10, 2006
31
printf("Process %u: exiting\n", SDL_ThreadID());
Apr 26, 2001
Apr 26, 2001
32
}
Jul 10, 2006
Jul 10, 2006
33
34
35
void
terminate(int sig)
Apr 26, 2001
Apr 26, 2001
36
{
Jul 10, 2006
Jul 10, 2006
37
38
signal(SIGINT, terminate);
doterminate = 1;
Apr 26, 2001
Apr 26, 2001
39
}
Jul 10, 2006
Jul 10, 2006
40
41
42
void
closemutex(int sig)
Apr 26, 2001
Apr 26, 2001
43
{
Jul 10, 2006
Jul 10, 2006
44
45
46
Uint32 id = SDL_ThreadID();
int i;
printf("Process %u: Cleaning up...\n", id == mainthread ? 0 : id);
Nov 24, 2008
Nov 24, 2008
47
doterminate = 1;
Jul 10, 2006
Jul 10, 2006
48
for (i = 0; i < 6; ++i)
Nov 24, 2008
Nov 24, 2008
49
SDL_WaitThread(threads[i], NULL);
Jul 10, 2006
Jul 10, 2006
50
51
SDL_DestroyMutex(mutex);
exit(sig);
Apr 26, 2001
Apr 26, 2001
52
}
Jul 10, 2006
Jul 10, 2006
53
54
55
int SDLCALL
Run(void *data)
Apr 26, 2001
Apr 26, 2001
56
{
Jul 10, 2006
Jul 10, 2006
57
58
if (SDL_ThreadID() == mainthread)
signal(SIGTERM, closemutex);
Nov 24, 2008
Nov 24, 2008
59
while (!doterminate) {
Jul 10, 2006
Jul 10, 2006
60
61
62
63
64
65
66
67
68
69
70
71
72
73
printf("Process %u ready to work\n", SDL_ThreadID());
if (SDL_mutexP(mutex) < 0) {
fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError());
exit(1);
}
printf("Process %u, working!\n", SDL_ThreadID());
SDL_Delay(1 * 1000);
printf("Process %u, done!\n", SDL_ThreadID());
if (SDL_mutexV(mutex) < 0) {
fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError());
exit(1);
}
/* If this sleep isn't done, then threads may starve */
SDL_Delay(10);
Nov 24, 2008
Nov 24, 2008
74
75
76
77
}
if (SDL_ThreadID() == mainthread && doterminate) {
printf("Process %u: raising SIGTERM\n", SDL_ThreadID());
raise(SIGTERM);
Jul 10, 2006
Jul 10, 2006
78
79
}
return (0);
Apr 26, 2001
Apr 26, 2001
80
81
}
Jul 10, 2006
Jul 10, 2006
82
83
int
main(int argc, char *argv[])
Apr 26, 2001
Apr 26, 2001
84
{
Jul 10, 2006
Jul 10, 2006
85
86
int i;
int maxproc = 6;
Apr 26, 2001
Apr 26, 2001
87
Jul 10, 2006
Jul 10, 2006
88
89
90
91
92
93
/* Load the SDL library */
if (SDL_Init(0) < 0) {
fprintf(stderr, "%s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit_Wrapper);
Apr 26, 2001
Apr 26, 2001
94
Jul 10, 2006
Jul 10, 2006
95
96
97
98
if ((mutex = SDL_CreateMutex()) == NULL) {
fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError());
exit(1);
}
Apr 26, 2001
Apr 26, 2001
99
Jul 10, 2006
Jul 10, 2006
100
101
102
103
104
105
106
107
108
mainthread = SDL_ThreadID();
printf("Main thread: %u\n", mainthread);
atexit(printid);
for (i = 0; i < maxproc; ++i) {
if ((threads[i] = SDL_CreateThread(Run, NULL)) == NULL)
fprintf(stderr, "Couldn't create thread!\n");
}
signal(SIGINT, terminate);
Run(NULL);
Apr 26, 2001
Apr 26, 2001
109
Jul 10, 2006
Jul 10, 2006
110
return (0); /* Never reached */
Apr 26, 2001
Apr 26, 2001
111
}