Skip to content

Latest commit

 

History

History
103 lines (81 loc) · 2.16 KB

testsem.c

File metadata and controls

103 lines (81 loc) · 2.16 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 semaphore code */
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include "SDL.h"
#include "SDL_thread.h"
#define NUM_THREADS 10
static SDL_sem *sem;
int alive = 1;
May 7, 2006
May 7, 2006
16
int SDLCALL ThreadFunc(void *data)
Apr 26, 2001
Apr 26, 2001
17
{
Mar 31, 2006
Mar 31, 2006
18
int threadnum = (int)(uintptr_t)data;
Apr 26, 2001
Apr 26, 2001
19
20
while ( alive ) {
SDL_SemWait(sem);
Mar 11, 2006
Mar 11, 2006
21
fprintf(stderr, "Thread number %d has got the semaphore (value = %d)!\n", threadnum, SDL_SemValue(sem));
Apr 26, 2001
Apr 26, 2001
22
23
SDL_Delay(200);
SDL_SemPost(sem);
Mar 11, 2006
Mar 11, 2006
24
fprintf(stderr, "Thread number %d has released the semaphore (value = %d)!\n", threadnum, SDL_SemValue(sem));
Apr 26, 2001
Apr 26, 2001
25
26
SDL_Delay(1); /* For the scheduler */
}
Mar 11, 2006
Mar 11, 2006
27
printf("Thread number %d exiting.\n", threadnum);
Apr 26, 2001
Apr 26, 2001
28
29
30
31
32
33
34
35
return 0;
}
static void killed(int sig)
{
alive = 0;
}
Jan 27, 2011
Jan 27, 2011
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
static void TestWaitTimeout(void)
{
Uint32 start_ticks;
Uint32 end_ticks;
Uint32 duration;
sem = SDL_CreateSemaphore(0);
printf("Waiting 2 seconds on semaphore\n");
start_ticks = SDL_GetTicks();
SDL_SemWaitTimeout(sem, 2000);
end_ticks = SDL_GetTicks();
duration = end_ticks - start_ticks;
/* Accept a little offset in the effective wait */
if (duration > 1900 && duration < 2050)
printf("Wait done.\n");
else
fprintf(stderr, "Wait took %d milliseconds\n", duration);
}
Apr 26, 2001
Apr 26, 2001
58
59
60
int main(int argc, char **argv)
{
SDL_Thread *threads[NUM_THREADS];
Mar 11, 2006
Mar 11, 2006
61
62
uintptr_t i;
int init_sem;
Apr 26, 2001
Apr 26, 2001
63
64
65
if(argc < 2) {
fprintf(stderr,"Usage: %s init_value\n", argv[0]);
Sep 28, 2005
Sep 28, 2005
66
return(1);
Apr 26, 2001
Apr 26, 2001
67
68
69
70
71
}
/* Load the SDL library */
if ( SDL_Init(0) < 0 ) {
fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
Sep 28, 2005
Sep 28, 2005
72
return(1);
Apr 26, 2001
Apr 26, 2001
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
}
signal(SIGTERM, killed);
signal(SIGINT, killed);
init_sem = atoi(argv[1]);
sem = SDL_CreateSemaphore(init_sem);
printf("Running %d threads, semaphore value = %d\n", NUM_THREADS, init_sem);
/* Create all the threads */
for( i = 0; i < NUM_THREADS; ++i ) {
threads[i] = SDL_CreateThread(ThreadFunc, (void*)i);
}
/* Wait 10 seconds */
SDL_Delay(10 * 1000);
/* Wait for all threads to finish */
printf("Waiting for threads to finish\n");
alive = 0;
for( i = 0; i < NUM_THREADS; ++i ) {
SDL_WaitThread(threads[i], NULL);
}
printf("Finished waiting for threads\n");
SDL_DestroySemaphore(sem);
Jan 27, 2011
Jan 27, 2011
98
99
100
TestWaitTimeout();
Sep 28, 2005
Sep 28, 2005
101
SDL_Quit();
Apr 26, 2001
Apr 26, 2001
102
103
return(0);
}