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

Latest commit

 

History

History
110 lines (96 loc) · 2.53 KB

testlock.c

File metadata and controls

110 lines (96 loc) · 2.53 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 17, 2006
May 17, 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...
*/
May 28, 2006
May 28, 2006
22
23
static void
SDL_Quit_Wrapper (void)
Sep 28, 2005
Sep 28, 2005
24
{
May 28, 2006
May 28, 2006
25
SDL_Quit ();
Sep 28, 2005
Sep 28, 2005
26
27
}
May 28, 2006
May 28, 2006
28
29
void
printid (void)
Apr 26, 2001
Apr 26, 2001
30
{
May 28, 2006
May 28, 2006
31
printf ("Process %u: exiting\n", SDL_ThreadID ());
Apr 26, 2001
Apr 26, 2001
32
}
May 28, 2006
May 28, 2006
33
34
35
void
terminate (int sig)
Apr 26, 2001
Apr 26, 2001
36
{
May 28, 2006
May 28, 2006
37
38
signal (SIGINT, terminate);
doterminate = 1;
Apr 26, 2001
Apr 26, 2001
39
}
May 28, 2006
May 28, 2006
40
41
42
void
closemutex (int sig)
Apr 26, 2001
Apr 26, 2001
43
{
May 28, 2006
May 28, 2006
44
45
46
47
48
49
50
Uint32 id = SDL_ThreadID ();
int i;
printf ("Process %u: Cleaning up...\n", id == mainthread ? 0 : id);
for (i = 0; i < 6; ++i)
SDL_KillThread (threads[i]);
SDL_DestroyMutex (mutex);
exit (sig);
Apr 26, 2001
Apr 26, 2001
51
}
May 28, 2006
May 28, 2006
52
53
54
int SDLCALL
Run (void *data)
Apr 26, 2001
Apr 26, 2001
55
{
May 28, 2006
May 28, 2006
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
if (SDL_ThreadID () == mainthread)
signal (SIGTERM, closemutex);
while (1) {
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);
if (SDL_ThreadID () == mainthread && doterminate) {
printf ("Process %u: raising SIGTERM\n", SDL_ThreadID ());
raise (SIGTERM);
}
}
return (0);
Apr 26, 2001
Apr 26, 2001
79
80
}
May 28, 2006
May 28, 2006
81
82
int
main (int argc, char *argv[])
Apr 26, 2001
Apr 26, 2001
83
{
May 28, 2006
May 28, 2006
84
85
int i;
int maxproc = 6;
Apr 26, 2001
Apr 26, 2001
86
May 28, 2006
May 28, 2006
87
88
89
90
91
92
/* 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
93
May 28, 2006
May 28, 2006
94
95
96
97
if ((mutex = SDL_CreateMutex ()) == NULL) {
fprintf (stderr, "Couldn't create mutex: %s\n", SDL_GetError ());
exit (1);
}
Apr 26, 2001
Apr 26, 2001
98
May 28, 2006
May 28, 2006
99
100
101
102
103
104
105
106
107
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
108
May 28, 2006
May 28, 2006
109
return (0); /* Never reached */
Apr 26, 2001
Apr 26, 2001
110
}