Skip to content

Commit

Permalink
Added a hint to specify new thread stack size (thanks, Gabriel!).
Browse files Browse the repository at this point in the history
Fixes Bugzilla #2019.

(we'll do a better fix when we break the API in SDL 2.1.)
  • Loading branch information
icculus committed May 27, 2015
1 parent bcdc63a commit a8fa7bd
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 0 deletions.
12 changes: 12 additions & 0 deletions include/SDL_hints.h
Expand Up @@ -348,6 +348,18 @@ extern "C" {
#define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION"



/**
* \brief A string specifying SDL's threads stack size in bytes or "-1" for the backend's default size
*
* Use this hint in case you need to set SDL's threads stack size to other than the default.
* This is specially useful if you build SDL against a non glibc libc library (such as musl) which
* provides a relatively small default thread stack size (a few kilobytes versus the default 8MB glibc uses).
* Support for this hint is currenly available only in the pthread backend.
* As a precaution, this hint can not be set via an environment variable.
*/
#define SDL_HINT_THREAD_STACK_SIZE "SDL_THREAD_STACK_SIZE"

/**
* \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac and iOS)
*/
Expand Down
8 changes: 8 additions & 0 deletions src/SDL.c
Expand Up @@ -107,13 +107,21 @@ SDL_SetMainReady(void)
int
SDL_InitSubSystem(Uint32 flags)
{
static Uint32 hints_initialized = SDL_FALSE;
if (!SDL_MainIsReady) {
SDL_SetError("Application didn't initialize properly, did you include SDL_main.h in the file containing your main() function?");
return -1;
}

/* Clear the error message */
SDL_ClearError();

if (hints_initialized == SDL_FALSE) {
/* Set a default of -1 for SDL_HINT_THREAD_STACK_SIZE to prevent the
end user from interfering it's value with environment variables */
SDL_SetHintWithPriority(SDL_HINT_THREAD_STACK_SIZE, "-1", SDL_HINT_OVERRIDE);
hints_initialized = SDL_TRUE;
}

#if SDL_VIDEO_DRIVER_WINDOWS
if ((flags & (SDL_INIT_HAPTIC|SDL_INIT_JOYSTICK))) {
Expand Down
10 changes: 10 additions & 0 deletions src/thread/pthread/SDL_systhread.c
Expand Up @@ -45,6 +45,7 @@

#include "SDL_platform.h"
#include "SDL_thread.h"
#include "SDL_hints.h"
#include "../SDL_thread_c.h"
#include "../SDL_systhread.h"
#ifdef __ANDROID__
Expand Down Expand Up @@ -86,6 +87,8 @@ int
SDL_SYS_CreateThread(SDL_Thread * thread, void *args)
{
pthread_attr_t type;
size_t ss;
const char *hint = SDL_GetHint(SDL_HINT_THREAD_STACK_SIZE);

/* do this here before any threads exist, so there's no race condition. */
#if defined(__MACOSX__) || defined(__IPHONEOS__) || defined(__LINUX__)
Expand All @@ -105,6 +108,13 @@ SDL_SYS_CreateThread(SDL_Thread * thread, void *args)
return SDL_SetError("Couldn't initialize pthread attributes");
}
pthread_attr_setdetachstate(&type, PTHREAD_CREATE_JOINABLE);

/* If the SDL_HINT_THREAD_STACK_SIZE exists and it seems to be a positive number, use it */
if (hint && hint[0] >= '0' && hint[0] <= '9') {
pthread_attr_setstacksize(&type, (size_t)SDL_atoi(hint));
}

pthread_attr_getstacksize(&type, &ss);

/* Create the thread and go! */
if (pthread_create(&thread->handle, &type, RunThread, args) != 0) {
Expand Down
2 changes: 2 additions & 0 deletions test/torturethread.c
Expand Up @@ -87,6 +87,8 @@ main(int argc, char *argv[])
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}

SDL_SetHintWithPriority(SDL_HINT_THREAD_STACK_SIZE, SDL_getenv(SDL_HINT_THREAD_STACK_SIZE), SDL_HINT_OVERRIDE);

signal(SIGSEGV, SIG_DFL);
for (i = 0; i < NUMTHREADS; i++) {
Expand Down

0 comments on commit a8fa7bd

Please sign in to comment.