diff options
Diffstat (limited to '3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp')
-rw-r--r-- | 3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp b/3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp index 7e628d0b5f1..f4e3e3b501a 100644 --- a/3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp +++ b/3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp @@ -2,7 +2,7 @@ // detail/impl/handler_tracking.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -29,7 +29,7 @@ #if defined(ASIO_HAS_BOOST_DATE_TIME) # include "asio/time_traits.hpp" -#elif defined(ASIO_HAS_CHRONO) +#else // defined(ASIO_HAS_BOOST_DATE_TIME) # include "asio/detail/chrono.hpp" # include "asio/detail/chrono_time_traits.hpp" # include "asio/wait_traits.hpp" @@ -57,12 +57,12 @@ struct handler_tracking_timestamp boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1)); boost::posix_time::time_duration now = boost::posix_time::microsec_clock::universal_time() - epoch; -#elif defined(ASIO_HAS_CHRONO) +#else // defined(ASIO_HAS_BOOST_DATE_TIME) typedef chrono_time_traits<chrono::system_clock, - asio::wait_traits<chrono::system_clock> > traits_helper; + asio::wait_traits<chrono::system_clock>> traits_helper; traits_helper::posix_time_duration now( chrono::system_clock::now().time_since_epoch()); -#endif +#endif // defined(ASIO_HAS_BOOST_DATE_TIME) seconds = static_cast<uint64_t>(now.total_seconds()); microseconds = static_cast<uint64_t>(now.total_microseconds() % 1000000); } @@ -73,11 +73,12 @@ struct handler_tracking::tracking_state static_mutex mutex_; uint64_t next_id_; tss_ptr<completion>* current_completion_; + tss_ptr<location>* current_location_; }; handler_tracking::tracking_state* handler_tracking::get_state() { - static tracking_state state = { ASIO_STATIC_MUTEX_INIT, 1, 0 }; + static tracking_state state = { ASIO_STATIC_MUTEX_INIT, 1, 0, 0 }; return &state; } @@ -90,6 +91,25 @@ void handler_tracking::init() static_mutex::scoped_lock lock(state->mutex_); if (state->current_completion_ == 0) state->current_completion_ = new tss_ptr<completion>; + if (state->current_location_ == 0) + state->current_location_ = new tss_ptr<location>; +} + +handler_tracking::location::location( + const char* file, int line, const char* func) + : file_(file), + line_(line), + func_(func), + next_(*get_state()->current_location_) +{ + if (file_) + *get_state()->current_location_ = this; +} + +handler_tracking::location::~location() +{ + if (file_) + *get_state()->current_location_ = next_; } void handler_tracking::creation(execution_context&, @@ -109,6 +129,24 @@ void handler_tracking::creation(execution_context&, if (completion* current_completion = *state->current_completion_) current_id = current_completion->id_; + for (location* current_location = *state->current_location_; + current_location; current_location = current_location->next_) + { + write_line( +#if defined(ASIO_WINDOWS) + "@asio|%I64u.%06I64u|%I64u^%I64u|%s%s%.80s%s(%.80s:%d)\n", +#else // defined(ASIO_WINDOWS) + "@asio|%llu.%06llu|%llu^%llu|%s%s%.80s%s(%.80s:%d)\n", +#endif // defined(ASIO_WINDOWS) + timestamp.seconds, timestamp.microseconds, + current_id, h.id_, + current_location == *state->current_location_ ? "in " : "called from ", + current_location->func_ ? "'" : "", + current_location->func_ ? current_location->func_ : "", + current_location->func_ ? "' " : "", + current_location->file_, current_location->line_); + } + write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|%I64u*%I64u|%.20s@%p.%.50s\n", @@ -327,7 +365,9 @@ void handler_tracking::write_line(const char* format, ...) va_start(args, format); char line[256] = ""; -#if defined(ASIO_HAS_SECURE_RTL) +#if defined(ASIO_HAS_SNPRINTF) + int length = vsnprintf(line, sizeof(line), format, args); +#elif defined(ASIO_HAS_SECURE_RTL) int length = vsprintf_s(line, sizeof(line), format, args); #else // defined(ASIO_HAS_SECURE_RTL) int length = vsprintf(line, format, args); |