test/torturethread.c
author Sam Lantinga <slouken@libsdl.org>
Wed, 03 Oct 2018 15:48:26 -0700
changeset 12285 30c3ffcbed38
parent 11811 5d94cb6b24d3
child 12503 806492103856
permissions -rw-r--r--
Update documentation to note that this hint works on Android too (thanks Trent!)
     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 
    24 static SDL_atomic_t time_for_threads_to_die[NUMTHREADS];
    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
    35 SubThreadFunc(void *data)
    36 {
    37     while (!*(int volatile *) data) {
    38         ;                       /* SDL_Delay(10); *//* do nothing */
    39     }
    40     return 0;
    41 }
    42 
    43 int SDLCALL
    44 ThreadFunc(void *data)
    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 {
    79     SDL_Thread *threads[NUMTHREADS];
    80     int i;
    81 
    82     /* Enable standard application logging */
    83     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
    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 }