chenluhua1980
2026-01-19 44360bc2cdeee16be72f9cc4bfb42e0ac26b5b44
SourceCode/Bond/Servo/Context.cpp
@@ -1,9 +1,37 @@
#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);
@@ -20,6 +48,11 @@
   DeleteCriticalSection(&m_criticalSection);
}
void CContext::setOnRelease(ONRELEASECALLBACK fOnRelease)
{
   m_onReleaseCallback = fOnRelease;
}
int CContext::addRef()
{
   Lock();
@@ -32,13 +65,20 @@
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)