diff options
| author | Carl Hetherington <cth@carlh.net> | 2014-02-09 23:34:24 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2014-02-09 23:34:24 +0000 |
| commit | ed0d28374e5c4807f7375c39c032a1dc4b5cf874 (patch) | |
| tree | f156ecc6584927e7e4975945391a0af1b6a4dba2 /src/lib/util.cc | |
| parent | e3e01d8c9772b34bf35191197d77e31bee5c9882 (diff) | |
Various OOM fixes; fancy terminate() handler.
Diffstat (limited to 'src/lib/util.cc')
| -rw-r--r-- | src/lib/util.cc | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/lib/util.cc b/src/lib/util.cc index 190bb42b1..d0274e821 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -95,6 +95,7 @@ using std::pair; using std::cout; using std::bad_alloc; using std::streampos; +using std::set_terminate; using boost::shared_ptr; using boost::thread; using boost::lexical_cast; @@ -273,6 +274,31 @@ LONG WINAPI exception_handler(struct _EXCEPTION_POINTERS *) } #endif +/* From http://stackoverflow.com/questions/2443135/how-do-i-find-where-an-exception-was-thrown-in-c */ +void +terminate () +{ + static bool tried_throw = false; + + try { + // try once to re-throw currently active exception + if (!tried_throw++) { + throw; + } + } + catch (const std::exception &e) { + std::cerr << __FUNCTION__ << " caught unhandled exception. what(): " + << e.what() << std::endl; + } + catch (...) { + std::cerr << __FUNCTION__ << " caught unknown/unhandled exception." + << std::endl; + } + + stacktrace (cout, 50); + abort(); +} + /** Call the required functions to set up DCP-o-matic's static arrays, etc. * Must be called from the UI thread, if there is one. */ @@ -309,7 +335,9 @@ dcpomatic_setup () boost::filesystem::path lib = app_contents (); lib /= "lib"; setenv ("LTDL_LIBRARY_PATH", lib.c_str (), 1); -#endif +#endif + + set_terminate (terminate); libdcp::init (); |
