From b5a4bc959df8aee316bedd4050ac34d77a858162 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Wed, 12 Jul 2023 18:36:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87=20?= =?UTF-8?q?super.StackGO=20=E8=BF=9B=E8=A1=8C=E8=B7=A8=E5=8D=8F=E7=A8=8B?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=BF=90=E8=A1=8C=E5=A0=86=E6=A0=88=E6=8A=93?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/super/stack.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/utils/super/stack.go b/utils/super/stack.go index 2458695..760d469 100644 --- a/utils/super/stack.go +++ b/utils/super/stack.go @@ -11,6 +11,7 @@ func NewStackGo() *StackGo { // StackGo 用于获取上一个协程调用的堆栈信息 // - 应当最先运行 Wait 函数,然后在其他协程中调用 Stack 函数或者 GiveUp 函数 +// - 适用于跨协程同步通讯,例如单线程的消息处理统计耗时打印堆栈信息 type StackGo struct { stack chan *struct{} // 消息堆栈 collect chan []byte // 消息堆栈收集 @@ -22,8 +23,6 @@ func (slf *StackGo) Wait() { slf.stack = make(chan *struct{}, 0) if s := <-slf.stack; s != nil { slf.collect <- debug.Stack() - close(slf.collect) - slf.collect = nil } close(slf.stack) slf.stack = nil @@ -33,10 +32,14 @@ func (slf *StackGo) Wait() { // - 在调用 Wait 函数后调用该函数,将会返回上一个协程的堆栈信息 // - 在调用 GiveUp 函数后调用该函数,将会 panic func (slf *StackGo) Stack() []byte { - slf.stack <- &struct{}{} + if slf.stack == nil { + return nil + } slf.collect = make(chan []byte, 1) + slf.stack <- &struct{}{} stack := <-slf.collect - slf.stack = nil + close(slf.collect) + slf.collect = nil return stack }