| | |
| | | #include "stdafx.h" |
| | | #include "Context.h" |
| | | #include <dbghelp.h> |
| | | |
| | | #pragma comment(lib, "dbghelp.lib") |
| | | |
| | | |
| | | void PrintStackTrace() |
| | | { |
| | | void* stack[62]; // 最多抓62层 |
| | | USHORT frames = CaptureStackBackTrace(0, 62, stack, NULL); |
| | | |
| | | HANDLE process = GetCurrentProcess(); |
| | | SymInitialize(process, NULL, TRUE); |
| | | for (USHORT i = 0; i < frames; ++i) { |
| | | DWORD64 address = (DWORD64)(stack[i]); |
| | | char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)]; |
| | | PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer; |
| | | symbol->SizeOfStruct = sizeof(SYMBOL_INFO); |
| | | symbol->MaxNameLen = MAX_SYM_NAME; |
| | | |
| | | if (SymFromAddr(process, address, 0, symbol)) { |
| | | TRACE(">>>> name:%s\n", symbol->Name); |
| | | } |
| | | else { |
| | | TRACE(">>>> name:%s\n", "SymFromAddr failed"); |
| | | } |
| | | } |
| | | |
| | | SymCleanup(process); |
| | | } |
| | | CContext::CContext() |
| | | { |
| | | m_onReleaseCallback = nullptr; |
| | | m_nRef = 0; |
| | | m_nRetCode = 0; |
| | | m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | |
| | | DeleteCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | | void CContext::setOnRelease(ONRELEASECALLBACK fOnRelease) |
| | | { |
| | | m_onReleaseCallback = fOnRelease; |
| | | } |
| | | |
| | | int CContext::addRef() |
| | | { |
| | | Lock(); |
| | |
| | | int CContext::release() |
| | | { |
| | | Lock(); |
| | | m_nRef--; |
| | | BOOL bDelete = m_nRef == 0; |
| | | Unlock(); |
| | | if (m_nRef > 0) { |
| | | m_nRef--; |
| | | BOOL bRefCount0 = m_nRef == 0; |
| | | Unlock(); |
| | | |
| | | int nRef = m_nRef;; |
| | | if (bDelete) delete this; |
| | | return nRef; |
| | | if (bRefCount0 && m_onReleaseCallback != nullptr) { |
| | | m_onReleaseCallback(this); |
| | | } |
| | | } |
| | | else { |
| | | Unlock(); |
| | | } |
| | | |
| | | return m_nRef; |
| | | } |
| | | |
| | | void CContext::setRetCode(int code) |