Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Added some extra protection to notify the developer if they haven't i…
Browse files Browse the repository at this point in the history
…nitialized 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<int, 2>&) at /Users/aardappel/lobster/dev/xcode/lobster/../../src/sdlsystem.cpp:193
  • Loading branch information
slouken committed Jun 6, 2013
1 parent 0c10de8 commit 4838a0d
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 3 deletions.
9 changes: 9 additions & 0 deletions include/SDL_main.h
Expand Up @@ -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__

/**
Expand Down
16 changes: 16 additions & 0 deletions src/SDL.c
Expand Up @@ -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 ];

Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/main/android/SDL_android_main.cpp
Expand Up @@ -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];
Expand Down
4 changes: 2 additions & 2 deletions src/main/psp/SDL_psp_main.c
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
2 changes: 2 additions & 0 deletions src/main/windows/SDL_windows_main.c
Expand Up @@ -134,6 +134,8 @@ console_main(int argc, char *argv[])
{
int status;

SDL_SetMainReady();

/* Run the application main() code */
status = SDL_main(argc, argv);

Expand Down
3 changes: 2 additions & 1 deletion src/video/uikit/SDL_uikitappdelegate.m
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 4838a0d

Please sign in to comment.