#pragma once #include #include #include #include #include namespace Poco { class Logger; } namespace DB { struct QueryStatus; struct ThreadStatus; struct ScopeCurrentThread; using ThreadStatusPtr = std::shared_ptr; struct ThreadStatus : public ext::shared_ptr_helper { UInt32 poco_thread_number = 0; QueryStatus * parent_query = nullptr; ProfileEvents::Counters performance_counters; MemoryTracker memory_tracker; bool thread_exited = false; std::mutex mutex; void init(QueryStatus * parent_query_, ProfileEvents::Counters * parent_counters, MemoryTracker * parent_memory_tracker); void onStart(); void onExit(); /// Reset all references and metrics void reset(); static void setCurrentThreadParentQuery(QueryStatus * parent_process); static void setCurrentThreadFromSibling(const ThreadStatusPtr & sibling_thread); ~ThreadStatus(); friend struct ScopeCurrentThread; //protected: ThreadStatus(); bool initialized = false; Poco::Logger * log; struct Impl; std::shared_ptr impl; }; extern thread_local ThreadStatusPtr current_thread; }