Skip to content

Latest commit

 

History

History
108 lines (85 loc) · 2.38 KB

testsem.c

File metadata and controls

108 lines (85 loc) · 2.38 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
static void TestWaitTimeout(void)
{
Uint32 start_ticks;
Uint32 end_ticks;
Uint32 duration;
Feb 21, 2012
Feb 21, 2012
41
int retval;
Jan 27, 2011
Jan 27, 2011
42
43
44
45
46
sem = SDL_CreateSemaphore(0);
printf("Waiting 2 seconds on semaphore\n");
start_ticks = SDL_GetTicks();
Feb 21, 2012
Feb 21, 2012
47
retval = SDL_SemWaitTimeout(sem, 2000);
Jan 27, 2011
Jan 27, 2011
48
49
50
51
52
53
54
55
56
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);
Feb 21, 2012
Feb 21, 2012
57
58
59
60
/* Check to make sure the return value indicates timed out */
if (retval != SDL_MUTEX_TIMEDOUT)
fprintf(stderr, "SDL_SemWaitTimeout returned: %d; expected: %d\n", retval, SDL_MUTEX_TIMEDOUT);
Jan 27, 2011
Jan 27, 2011
61
62
}
Apr 26, 2001
Apr 26, 2001
63
64
65
int main(int argc, char **argv)
{
SDL_Thread *threads[NUM_THREADS];
Mar 11, 2006
Mar 11, 2006
66
67
uintptr_t i;
int init_sem;
Apr 26, 2001
Apr 26, 2001
68
69
70
if(argc < 2) {
fprintf(stderr,"Usage: %s init_value\n", argv[0]);
Sep 28, 2005
Sep 28, 2005
71
return(1);
Apr 26, 2001
Apr 26, 2001
72
73
74
75
76
}
/* 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
77
return(1);
Apr 26, 2001
Apr 26, 2001
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
}
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
103
104
105
TestWaitTimeout();
Sep 28, 2005
Sep 28, 2005
106
SDL_Quit();
Apr 26, 2001
Apr 26, 2001
107
108
return(0);
}