From 4838a0d079a3702fddc54b406f28c847a8047a80 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 5 Jun 2013 21:23:59 -0700 Subject: [PATCH] Added some extra protection to notify the developer if they haven't initialized the application properly. This will help reduce issues like that reported in bug 1819: Wouter van Oortmerssen 2013-04-23 20:12:07 EDT #0 0x01d1e881 in __HALT () #1 0x01c58971 in _CFRuntimeCreateInstance () #2 0x02e4acc1 in GSFontCreateWithName () #3 0x00adc0e1 in UINewFont () #4 0x00adc24c in +[UIFont systemFontOfSize:traits:] () #5 0x00adc298 in +[UIFont systemFontOfSize:] () #6 0x009fb5d9 in +[UITextFieldLabel defaultFont] () #7 0x00a8ccd5 in -[UILabel _commonInit] () #8 0x00a8ce14 in -[UILabel initWithFrame:] () #9 0x00a052eb in -[UITextField createTextLabelWithTextColor:] () #10 0x009fbede in -[UITextField initWithFrame:] () #11 0x00152ead in -[SDL_uikitview initializeKeyboard] at /Users/aardappel/lobster/external/SDL-2.0.0-7046/Xcode-iOS/SDL/../../src/video/uikit/SDL_uikitview.m:208 #12 0x0015290c in -[SDL_uikitview initWithFrame:] at /Users/aardappel/lobster/external/SDL-2.0.0-7046/Xcode-iOS/SDL/../../src/video/uikit/SDL_uikitview.m:50 #13 0x00153b5b in -[SDL_uikitopenglview initWithFrame:scale:retainBacking:rBits:gBits:bBits:aBits:depthBits:stencilBits:majorVersion:] at /Users/aardappel/lobster/external/SDL-2.0.0-7046/Xcode-iOS/SDL/../../src/video/uikit/SDL_uikitopenglview.m:53 #14 0x001524ff in UIKit_GL_CreateContext at /Users/aardappel/lobster/external/SDL-2.0.0-7046/Xcode-iOS/SDL/../../src/video/uikit/SDL_uikitopengles.m:114 #15 0x0015078f in SDL_GL_CreateContext at /Users/aardappel/lobster/external/SDL-2.0.0-7046/Xcode-iOS/SDL/../../src/video/SDL_video.c:2666 #16 0x000d8c5c in SDLInit(char const*, vec&) at /Users/aardappel/lobster/dev/xcode/lobster/../../src/sdlsystem.cpp:193 --- include/SDL_main.h | 9 +++++++++ src/SDL.c | 16 ++++++++++++++++ src/main/android/SDL_android_main.cpp | 2 ++ src/main/psp/SDL_psp_main.c | 4 ++-- src/main/windows/SDL_windows_main.c | 2 ++ src/video/uikit/SDL_uikitappdelegate.m | 3 ++- 6 files changed, 33 insertions(+), 3 deletions(-) diff --git a/include/SDL_main.h b/include/SDL_main.h index 59bd20167..7a766d24c 100644 --- a/include/SDL_main.h +++ b/include/SDL_main.h @@ -72,6 +72,15 @@ extern C_LINKAGE int SDL_main(int argc, char *argv[]); extern "C" { #endif +/* + * This is called by the real SDL main function to let the rest of the + * library know that initialization was done properly. + * + * Calling this yourself without knowing what you're doing can cause + * crashes and hard to diagnose problems with your application. + */ +extern DECLSPEC void SDL_SetMainReady(void); + #ifdef __WIN32__ /** diff --git a/src/SDL.c b/src/SDL.c index 5f28373a1..f6f3dec69 100644 --- a/src/SDL.c +++ b/src/SDL.c @@ -43,6 +43,11 @@ extern int SDL_HelperWindowDestroy(void); /* The initialized subsystems */ +#ifdef SDL_MAIN_NEEDED +static SDL_bool SDL_MainIsReady = SDL_FALSE; +#else +static SDL_bool SDL_MainIsReady = SDL_TRUE; +#endif static SDL_bool SDL_bInMainQuit = SDL_FALSE; static Uint8 SDL_SubsystemRefCount[ 32 ]; @@ -88,9 +93,20 @@ SDL_PrivateShouldQuitSubsystem(Uint32 subsystem) { return SDL_SubsystemRefCount[subsystem_index] == 1 || SDL_bInMainQuit; } +void +SDL_SetMainReady(void) +{ + SDL_MainIsReady = SDL_TRUE; +} + int SDL_InitSubSystem(Uint32 flags) { + 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; + } + #if !SDL_TIMERS_DISABLED SDL_InitTicks(); #endif diff --git a/src/main/android/SDL_android_main.cpp b/src/main/android/SDL_android_main.cpp index 4581e1c3b..5f3abbab8 100644 --- a/src/main/android/SDL_android_main.cpp +++ b/src/main/android/SDL_android_main.cpp @@ -20,6 +20,8 @@ extern "C" void Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass c /* This interface could expand with ABI negotiation, calbacks, etc. */ SDL_Android_Init(env, cls); + SDL_SetMainReady(); + /* Run the application code! */ int status; char *argv[2]; diff --git a/src/main/psp/SDL_psp_main.c b/src/main/psp/SDL_psp_main.c index c60e8441b..77ef39d5a 100644 --- a/src/main/psp/SDL_psp_main.c +++ b/src/main/psp/SDL_psp_main.c @@ -37,8 +37,6 @@ PSP_MAIN_THREAD_STACK_SIZE, etc. */ -extern int SDL_main(int argc, char *argv[]); - PSP_MODULE_INFO("SDL App", 0, 1, 1); int sdl_psp_exit_callback(int arg1, int arg2, void *common) @@ -75,6 +73,8 @@ int main(int argc, char *argv[]) /* Register sceKernelExitGame() to be called when we exit */ atexit(sceKernelExitGame); + SDL_SetMainReady(); + (void)SDL_main(argc, argv); return 0; } diff --git a/src/main/windows/SDL_windows_main.c b/src/main/windows/SDL_windows_main.c index f4f78f68c..bea208224 100644 --- a/src/main/windows/SDL_windows_main.c +++ b/src/main/windows/SDL_windows_main.c @@ -134,6 +134,8 @@ console_main(int argc, char *argv[]) { int status; + SDL_SetMainReady(); + /* Run the application main() code */ status = SDL_main(argc, argv); diff --git a/src/video/uikit/SDL_uikitappdelegate.m b/src/video/uikit/SDL_uikitappdelegate.m index d13c2bbce..93af43821 100644 --- a/src/video/uikit/SDL_uikitappdelegate.m +++ b/src/video/uikit/SDL_uikitappdelegate.m @@ -37,7 +37,6 @@ #undef main #endif -extern int SDL_main(int argc, char *argv[]); static int forward_argc; static char **forward_argv; static int exit_status; @@ -187,6 +186,8 @@ - (id)init - (void)postFinishLaunch { + SDL_SetMainReady(); + /* run the user's application, passing argc and argv */ SDL_iPhoneSetEventPump(SDL_TRUE); exit_status = SDL_main(forward_argc, forward_argv);