summaryrefslogtreecommitdiff
path: root/src/lib/util.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-02-09 23:34:24 +0000
committerCarl Hetherington <cth@carlh.net>2014-02-09 23:34:24 +0000
commited0d28374e5c4807f7375c39c032a1dc4b5cf874 (patch)
treef156ecc6584927e7e4975945391a0af1b6a4dba2 /src/lib/util.cc
parente3e01d8c9772b34bf35191197d77e31bee5c9882 (diff)
Various OOM fixes; fancy terminate() handler.
Diffstat (limited to 'src/lib/util.cc')
-rw-r--r--src/lib/util.cc30
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 ();