testsem.c
Go to the documentation of this file.
/*
Copyright (C) 1997-2018 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"
#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);
SDL_Log("Thread number %d has got the semaphore (value = %d)!\n",
threadnum, SDL_SemValue(sem));
SDL_Delay(200);
SDL_SemPost(sem);
SDL_Log("Thread number %d has released the semaphore (value = %d)!\n",
threadnum, SDL_SemValue(sem));
SDL_Delay(1); /* For the scheduler */
}
SDL_Log("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;
int retval;
sem = SDL_CreateSemaphore(0);
SDL_Log("Waiting 2 seconds on semaphore\n");
start_ticks = SDL_GetTicks();
retval = 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)
SDL_Log("Wait done.\n");
else
SDL_Log("Wait took %d milliseconds\n", duration);
/* Check to make sure the return value indicates timed out */
if (retval != SDL_MUTEX_TIMEDOUT)
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_SemWaitTimeout returned: %d; expected: %d\n", retval, SDL_MUTEX_TIMEDOUT);
}
int
main(int argc, char **argv)
{
SDL_Thread *threads[NUM_THREADS];
uintptr_t i;
int init_sem;
/* Enable standard application logging */
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
if (argc < 2) {
SDL_Log("Usage: %s init_value\n", argv[0]);
return (1);
}
/* Load the SDL library */
if (SDL_Init(0) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "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);
SDL_Log("Running %d threads, semaphore value = %d\n", NUM_THREADS,
init_sem);
/* Create all the threads */
for (i = 0; i < NUM_THREADS; ++i) {
char name[64];
SDL_snprintf(name, sizeof (name), "Thread%u", (unsigned int) i);
threads[i] = SDL_CreateThread(ThreadFunc, name, (void *) i);
}
/* Wait 10 seconds */
SDL_Delay(10 * 1000);
/* Wait for all threads to finish */
SDL_Log("Waiting for threads to finish\n");
alive = 0;
for (i = 0; i < NUM_THREADS; ++i) {
SDL_WaitThread(threads[i], NULL);
}
SDL_Log("Finished waiting for threads\n");
SDL_DestroySemaphore(sem);
TestWaitTimeout();
SDL_Quit();
return (0);
}
alive
int alive
Definition: testsem.c:24
SDL_GetError
#define SDL_GetError
Definition: SDL_dynapi_overrides.h:113
NUM_THREADS
#define NUM_THREADS
Definition: testsem.c:21
ThreadFunc
int ThreadFunc(void *data)
Definition: testsem.c:27
SDL_CreateSemaphore
#define SDL_CreateSemaphore
Definition: SDL_dynapi_overrides.h:264
main
int main(int argc, char **argv)
Definition: testsem.c:79
TestWaitTimeout
static void TestWaitTimeout(void)
Definition: testsem.c:51
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
killed
static void killed(int sig)
Definition: testsem.c:45
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
sem
static SDL_sem * sem
Definition: testsem.c:23
SDL_MUTEX_TIMEDOUT
#define SDL_MUTEX_TIMEDOUT
Definition: SDL_mutex.h:44
name
GLuint const GLchar * name
Definition: SDL_opengl_glext.h:660
SDL_SemPost
#define SDL_SemPost
Definition: SDL_dynapi_overrides.h:269
SDL_LogError
#define SDL_LogError
Definition: SDL_dynapi_overrides.h:36
retval
SDL_bool retval
Definition: testgamecontroller.c:65
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
SDL_SemWaitTimeout
#define SDL_SemWaitTimeout
Definition: SDL_dynapi_overrides.h:268
SDL_GetTicks
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
SDL_Quit
#define SDL_Quit
Definition: SDL_dynapi_overrides.h:58
uintptr_t
unsigned int uintptr_t
Definition: SDL_config_windows.h:70
SDL_LOG_PRIORITY_INFO
Definition: SDL_log.h:106
SDL_CreateThread
#define SDL_CreateThread
Definition: SDL_dynapi_overrides.h:41
SDL_Delay
#define SDL_Delay
Definition: SDL_dynapi_overrides.h:486
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_LogSetPriority
#define SDL_LogSetPriority
Definition: SDL_dynapi_overrides.h:236
NULL
#define NULL
Definition: begin_code.h:164
threads
static SDL_Thread * threads[6]
Definition: testlock.c:25
SDL_SemWait
#define SDL_SemWait
Definition: SDL_dynapi_overrides.h:266
SDL_DestroySemaphore
#define SDL_DestroySemaphore
Definition: SDL_dynapi_overrides.h:265
SDL_snprintf
#define SDL_snprintf
Definition: SDL_dynapi_overrides.h:40
SDL_Thread
Definition: SDL_thread_c.h:54
SDL_Init
#define SDL_Init
Definition: SDL_dynapi_overrides.h:54
SDL_SemValue
#define SDL_SemValue
Definition: SDL_dynapi_overrides.h:270
SDL.h
SDLCALL
#define SDLCALL
Definition: SDL_internal.h:45
SDL_LOG_CATEGORY_APPLICATION
Definition: SDL_log.h:66
SDL_WaitThread
#define SDL_WaitThread
Definition: SDL_dynapi_overrides.h:478