Skip to content

Latest commit

 

History

History
78 lines (63 loc) · 1.65 KB

testsem.c

File metadata and controls

78 lines (63 loc) · 1.65 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 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 ThreadFunc(void *data)
{
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
36
37
38
return 0;
}
static void killed(int sig)
{
alive = 0;
}
int main(int argc, char **argv)
{
SDL_Thread *threads[NUM_THREADS];
Mar 11, 2006
Mar 11, 2006
39
40
uintptr_t i;
int init_sem;
Apr 26, 2001
Apr 26, 2001
41
42
43
if(argc < 2) {
fprintf(stderr,"Usage: %s init_value\n", argv[0]);
Sep 28, 2005
Sep 28, 2005
44
return(1);
Apr 26, 2001
Apr 26, 2001
45
46
47
48
49
}
/* 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
50
return(1);
Apr 26, 2001
Apr 26, 2001
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
}
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);
Sep 28, 2005
Sep 28, 2005
76
SDL_Quit();
Apr 26, 2001
Apr 26, 2001
77
78
return(0);
}