summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Betts <paul@paulbetts.org>2011-10-27 11:48:58 +0200
committerMartin Sustrik <sustrik@250bpm.com>2011-10-27 11:48:58 +0200
commit1b706ac02858aee4c960331dc7100f8c14312848 (patch)
treedd494e2d5308e74704ba1545e567931f9f7d91c3
parentb3cda2ad6091096264f777a95907050edfdd3ffe (diff)
Enable exceptions raising on assert on Win32
This patch changes the Win32 version to call RaiseException instead of abort (which eventually calls TerminateProcess). This allows crash dumps to be sent correctly instead of the process disappearing. Signed-off-by: Paul Betts <paul@paulbetts.org>
-rw-r--r--src/err.cpp13
-rw-r--r--src/err.hpp26
2 files changed, 27 insertions, 12 deletions
diff --git a/src/err.cpp b/src/err.cpp
index f374de9..ff81e03 100644
--- a/src/err.cpp
+++ b/src/err.cpp
@@ -62,6 +62,19 @@ const char *zmq::errno_to_string (int errno_)
}
}
+void zmq::zmq_abort(const char *errmsg_)
+{
+#if defined ZMQ_HAVE_WINDOWS
+
+ // Raise STATUS_FATAL_APP_EXIT.
+ ULONG_PTR extra_info [1];
+ extra_info [0] = (ULONG_PTR) errmsg_;
+ RaiseException (0x40000015, EXCEPTION_NONCONTINUABLE, 1, extra_info);
+#else
+ abort ();
+#endif
+}
+
#ifdef ZMQ_HAVE_WINDOWS
const char *zmq::wsa_error()
diff --git a/src/err.hpp b/src/err.hpp
index 9558a10..7c7a9d8 100644
--- a/src/err.hpp
+++ b/src/err.hpp
@@ -42,6 +42,7 @@
namespace zmq
{
const char *errno_to_string (int errno_);
+ void zmq_abort (const char *errmsg_);
}
#ifdef ZMQ_HAVE_WINDOWS
@@ -51,7 +52,7 @@ namespace zmq
const char *wsa_error ();
const char *wsa_error_no (int no_);
void win_error (char *buffer_, size_t buffer_size_);
- void wsa_error_to_errno ();
+ void wsa_error_to_errno ();
}
// Provides convenient way to check WSA-style errors on Windows.
@@ -62,7 +63,7 @@ namespace zmq
if (errstr != NULL) {\
fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \
__FILE__, __LINE__);\
- abort ();\
+ zmq::zmq_abort (errstr);\
}\
}\
} while (false)
@@ -74,7 +75,7 @@ namespace zmq
if (errstr != NULL) {\
fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \
__FILE__, __LINE__);\
- abort ();\
+ zmq::zmq_abort (errstr);\
}\
} while (false)
@@ -86,7 +87,7 @@ namespace zmq
zmq::win_error (errstr, 256);\
fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \
__FILE__, __LINE__);\
- abort ();\
+ zmq::zmq_abort (errstr);\
}\
} while (false)
@@ -100,7 +101,7 @@ namespace zmq
if (unlikely (!(x))) {\
fprintf (stderr, "Assertion failed: %s (%s:%d)\n", #x, \
__FILE__, __LINE__);\
- abort ();\
+ zmq::zmq_abort (#x);\
}\
} while (false)
@@ -108,9 +109,9 @@ namespace zmq
#define errno_assert(x) \
do {\
if (unlikely (!(x))) {\
- perror (NULL);\
- fprintf (stderr, "%s (%s:%d)\n", #x, __FILE__, __LINE__);\
- abort ();\
+ const char *errstr = strerror (errno);\
+ fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\
+ zmq::zmq_abort (errstr);\
}\
} while (false)
@@ -118,8 +119,9 @@ namespace zmq
#define posix_assert(x) \
do {\
if (unlikely (x)) {\
- fprintf (stderr, "%s (%s:%d)\n", strerror (x), __FILE__, __LINE__);\
- abort ();\
+ const char *errstr = strerror (x);\
+ fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\
+ zmq::zmq_abort (errstr);\
}\
} while (false)
@@ -129,7 +131,7 @@ namespace zmq
if (unlikely (x)) {\
const char *errstr = gai_strerror (x);\
fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\
- abort ();\
+ zmq::zmq_abort (errstr);\
}\
} while (false)
@@ -139,7 +141,7 @@ namespace zmq
if (unlikely (!x)) {\
fprintf (stderr, "FATAL ERROR: OUT OF MEMORY (%s:%d)\n",\
__FILE__, __LINE__);\
- abort ();\
+ zmq::zmq_abort ("FATAL ERROR: OUT OF MEMORY");\
}\
} while (false)