summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2011-10-27 11:21:01 +0200
committerMartin Sustrik <sustrik@250bpm.com>2011-10-27 11:21:01 +0200
commita8362abf11b51dd553766fb07a9e60f28e788126 (patch)
treebd2f3dc4f9d7eada43c09a4e0b861f9b29b0b8d9 /src
parenta70bea01cc9c81a59d0b7067e8854fc9777f5757 (diff)
Enable exceptions raising on assert on Win32
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
Diffstat (limited to 'src')
-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)