diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index 471b743a2b7f36524cfb3892ec839122da86955f..1f946436454a664a4c7f400d981a672380143fcb 100644 --- a/Scheduler/Scheduler.cc +++ b/Scheduler/Scheduler.cc @@ -165,7 +165,7 @@ prefix_ void senf::scheduler::hiresTimers() prefix_ senf::log::time_type senf::scheduler::LogTimeSource::operator()() const { - return now(); + return senf::scheduler::now(); } /////////////////////////////////////////////////////////////////////////// diff --git a/Utils/Console/UDPServer.cc b/Utils/Console/UDPServer.cc index 312a03de1f581ae69b9f0f63f9499fbd0ee0cbb7..8a0c33bbef52d55d35f5706df9db20c86f2bcd6c 100644 --- a/Utils/Console/UDPServer.cc +++ b/Utils/Console/UDPServer.cc @@ -45,7 +45,7 @@ prefix_ senf::console::UDPServer::UDPServer(senf::INet4SocketAddress const & add { if (address.address().multicast()) handle_.facet<senf::INet4MulticastSocketProtocol>().mcAddMembership(address.address()); - SENF_LOG(("UDP Console server started at " << address)); + SENF_LOG(("UDP Console server started at " << address )); } prefix_ senf::console::UDPServer::UDPServer(senf::INet6SocketAddress const & address) @@ -58,7 +58,7 @@ prefix_ senf::console::UDPServer::UDPServer(senf::INet6SocketAddress const & add { if (address.address().multicast()) handle_.facet<senf::INet6MulticastSocketProtocol>().mcAddMembership(address.address()); - SENF_LOG(("UDP Console server started at " << address)); + SENF_LOG(("UDP Console server started at " << address )); } prefix_ senf::console::UDPServer & senf::console::UDPServer::replies(bool enable) @@ -123,12 +123,14 @@ prefix_ void senf::console::UDPServer::handleInput(int events) catch (Executor::ExitException &) { // Ignored } + catch (ExceptionMixin & ex) { + stream << ex.message() << '\n'; + SENF_LOG((senf::log::IMPORTANT)("Error: " << ex.message())); + SENF_LOG((senf::log::NOTICE)(ex.backtrace())); + } catch (std::exception & ex) { - std::string msg (ex.what()); - std::string::size_type i (msg.find("-- \n")); - if (i != std::string::npos) - msg = msg.substr(i+4); - stream << msg << std::endl; + stream << ex.what() << '\n'; + SENF_LOG((senf::log::IMPORTANT)("Error: " << ex.what())); } if (replies_ && (emptyReplies_ || ! stream.str().empty())) { if (target_) diff --git a/Utils/Exception.cc b/Utils/Exception.cc index 737214da96347dc62763ff4750117b18d406902a..ee1ec18609494f6d39e666eaf05f0fc09bdcbb18 100644 --- a/Utils/Exception.cc +++ b/Utils/Exception.cc @@ -47,7 +47,9 @@ prefix_ void senf::ExceptionMixin::addBacktrace() std::stringstream ss; ss << "\nException at\n"; formatBacktrace(ss, entries, nEntries); - ss << "-- \n" << message_; + ss << "-- \n"; + excLen_ = ss.str().size(); + ss << what_; what_ = ss.str(); } #endif diff --git a/Utils/Exception.cci b/Utils/Exception.cci index 3366fe23467d20109a35c3d00a3e941169c142ea..852852aa0b7f1473cb0987f197289f8031d3c22c 100644 --- a/Utils/Exception.cci +++ b/Utils/Exception.cci @@ -31,23 +31,35 @@ // senf::ExceptionMixin prefix_ senf::ExceptionMixin::ExceptionMixin(std::string const & description) - : what_(description), - message_(description) + : what_(description) { #ifdef SENF_DEBUG addBacktrace(); #endif } -prefix_ std::string const & senf::ExceptionMixin::message() +prefix_ std::string senf::ExceptionMixin::message() const { +#ifdef SENF_DEBUG + return what_.substr(excLen_); +#else return message_; +#endif +} + +prefix_ std::string senf::ExceptionMixin::backtrace() + const +{ +#ifdef SENF_DEBUG + return what_.substr(0,excLen_-4); +#else + return ""; +#endif } prefix_ void senf::ExceptionMixin::append(std::string text) { - message_ += text; what_ += text; } diff --git a/Utils/Exception.hh b/Utils/Exception.hh index a91b157d20c3682634d6556dac6a56636abb3039..c6f32572797c72dfe7ee348a4b6cee148ff0a83a 100644 --- a/Utils/Exception.hh +++ b/Utils/Exception.hh @@ -140,7 +140,8 @@ namespace senf { class ExceptionMixin { public: - std::string const & message() const; ///< get exception description + std::string message() const; ///< get exception description + std::string backtrace() const; ///< Return backtrace (if available) void append(std::string text); ///< Extend exception description /**< Adds \a text to the description text. */ @@ -152,12 +153,13 @@ namespace senf { string. This should probably be a string constant describing the exception for most derived exceptions. */ + std::string what_; private: #ifdef SENF_DEBUG void addBacktrace(); + std::string::size_type excLen_; #endif - std::string message_; }; /** \brief Extensible exception base-class diff --git a/Utils/Logger/TimeSource.ih b/Utils/Logger/TimeSource.ih index 9d02972e2c77ce80f2d38e13b4ac70c4bb01297e..d1a73b1caf1d31d4376b69847685a5f5a41bc1c1 100644 --- a/Utils/Logger/TimeSource.ih +++ b/Utils/Logger/TimeSource.ih @@ -40,16 +40,17 @@ namespace detail { : public senf::singleton<TimeSourceManager> { public: - TimeSourceManager(); - using senf::singleton<TimeSourceManager>::instance; time_type now(); void timeSource(std::auto_ptr<TimeSource> source); private: + TimeSourceManager(); boost::scoped_ptr<TimeSource> timeSource_; + + friend class senf::singleton<TimeSourceManager>; }; }}} diff --git a/Utils/hexdump.ct b/Utils/hexdump.ct index 76abf997d51641ad96612e14ba4614884c83bb5c..277c6711d9351608c71b3326280b5d0743c67a62 100644 --- a/Utils/hexdump.ct +++ b/Utils/hexdump.ct @@ -40,6 +40,15 @@ prefix_ void senf::hexdump(Iterator i, Iterator i_end, std::ostream & stream, dumper(*i); } +template <class Iterator> +prefix_ std::string senf::hexdumpQuote(Iterator i, Iterator i_end) +{ + std::string s; + for (; i != i_end; ++i) + s.push_back(*i >= ' ' && *i <= 126 ? *i : '.'); + return s; +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "hexdump.mpp" diff --git a/Utils/hexdump.hh b/Utils/hexdump.hh index f5a60e681a4972475c936f984c9af6ddbb776a6f..f43f5055467c1e7f79a7b9eb7e96aa6182f2e10b 100644 --- a/Utils/hexdump.hh +++ b/Utils/hexdump.hh @@ -34,10 +34,13 @@ namespace senf { - /** \brief Write range [ i, i_end ) to output stream in hexadecimal format - */ + /** \brief Write range [ i, i_end ) to output stream in hexadecimal format */ template <class Iterator> void hexdump(Iterator i, Iterator i_end, std::ostream & stream, unsigned block_size=16); + + /** \brief Return quoted iterator range */ + template <class Iterator> + std::string hexdumpQuote(Iterator i, Iterator i_end); } ///////////////////////////////hh.e////////////////////////////////////////