SDL  2.0
torturethread.c
Go to the documentation of this file.
1 /*
2  Copyright (C) 1997-2018 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 #include <string.h>
19 
20 #include "SDL.h"
21 
22 #define NUMTHREADS 10
23 
25 
26 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
27 static void
28 quit(int rc)
29 {
30  SDL_Quit();
31  exit(rc);
32 }
33 
34 int SDLCALL
36 {
37  while (!*(int volatile *) data) {
38  ; /* SDL_Delay(10); *//* do nothing */
39  }
40  return 0;
41 }
42 
43 int SDLCALL
45 {
46  SDL_Thread *sub_threads[NUMTHREADS];
47  int flags[NUMTHREADS];
48  int i;
49  int tid = (int) (uintptr_t) data;
50 
51  SDL_Log("Creating Thread %d\n", tid);
52 
53  for (i = 0; i < NUMTHREADS; i++) {
54  char name[64];
55  SDL_snprintf(name, sizeof (name), "Child%d_%d", tid, i);
56  flags[i] = 0;
57  sub_threads[i] = SDL_CreateThread(SubThreadFunc, name, &flags[i]);
58  }
59 
60  SDL_Log("Thread '%d' waiting for signal\n", tid);
61  while (SDL_AtomicGet(&time_for_threads_to_die[tid]) != 1) {
62  ; /* do nothing */
63  }
64 
65  SDL_Log("Thread '%d' sending signals to subthreads\n", tid);
66  for (i = 0; i < NUMTHREADS; i++) {
67  flags[i] = 1;
68  SDL_WaitThread(sub_threads[i], NULL);
69  }
70 
71  SDL_Log("Thread '%d' exiting!\n", tid);
72 
73  return 0;
74 }
75 
76 int
77 main(int argc, char *argv[])
78 {
80  int i;
81 
82  /* Enable standard application logging */
84 
85  /* Load the SDL library */
86  if (SDL_Init(0) < 0) {
87  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
88  return (1);
89  }
90 
91  signal(SIGSEGV, SIG_DFL);
92  for (i = 0; i < NUMTHREADS; i++) {
93  char name[64];
94  SDL_snprintf(name, sizeof (name), "Parent%d", i);
95  SDL_AtomicSet(&time_for_threads_to_die[i], 0);
96  threads[i] = SDL_CreateThread(ThreadFunc, name, (void*) (uintptr_t) i);
97 
98  if (threads[i] == NULL) {
99  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create thread: %s\n", SDL_GetError());
100  quit(1);
101  }
102  }
103 
104  for (i = 0; i < NUMTHREADS; i++) {
105  SDL_AtomicSet(&time_for_threads_to_die[i], 1);
106  }
107 
108  for (i = 0; i < NUMTHREADS; i++) {
109  SDL_WaitThread(threads[i], NULL);
110  }
111  SDL_Quit();
112  return (0);
113 }
static void quit(int rc)
Definition: torturethread.c:28
#define SDL_GetError
A type representing an atomic integer value. It is a struct so people don&#39;t accidentally use numeric ...
Definition: SDL_atomic.h:198
int main(int argc, char *argv[])
Definition: torturethread.c:77
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
#define NUMTHREADS
Definition: torturethread.c:22
GLuint const GLchar * name
#define SDL_LogError
#define SDL_Log
#define SDL_Quit
int ThreadFunc(void *data)
Definition: torturethread.c:44
unsigned int uintptr_t
#define SDL_CreateThread
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
#define SDL_LogSetPriority
#define NULL
Definition: begin_code.h:164
GLbitfield flags
static SDL_Thread * threads[6]
Definition: testlock.c:25
#define SDL_AtomicSet
#define SDL_AtomicGet
#define SDL_snprintf
#define SDL_Init
int SubThreadFunc(void *data)
Definition: torturethread.c:35
static SDL_atomic_t time_for_threads_to_die[NUMTHREADS]
Definition: torturethread.c:24
#define SDLCALL
Definition: SDL_internal.h:45
#define SDL_WaitThread