You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Framework/AzToolsFramework/AzToolsFramework/Debug/TraceContextMultiStackHandl...

163 lines
5.2 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AzCore/std/smart_ptr/make_shared.h>
#include <AzToolsFramework/Debug/TraceContextMultiStackHandler.h>
namespace AzToolsFramework
{
namespace Debug
{
#ifdef AZ_ENABLE_TRACE_CONTEXT
TraceContextMultiStackHandler::TraceContextMultiStackHandler()
{
BusConnect();
}
TraceContextMultiStackHandler::~TraceContextMultiStackHandler()
{
BusDisconnect();
}
void TraceContextMultiStackHandler::PushStringEntry(AZStd::thread::id threadId, const char* key, const char* value)
{
GetStackByThreadId(threadId).PushStringEntry(key, value);
}
void TraceContextMultiStackHandler::PushBoolEntry(AZStd::thread::id threadId, const char* key, bool value)
{
GetStackByThreadId(threadId).PushBoolEntry(key, value);
}
void TraceContextMultiStackHandler::PushIntEntry(AZStd::thread::id threadId, const char* key, int64_t value)
{
GetStackByThreadId(threadId).PushIntEntry(key, value);
}
void TraceContextMultiStackHandler::PushUintEntry(AZStd::thread::id threadId, const char* key, uint64_t value)
{
GetStackByThreadId(threadId).PushUintEntry(key, value);
}
void TraceContextMultiStackHandler::PushFloatEntry(AZStd::thread::id threadId, const char* key, float value)
{
GetStackByThreadId(threadId).PushFloatEntry(key, value);
}
void TraceContextMultiStackHandler::PushDoubleEntry(AZStd::thread::id threadId, const char* key, double value)
{
GetStackByThreadId(threadId).PushDoubleEntry(key, value);
}
void TraceContextMultiStackHandler::PushUuidEntry(AZStd::thread::id threadId, const char* key, const AZ::Uuid* value)
{
GetStackByThreadId(threadId).PushUuidEntry(key, value);
}
void TraceContextMultiStackHandler::PopEntry(AZStd::thread::id threadId)
{
GetStackByThreadId(threadId).PopEntry();
}
size_t TraceContextMultiStackHandler::GetStackCount() const
{
return m_threadStacks.size();
}
uint64_t TraceContextMultiStackHandler::GetStackId(size_t index) const
{
if (index < m_threadStacks.size())
{
auto iterator = m_threadStacks.begin();
AZStd::advance(iterator, index);
return iterator->first;
}
else
{
return 0;
}
}
AZStd::shared_ptr<const TraceContextStack> TraceContextMultiStackHandler::GetStack(size_t index) const
{
if (index < m_threadStacks.size())
{
auto iterator = m_threadStacks.begin();
AZStd::advance(iterator, index);
return iterator->second;
}
else
{
return nullptr;
}
}
AZStd::shared_ptr<const TraceContextStack> TraceContextMultiStackHandler::GetCurrentStack() const
{
uint64_t currentThreadId = (uint64_t)AZStd::this_thread::get_id().m_id;
auto entry = m_threadStacks.find(currentThreadId);
if (entry != m_threadStacks.end())
{
return entry->second;
}
else
{
return nullptr;
}
}
TraceContextStack& TraceContextMultiStackHandler::GetStackByThreadId(AZStd::thread::id threadId)
{
// Using a c-style cast because AZStd::hash hasn't been specialized (yet) for thread::id and the type can differ per
// platform, requiring static_cast on some and reinterpret_cast on others;
auto entry = m_threadStacks.find((uint64_t)threadId.m_id);
if (entry != m_threadStacks.end())
{
return *(entry->second);
}
else
{
AZStd::shared_ptr<TraceContextStack> traceContext = AZStd::make_shared<TraceContextStack>();
m_threadStacks[(uint64_t)threadId.m_id] = traceContext;
return *traceContext;
}
}
#else // AZ_ENABLE_TRACE_CONTEXT
TraceContextMultiStackHandler::TraceContextMultiStackHandler()
{
}
TraceContextMultiStackHandler::~TraceContextMultiStackHandler()
{
}
size_t TraceContextMultiStackHandler::GetStackCount() const
{
return 0;
}
uint64_t TraceContextMultiStackHandler::GetStackId(size_t /*index*/) const
{
return 0;
}
AZStd::shared_ptr<const TraceContextStack> TraceContextMultiStackHandler::GetStack(size_t /*index*/) const
{
return nullptr;
}
AZStd::shared_ptr<const TraceContextStack> TraceContextMultiStackHandler::GetCurrentStack() const
{
return nullptr;
}
#endif // AZ_ENABLE_TRACE_CONTEXT
} // Debug
} // AzToolsFramework