cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

torturethread.c (2835B)


      1/*
      2  Copyright (C) 1997-2014 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#include "SDL_thread.h"
     22
     23#define NUMTHREADS 10
     24
     25static char volatile time_for_threads_to_die[NUMTHREADS];
     26
     27/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
     28static void
     29quit(int rc)
     30{
     31    SDL_Quit();
     32    exit(rc);
     33}
     34
     35int SDLCALL
     36SubThreadFunc(void *data)
     37{
     38    while (!*(int volatile *) data) {
     39        ;                       /* SDL_Delay(10); *//* do nothing */
     40    }
     41    return 0;
     42}
     43
     44int SDLCALL
     45ThreadFunc(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
     77int
     78main(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}