SDL
2.0
testthread.c
Go to the documentation of this file.
1
/*
2
Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
3
4
This software is provided 'as-is', without any express or implied
5
warranty. In no event will the authors be held liable for any damages
6
arising from the use of this software.
7
8
Permission is granted to anyone to use this software for any purpose,
9
including commercial applications, and to alter it and redistribute it
10
freely.
11
*/
12
13
/* Simple test of the SDL threading code */
14
15
#include <stdio.h>
16
#include <stdlib.h>
17
#include <signal.h>
18
19
#include "
SDL.h
"
20
21
static
SDL_TLSID
tls
;
22
static
int
alive
= 0;
23
static
int
testprio
= 0;
24
25
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
26
static
void
27
quit
(
int
rc)
28
{
29
SDL_Quit
();
30
exit(rc);
31
}
32
33
static
const
char
*
34
getprioritystr
(
SDL_ThreadPriority
priority)
35
{
36
switch
(priority)
37
{
38
case
SDL_THREAD_PRIORITY_LOW
:
return
"SDL_THREAD_PRIORITY_LOW"
;
39
case
SDL_THREAD_PRIORITY_NORMAL
:
return
"SDL_THREAD_PRIORITY_NORMAL"
;
40
case
SDL_THREAD_PRIORITY_HIGH
:
return
"SDL_THREAD_PRIORITY_HIGH"
;
41
case
SDL_THREAD_PRIORITY_TIME_CRITICAL
:
return
"SDL_THREAD_PRIORITY_TIME_CRITICAL"
;
42
}
43
44
return
"???"
;
45
}
46
47
int
SDLCALL
48
ThreadFunc
(
void
*
data
)
49
{
50
SDL_ThreadPriority
prio =
SDL_THREAD_PRIORITY_NORMAL
;
51
52
SDL_TLSSet
(
tls
,
"baby thread"
,
NULL
);
53
SDL_Log
(
"Started thread %s: My thread id is %lu, thread data = %s\n"
,
54
(
char
*)
data
,
SDL_ThreadID
(), (
const
char
*)
SDL_TLSGet
(
tls
));
55
while
(
alive
) {
56
SDL_Log
(
"Thread '%s' is alive!\n"
, (
char
*)
data
);
57
58
if
(
testprio
) {
59
SDL_Log
(
"SDL_SetThreadPriority(%s):%d\n"
,
getprioritystr
(prio),
SDL_SetThreadPriority
(prio));
60
if
(++prio >
SDL_THREAD_PRIORITY_TIME_CRITICAL
)
61
prio =
SDL_THREAD_PRIORITY_LOW
;
62
}
63
64
SDL_Delay
(1 * 1000);
65
}
66
SDL_Log
(
"Thread '%s' exiting!\n"
, (
char
*)
data
);
67
return
(0);
68
}
69
70
static
void
71
killed
(
int
sig)
72
{
73
SDL_Log
(
"Killed with SIGTERM, waiting 5 seconds to exit\n"
);
74
SDL_Delay
(5 * 1000);
75
alive
= 0;
76
quit
(0);
77
}
78
79
int
80
main
(
int
argc,
char
*argv[])
81
{
82
int
arg = 1;
83
SDL_Thread
*thread;
84
85
/* Enable standard application logging */
86
SDL_LogSetPriority
(
SDL_LOG_CATEGORY_APPLICATION
,
SDL_LOG_PRIORITY_INFO
);
87
88
/* Load the SDL library */
89
if
(
SDL_Init
(0) < 0) {
90
SDL_LogError
(
SDL_LOG_CATEGORY_APPLICATION
,
"Couldn't initialize SDL: %s\n"
,
SDL_GetError
());
91
return
(1);
92
}
93
94
while
(argv[arg] && *argv[arg] ==
'-'
) {
95
if
(
SDL_strcmp
(argv[arg],
"--prio"
) == 0) {
96
testprio
= 1;
97
}
98
++arg;
99
}
100
101
tls
=
SDL_TLSCreate
();
102
SDL_assert
(
tls
);
103
SDL_TLSSet
(
tls
,
"main thread"
,
NULL
);
104
SDL_Log
(
"Main thread data initially: %s\n"
, (
const
char
*)
SDL_TLSGet
(
tls
));
105
106
alive
= 1;
107
thread =
SDL_CreateThread
(
ThreadFunc
,
"One"
,
"#1"
);
108
if
(thread ==
NULL
) {
109
SDL_LogError
(
SDL_LOG_CATEGORY_APPLICATION
,
"Couldn't create thread: %s\n"
,
SDL_GetError
());
110
quit
(1);
111
}
112
SDL_Delay
(5 * 1000);
113
SDL_Log
(
"Waiting for thread #1\n"
);
114
alive
= 0;
115
SDL_WaitThread
(thread,
NULL
);
116
117
SDL_Log
(
"Main thread data finally: %s\n"
, (
const
char
*)
SDL_TLSGet
(
tls
));
118
119
alive
= 1;
120
signal(SIGTERM,
killed
);
121
thread =
SDL_CreateThread
(
ThreadFunc
,
"Two"
,
"#2"
);
122
if
(thread ==
NULL
) {
123
SDL_LogError
(
SDL_LOG_CATEGORY_APPLICATION
,
"Couldn't create thread: %s\n"
,
SDL_GetError
());
124
quit
(1);
125
}
126
raise
(SIGTERM);
127
128
SDL_Quit
();
/* Never reached */
129
return
(0);
/* Never reached */
130
}
SDL.h
SDL_SetThreadPriority
#define SDL_SetThreadPriority
Definition:
SDL_dynapi_overrides.h:477
SDL_GetError
#define SDL_GetError
Definition:
SDL_dynapi_overrides.h:113
SDL_TLSSet
#define SDL_TLSSet
Definition:
SDL_dynapi_overrides.h:482
SDL_LOG_CATEGORY_APPLICATION
Definition:
SDL_log.h:66
NULL
#define NULL
Definition:
begin_code.h:167
testprio
static int testprio
Definition:
testthread.c:23
killed
static void killed(int sig)
Definition:
testthread.c:71
SDL_THREAD_PRIORITY_TIME_CRITICAL
Definition:
SDL_thread.h:63
SDLCALL
#define SDLCALL
Definition:
SDL_internal.h:49
SDL_THREAD_PRIORITY_HIGH
Definition:
SDL_thread.h:62
SDL_Thread
Definition:
SDL_thread_c.h:54
SDL_THREAD_PRIORITY_LOW
Definition:
SDL_thread.h:60
SDL_LogError
#define SDL_LogError
Definition:
SDL_dynapi_overrides.h:36
SDL_TLSID
unsigned int SDL_TLSID
Definition:
SDL_thread.h:52
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition:
SDL_opengl.h:1973
main
int main(int argc, char *argv[])
Definition:
testthread.c:80
SDL_Log
#define SDL_Log
Definition:
SDL_dynapi_overrides.h:31
SDL_Quit
#define SDL_Quit
Definition:
SDL_dynapi_overrides.h:58
alive
static int alive
Definition:
testthread.c:22
SDL_Delay
#define SDL_Delay
Definition:
SDL_dynapi_overrides.h:486
SDL_CreateThread
#define SDL_CreateThread
Definition:
SDL_dynapi_overrides.h:41
SDL_assert
#define SDL_assert(condition)
Definition:
SDL_assert.h:169
SDL_TLSGet
#define SDL_TLSGet
Definition:
SDL_dynapi_overrides.h:481
SDL_TLSCreate
#define SDL_TLSCreate
Definition:
SDL_dynapi_overrides.h:480
SDL_LOG_PRIORITY_INFO
Definition:
SDL_log.h:106
SDL_LogSetPriority
#define SDL_LogSetPriority
Definition:
SDL_dynapi_overrides.h:236
SDL_THREAD_PRIORITY_NORMAL
Definition:
SDL_thread.h:61
tls
static SDL_TLSID tls
Definition:
testthread.c:21
quit
static void quit(int rc)
Definition:
testthread.c:27
SDL_strcmp
#define SDL_strcmp
Definition:
SDL_dynapi_overrides.h:417
SDL_Init
#define SDL_Init
Definition:
SDL_dynapi_overrides.h:54
SDL_ThreadPriority
SDL_ThreadPriority
Definition:
SDL_thread.h:59
SDL_ThreadID
#define SDL_ThreadID
Definition:
SDL_dynapi_overrides.h:475
SDL_WaitThread
#define SDL_WaitThread
Definition:
SDL_dynapi_overrides.h:478
ThreadFunc
int ThreadFunc(void *data)
Definition:
testthread.c:48
getprioritystr
static const char * getprioritystr(SDL_ThreadPriority priority)
Definition:
testthread.c:34
test
testthread.c
Generated by
1.8.16