From e8a27bb203fe2aff70390a5eca002d7438da9b0f Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期三, 22 十月 2025 14:24:34 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/Servo/Context.cpp |   54 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/SourceCode/Bond/Servo/Context.cpp b/SourceCode/Bond/Servo/Context.cpp
index fad62bc..dff60f2 100644
--- a/SourceCode/Bond/Servo/Context.cpp
+++ b/SourceCode/Bond/Servo/Context.cpp
@@ -1,11 +1,39 @@
 #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 = CRC_UNKNOWN;
+	m_nRetCode = 0;
 	m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
 	InitializeCriticalSection(&m_criticalSection);
 }
@@ -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)

--
Gitblit v1.9.3