X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f775771ab47cb5528f2a82389c170fc9bd467d27..9b95e87cb00a02e8373d25f525910d689c176ce4:/src/common/init.cpp diff --git a/src/common/init.cpp b/src/common/init.cpp index 5154c1afd7..90afc70ac8 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -34,23 +34,25 @@ #include "wx/init.h" #include "wx/thread.h" -#include "wx/ptr_scpd.h" +#include "wx/scopedptr.h" #include "wx/except.h" -#if defined(__WXMSW__) && defined(__WXDEBUG__) +#if defined(__WXMSW__) #include "wx/msw/msvcrt.h" - static struct EnableMemLeakChecking - { - EnableMemLeakChecking() + #ifdef wxCrtSetDbgFlag + static struct EnableMemLeakChecking { - // do check for memory leaks on program exit (another useful flag - // is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free deallocated - // memory which may be used to simulate low-memory condition) - wxCrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF); - } - } gs_enableLeakChecks; -#endif // __WXMSW__ && __WXDEBUG__ + EnableMemLeakChecking() + { + // check for memory leaks on program exit (another useful flag + // is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free deallocated + // memory which may be used to simulate low-memory condition) + wxCrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF); + } + } gs_enableLeakChecks; + #endif // wxCrtSetDbgFlag +#endif // __WXMSW__ // ---------------------------------------------------------------------------- // private classes @@ -62,9 +64,10 @@ class wxDummyConsoleApp : public wxAppConsole public: wxDummyConsoleApp() { } - virtual int OnRun() { wxFAIL_MSG( _T("unreachable code") ); return 0; } + virtual int OnRun() { wxFAIL_MSG( wxT("unreachable code") ); return 0; } + virtual bool DoYield(bool, long) { return true; } - DECLARE_NO_COPY_CLASS(wxDummyConsoleApp) + wxDECLARE_NO_COPY_CLASS(wxDummyConsoleApp); }; // we need a special kind of auto pointer to wxApp which not only deletes the @@ -93,7 +96,7 @@ public: wxApp::SetInstance(ptr); } - DECLARE_NO_COPY_CLASS(wxAppPtr) + wxDECLARE_NO_COPY_CLASS(wxAppPtr); }; // class to ensure that wxAppBase::CleanUp() is called if our Initialize() @@ -160,7 +163,7 @@ static struct InitData wchar_t **argv; #endif // wxUSE_UNICODE - DECLARE_NO_COPY_CLASS(InitData) + wxDECLARE_NO_COPY_CLASS(InitData); } gs_initData; // ============================================================================ @@ -226,13 +229,6 @@ static bool DoCommonPreInit() #if wxUSE_LOG // Reset logging in case we were cleaned up and are being reinitialized. wxLog::DoCreateOnDemand(); - - // install temporary log sink: we can't use wxLogGui before wxApp is - // constructed and if we use wxLogStderr, all messages during - // initialization simply disappear under Windows - // - // note that we will delete this log target below - delete wxLog::SetActiveTarget(new wxLogBuffer); #endif // wxUSE_LOG return true; @@ -249,37 +245,6 @@ static bool DoCommonPostInit() return false; } -#if defined(__WXDEBUG__) - // check if event classes implement Clone() correctly - // NOTE: the check is done against _all_ event classes which are linked to - // the executable currently running, which are not necessarily all - // wxWidgets event classes. - const wxClassInfo *ci = wxClassInfo::GetFirst(); - while (ci) - { - // is this class derived from wxEvent? - if (ci->IsKindOf(CLASSINFO(wxEvent)) && wxString(ci->GetClassName()) != "wxEvent") - { - if (!ci->IsDynamic()) - wxLogWarning("The event class '%s' should have a DECLARE_DYNAMIC_CLASS macro!", - ci->GetClassName()); - - // yes; test if it implements Clone() correctly - wxEvent* test = dynamic_cast(ci->CreateObject()); - wxASSERT_MSG(test, "The event class should have a DECLARE_DYNAMIC_CLASS macro!"); - - wxEvent* cloned = test->Clone(); - if (!cloned || cloned->GetClassInfo() != ci) - wxLogWarning("The event class '%s' does not correctly implements wxEvent::Clone()!", - ci->GetClassName()); - - delete test; - } - - ci = ci->GetNext(); - } -#endif - return true; } @@ -290,9 +255,7 @@ bool wxEntryStart(int& argc, wxChar **argv) // initialize wxRTTI if ( !DoCommonPreInit() ) - { return false; - } // first of all, we need an application object @@ -325,22 +288,15 @@ bool wxEntryStart(int& argc, wxChar **argv) // -------------------------------------------- if ( !app->Initialize(argc, argv) ) - { return false; - } // remember, possibly modified (e.g. due to removal of toolkit-specific // parameters), command line arguments in member variables app->argc = argc; app->argv = argv; - wxCallAppCleanup callAppCleanup(app.get()); - // for compatibility call the old initialization function too - if ( !app->OnInitGui() ) - return false; - // common initialization after wxTheApp creation // --------------------------------------------- @@ -393,14 +349,15 @@ bool wxEntryStart(int& argc, char **argv) static void DoCommonPreCleanup() { #if wxUSE_LOG - // flush the logged messages if any and install a 'safer' log target: the - // default one (wxLogGui) can't be used after the resources are freed just - // below and the user supplied one might be even more unsafe (using any - // wxWidgets GUI function is unsafe starting from now) - wxLog::DontCreateOnDemand(); - - // this will flush the old messages if any - delete wxLog::SetActiveTarget(new wxLogStderr); + // flush the logged messages if any and don't use the current probably + // unsafe log target any more: the default one (wxLogGui) can't be used + // after the resources are freed which happens when we return and the user + // supplied one might be even more unsafe (using any wxWidgets GUI function + // is unsafe starting from now) + // + // notice that wxLog will still recreate a default log target if any + // messages are logged but that one will be safe to use until the very end + delete wxLog::SetActiveTarget(NULL); #endif // wxUSE_LOG } @@ -421,6 +378,12 @@ static void DoCommonPostCleanup() #if wxUSE_LOG // and now delete the last logger as well + // + // we still don't disable log target auto-vivification even if any log + // objects created now will result in memory leaks because it seems better + // to leak memory which doesn't matter much considering the application is + // exiting anyhow than to not show messages which could still be logged + // from the user code (e.g. static dtors and such) delete wxLog::SetActiveTarget(NULL); #endif // wxUSE_LOG } @@ -476,7 +439,6 @@ int wxEntryReal(int& argc, wxChar **argv) wxTRY { - // app initialization if ( !wxTheApp->CallOnInit() ) {