This commit is contained in:
Alexey Milovidov 2015-03-18 04:48:48 +03:00
commit 77f2e60146
2 changed files with 22 additions and 10 deletions

View File

@ -52,7 +52,7 @@ private:
char * c_end; char * c_end;
char * c_end_of_storage; char * c_end_of_storage;
bool use_libc_realloc; bool use_libc_realloc = false;
T * t_start() { return reinterpret_cast<T *>(c_start); } T * t_start() { return reinterpret_cast<T *>(c_start); }
T * t_end() { return reinterpret_cast<T *>(c_end); } T * t_end() { return reinterpret_cast<T *>(c_end); }
@ -175,10 +175,10 @@ public:
}; };
PODArray() : use_libc_realloc(false) { alloc(0); } PODArray() { alloc(0); }
PODArray(size_t n) : use_libc_realloc(false) { alloc(n); c_end += byte_size(n); } PODArray(size_t n) { alloc(n); c_end += byte_size(n); }
PODArray(size_t n, const T & x) : use_libc_realloc(false) { alloc(n); assign(n, x); } PODArray(size_t n, const T & x) { alloc(n); assign(n, x); }
PODArray(const_iterator from_begin, const_iterator from_end) : use_libc_realloc(false) { alloc(from_end - from_begin); insert(from_begin, from_end); } PODArray(const_iterator from_begin, const_iterator from_end) { alloc(from_end - from_begin); insert(from_begin, from_end); }
~PODArray() { dealloc(); } ~PODArray() { dealloc(); }
PODArray(PODArray && other) { *this = std::move(other); } PODArray(PODArray && other) { *this = std::move(other); }

View File

@ -43,6 +43,14 @@ ExceptionPtr cloneCurrentException()
} }
} }
inline std::string demangle(const char * const mangled, int & status)
{
const auto demangled_str = abi::__cxa_demangle(mangled, 0, 0, &status);
std::string demangled{demangled_str};
free(demangled_str);
return demangled;
}
void tryLogCurrentException(const char * log_name) void tryLogCurrentException(const char * log_name)
{ {
@ -72,10 +80,8 @@ void tryLogCurrentException(const char * log_name)
{ {
try try
{ {
int status; int status = 0;
char * realname = abi::__cxa_demangle(typeid(e).name(), 0, 0, &status); auto name = demangle(typeid(e).name(), status);
std::string name = realname;
free(realname);
if (status) if (status)
name += " (demangling status: " + toString(status) + ")"; name += " (demangling status: " + toString(status) + ")";
@ -88,7 +94,13 @@ void tryLogCurrentException(const char * log_name)
{ {
try try
{ {
LOG_ERROR(&Logger::get(log_name), "Unknown exception. Code: " << ErrorCodes::UNKNOWN_EXCEPTION); int status = 0;
auto name = demangle(abi::__cxa_current_exception_type()->name(), status);
if (status)
name += " (demangling status: " + toString(status) + ")";
LOG_ERROR(&Logger::get(log_name), "Unknown exception. Code: " << ErrorCodes::UNKNOWN_EXCEPTION << ", type: " << name);
} }
catch (...) {} catch (...) {}
} }