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

Latest commit

 

History

History
130 lines (105 loc) · 3.19 KB

testsem.c

File metadata and controls

130 lines (105 loc) · 3.19 KB
 
Jun 22, 2011
Jun 22, 2011
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely.
*/
/* 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;
int SDLCALL
ThreadFunc(void *data)
{
int threadnum = (int) (uintptr_t) data;
while (alive) {
SDL_SemWait(sem);
fprintf(stderr,
"Thread number %d has got the semaphore (value = %d)!\n",
threadnum, SDL_SemValue(sem));
SDL_Delay(200);
SDL_SemPost(sem);
fprintf(stderr,
"Thread number %d has released the semaphore (value = %d)!\n",
threadnum, SDL_SemValue(sem));
SDL_Delay(1); /* For the scheduler */
}
printf("Thread number %d exiting.\n", threadnum);
return 0;
}
static void
killed(int sig)
{
alive = 0;
}
static void
TestWaitTimeout(void)
{
Uint32 start_ticks;
Uint32 end_ticks;
Uint32 duration;
Feb 21, 2012
Feb 21, 2012
59
int retval;
Jun 22, 2011
Jun 22, 2011
60
61
62
63
64
sem = SDL_CreateSemaphore(0);
printf("Waiting 2 seconds on semaphore\n");
start_ticks = SDL_GetTicks();
Feb 21, 2012
Feb 21, 2012
65
retval = SDL_SemWaitTimeout(sem, 2000);
Jun 22, 2011
Jun 22, 2011
66
67
68
69
70
71
72
73
74
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
75
76
77
78
/* 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);
Jun 22, 2011
Jun 22, 2011
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
}
int
main(int argc, char **argv)
{
SDL_Thread *threads[NUM_THREADS];
uintptr_t i;
int init_sem;
if (argc < 2) {
fprintf(stderr, "Usage: %s init_value\n", argv[0]);
return (1);
}
/* Load the SDL library */
if (SDL_Init(0) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}
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) {
Oct 2, 2011
Oct 2, 2011
108
109
110
char name[64];
SDL_snprintf(name, sizeof (name), "Thread%u", (unsigned int) i);
threads[i] = SDL_CreateThread(ThreadFunc, name, (void *) i);
Jun 22, 2011
Jun 22, 2011
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
}
/* 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);
TestWaitTimeout();
SDL_Quit();
return (0);
}