diff --git a/renderdoc/os/linux/linux_callstack.cpp b/renderdoc/os/linux/linux_callstack.cpp index be59851f7..85edb58f0 100644 --- a/renderdoc/os/linux/linux_callstack.cpp +++ b/renderdoc/os/linux/linux_callstack.cpp @@ -45,11 +45,16 @@ class LinuxCallstack : public Callstack::Stackwalk } LinuxCallstack(uint64_t *calls, size_t num) { - numLevels = (int)RDCMIN(ARRAY_COUNT(addrs), num); + Set(calls, num); + } + ~LinuxCallstack() {} + + void Set(uint64_t *calls, size_t num) + { + numLevels = num; for(int i=0; i < numLevels; i++) addrs[i] = calls[i]; } - ~LinuxCallstack() {} size_t NumLevels() const { return size_t(numLevels); } const uint64_t *GetAddrs() const { return addrs; } @@ -107,9 +112,9 @@ namespace Callstack return new LinuxCallstack(); } - Stackwalk *Load(uint64_t *calls, size_t numLevels) + Stackwalk *Create() { - return new LinuxCallstack(calls, numLevels); + return new LinuxCallstack(NULL, 0); } bool GetLoadedModules(char *&buf, size_t &size) diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index d3b4da325..fbbbffa54 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -140,6 +140,9 @@ namespace Callstack { public: virtual ~Stackwalk() {} + + virtual void Set(uint64_t *calls, size_t numLevels) = 0; + virtual size_t NumLevels() const = 0; virtual const uint64_t *GetAddrs() const = 0; }; @@ -165,7 +168,7 @@ namespace Callstack void Init(); Stackwalk *Collect(); - Stackwalk *Load(uint64_t *calls, size_t numLevels); + Stackwalk *Create(); StackResolver *MakeResolver(char *moduleDB, size_t DBSize, string pdbSearchPaths, volatile bool *killSignal); diff --git a/renderdoc/os/win32/win32_callstack.cpp b/renderdoc/os/win32/win32_callstack.cpp index f04af3d47..28fa8f2c4 100644 --- a/renderdoc/os/win32/win32_callstack.cpp +++ b/renderdoc/os/win32/win32_callstack.cpp @@ -42,19 +42,19 @@ class Win32Callstack : public Callstack::Stackwalk { public: Win32Callstack(); - Win32Callstack(uint64_t *calls, size_t numLevels); + Win32Callstack(DWORD64 *calls, size_t numLevels); ~Win32Callstack(); - size_t NumLevels() const { return m_NumLevels; } - const uint64_t *GetAddrs() const { return m_AddrStack; } + void Set(DWORD64 *calls, size_t numLevels); + + size_t NumLevels() const { return m_AddrStack.size(); } + const uint64_t *GetAddrs() const { return &m_AddrStack[0]; } private: Win32Callstack(const Callstack::Stackwalk &other); void Collect(); - size_t m_NumLevels; - DWORD64 *m_AddrStack; - DWORD64 *m_AllocStack; + vector m_AddrStack; }; class Win32CallstackResolver : public Callstack::StackResolver @@ -333,9 +333,8 @@ void Win32Callstack::Collect() stack32.erase(stack32.begin()); } - m_NumLevels = stack32.size(); - m_AllocStack = m_AddrStack = new DWORD64[m_NumLevels]; - for(size_t i=0; i < m_NumLevels; i++) + m_AddrStack.resize(stack32.size()); + for(size_t i=0; i < stack32.size(); i++) m_AddrStack[i] = (DWORD64)stack32[i]; } @@ -343,24 +342,24 @@ Win32Callstack::Win32Callstack() { bool ret = InitDbgHelp(); - m_AllocStack = m_AddrStack = NULL; - m_NumLevels = 0; - if(ret && renderdocBase != NULL) Collect(); } Win32Callstack::Win32Callstack(DWORD64 *calls, size_t numLevels) { - m_NumLevels = numLevels; - m_AllocStack = m_AddrStack = new DWORD64[m_NumLevels]; - for(size_t i=0; i < m_NumLevels; i++) + Set(calls, numLevels); +} + +void Win32Callstack::Set(DWORD64 *calls, size_t numLevels) +{ + m_AddrStack.resize(numLevels); + for(size_t i=0; i < numLevels; i++) m_AddrStack[i] = calls[i]; } Win32Callstack::~Win32Callstack() { - SAFE_DELETE_ARRAY(m_AllocStack); } wstring Win32CallstackResolver::pdbBrowse(wstring startingPoint) @@ -762,9 +761,9 @@ namespace Callstack return new Win32Callstack(); } - Stackwalk *Load(uint64_t *calls, size_t numLevels) + Stackwalk *Create() { - return new Win32Callstack(calls, numLevels); + return new Win32Callstack(NULL, 0); } StackResolver *MakeResolver(char *moduleDB, size_t DBSize, string pdbSearchPaths, volatile bool *killSignal) diff --git a/renderdoc/serialise/serialiser.cpp b/renderdoc/serialise/serialiser.cpp index 5e4f95f3f..480363489 100644 --- a/renderdoc/serialise/serialiser.cpp +++ b/renderdoc/serialise/serialiser.cpp @@ -131,7 +131,7 @@ void Serialiser::Reset() m_Indent = 0; SAFE_DELETE_ARRAY(m_pCallstack); - SAFE_DELETE_ARRAY(m_pResolver); + SAFE_DELETE(m_pResolver); if(m_Buffer) { FreeAlignedBuffer(m_Buffer); @@ -392,10 +392,10 @@ void Serialiser::InitCallstackResolver() void Serialiser::SetCallstack(uint64_t *levels, size_t numLevels) { - SAFE_DELETE(m_pCallstack); + if(m_pCallstack == NULL) + m_pCallstack = Callstack::Create(); - if(levels != NULL && numLevels != 0) - m_pCallstack = Callstack::Load(levels, numLevels); + m_pCallstack->Set(levels, numLevels); } void Serialiser::CreateResolver(void *ths) diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h index 57e0b3380..ff8b6310c 100644 --- a/renderdoc/serialise/serialiser.h +++ b/renderdoc/serialise/serialiser.h @@ -324,7 +324,7 @@ class Serialiser // get the callstack associated with the last scope Callstack::Stackwalk *GetLastCallstack() { - return m_pCallstack; + return (m_pCallstack && m_pCallstack->NumLevels() > 0) ? m_pCallstack : NULL; } //////////////////////////////////////////