Home | History | Annotate | Download | only in test
      1 /*
      2   Copyright (C) 1997-2014 Sam Lantinga <slouken (at) 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 #include "SDL_thread.h"
     22 
     23 #define NUMTHREADS 10
     24 
     25 static char volatile time_for_threads_to_die[NUMTHREADS];
     26 
     27 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
     28 static void
     29 quit(int rc)
     30 {
     31     SDL_Quit();
     32     exit(rc);
     33 }
     34 
     35 int SDLCALL
     36 SubThreadFunc(void *data)
     37 {
     38     while (!*(int volatile *) data) {
     39         ;                       /* SDL_Delay(10); *//* do nothing */
     40     }
     41     return 0;
     42 }
     43 
     44 int SDLCALL
     45 ThreadFunc(void *data)
     46 {
     47     SDL_Thread *sub_threads[NUMTHREADS];
     48     int flags[NUMTHREADS];
     49     int i;
     50     int tid = (int) (uintptr_t) data;
     51 
     52     SDL_Log("Creating Thread %d\n", tid);
     53 
     54     for (i = 0; i < NUMTHREADS; i++) {
     55         char name[64];
     56         SDL_snprintf(name, sizeof (name), "Child%d_%d", tid, i);
     57         flags[i] = 0;
     58         sub_threads[i] = SDL_CreateThread(SubThreadFunc, name, &flags[i]);
     59     }
     60 
     61     SDL_Log("Thread '%d' waiting for signal\n", tid);
     62     while (time_for_threads_to_die[tid] != 1) {
     63         ;                       /* do nothing */
     64     }
     65 
     66     SDL_Log("Thread '%d' sending signals to subthreads\n", tid);
     67     for (i = 0; i < NUMTHREADS; i++) {
     68         flags[i] = 1;
     69         SDL_WaitThread(sub_threads[i], NULL);
     70     }
     71 
     72     SDL_Log("Thread '%d' exiting!\n", tid);
     73 
     74     return 0;
     75 }
     76 
     77 int
     78 main(int argc, char *argv[])
     79 {
     80     SDL_Thread *threads[NUMTHREADS];
     81     int i;
     82 
     83 	/* Enable standard application logging */
     84     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
     85 
     86     /* Load the SDL library */
     87     if (SDL_Init(0) < 0) {
     88         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
     89         return (1);
     90     }
     91 
     92     signal(SIGSEGV, SIG_DFL);
     93     for (i = 0; i < NUMTHREADS; i++) {
     94         char name[64];
     95         SDL_snprintf(name, sizeof (name), "Parent%d", i);
     96         time_for_threads_to_die[i] = 0;
     97         threads[i] = SDL_CreateThread(ThreadFunc, name, (void*) (uintptr_t) i);
     98 
     99         if (threads[i] == NULL) {
    100             SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create thread: %s\n", SDL_GetError());
    101             quit(1);
    102         }
    103     }
    104 
    105     for (i = 0; i < NUMTHREADS; i++) {
    106         time_for_threads_to_die[i] = 1;
    107     }
    108 
    109     for (i = 0; i < NUMTHREADS; i++) {
    110         SDL_WaitThread(threads[i], NULL);
    111     }
    112     SDL_Quit();
    113     return (0);
    114 }
    115