From: qydysky Date: Sat, 12 Apr 2025 17:26:47 +0000 (+0800) Subject: Improve 修复潜在data race (#188) X-Git-Tag: draft~1 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=f3c9f6e8a05c4ff74719690a5e85c0745b428048;p=bili_danmu%2F.git Improve 修复潜在data race (#188) * Improve 修复潜在data race * Improve 忽略master_qn_strategy_chg --- diff --git a/CV/Var.go b/CV/Var.go index c3a03ff..196e17a 100644 --- a/CV/Var.go +++ b/CV/Var.go @@ -894,16 +894,14 @@ var C = new(Common).Init() // https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming var StreamO = new(sync.Map) var Commons = new(syncmap.Map) -var CommonsLoadOrStore = syncmap.LoadOrStoreFunc[Common]{ - Init: func() *Common { - return C.Copy() - }, -} +var CommonsLoadOrInit = syncmap.NewLoadOrInitFunc[Common](Commons).SetInit(func() *Common { + return C.Copy() +}) // 消息队列 type Danmu_Main_mq_item struct { Class string - Data interface{} + Data any } // Web服务响应格式 diff --git a/Reply/F.go b/Reply/F.go index 60c2c8b..ccd6bd2 100644 --- a/Reply/F.go +++ b/Reply/F.go @@ -150,12 +150,17 @@ func StreamOStatus(roomid int) (Islive bool) { } // 开始实例 -func StreamOStart(common *c.Common, roomid int) { +func StreamOStart(roomid int) { if StreamOStatus(roomid) { flog.L(`W: `, `已录制 `+strconv.Itoa(roomid)+` 不能重复录制`) return } + common, _ := c.CommonsLoadOrInit.LoadOrInitPThen(roomid)(func(actual *c.Common, loaded bool) (*c.Common, bool) { + actual.Roomid = roomid + return actual, loaded + }) + if tmp, e := NewM4SStream(common); e != nil { flog.L(`E: `, e) } else { diff --git a/Reply/F/recStartEnd/recStartEnd.go b/Reply/F/recStartEnd/recStartEnd.go index ac57a31..121f62d 100644 --- a/Reply/F/recStartEnd/recStartEnd.go +++ b/Reply/F/recStartEnd/recStartEnd.go @@ -108,7 +108,7 @@ type StreamCtl struct { C *c.Common Commons *psync.Map State func(int) bool - Start func(*c.Common, int) + Start func(int) End func(int) Cut func(int) } @@ -155,7 +155,7 @@ func setNextFunc() { streamCtl.Cut(roomId) } else { logg.L(`T: `, "开始", roomId) - streamCtl.Start(common, roomId) + streamCtl.Start(roomId) } time.Sleep(time.Second * 5) break diff --git a/Reply/Msg.go b/Reply/Msg.go index e9587c9..7485461 100644 --- a/Reply/Msg.go +++ b/Reply/Msg.go @@ -17,6 +17,7 @@ var msglog = c.C.Log.Base(`Msg`) // Msg类型数据处理方法map var Msg_map = map[string]func(replyF, string){ + `master_qn_strategy_chg`: nil, `COMMON_ANIMATION`: nil, `UNIVERSAL_EVENT_GIFT`: nil, `UNIVERSAL_EVENT_GIFT_V2`: nil, diff --git a/Reply/Reply.go b/Reply/Reply.go index b0fa62e..7dde09f 100644 --- a/Reply/Reply.go +++ b/Reply/Reply.go @@ -955,7 +955,7 @@ func (t replyF) live(s string) { } if _, e := recStartEnd.RecStartCheck.Run(context.Background(), t.Common); e == nil { if !StreamOStatus(t.Common.Roomid) { - StreamOStart(t.Common, t.Common.Roomid) + StreamOStart(t.Common.Roomid) } } else { msglog.L(`W: `, "房间", type_item.Roomid, e) diff --git a/Reply/gtk.go b/Reply/gtk.go index 0ef64c9..88af494 100644 --- a/Reply/gtk.go +++ b/Reply/gtk.go @@ -343,7 +343,7 @@ func Gtk_danmu() { if i, e := strconv.Atoi(t); e != nil { show(`输入错误`, load_face("0room")) } else { - c.C.Roomid = i + // c.C.Roomid = i c.C.Danmu_Main_mq.Push_tag(`change_room`, i) } } else { diff --git a/bili_danmu.go b/bili_danmu.go index 07e74a7..883be3e 100644 --- a/bili_danmu.go +++ b/bili_danmu.go @@ -233,12 +233,22 @@ func Start(rootCtx context.Context) { // 获取房间实际id c.C.Roomid = F.GetRoomRealId(c.C.Roomid) - common, loaded := c.CommonsLoadOrStore.LoadOrStoreP(c.Commons, c.C.Roomid) + common, _ := c.CommonsLoadOrInit.LoadOrInitPThen(c.C.Roomid)(func(actual *c.Common, loaded bool) (*c.Common, bool) { + if loaded { + actual.InIdle = false + actual.Rev = 0.0 // 营收 + } else { + actual.Roomid = c.C.Roomid + } + return actual, loaded + }) - if loaded { - common.InIdle = false - common.Rev = 0.0 // 营收 - } + // if loaded { + // common.InIdle = false + // common.Rev = 0.0 // 营收 + // } else { + // common.Roomid = c.C.Roomid + // } exitSign = entryRoom(rootCtx, mainCtx, danmulog.BaseAdd(common.Roomid), common) @@ -391,7 +401,7 @@ func entryRoom(rootCtx, mainCtx context.Context, danmulog *part.Log_interface, c // go F.Dosign() reply.Entry_danmu(common) if _, e := recStartEnd.RecStartCheck.Run(mainCtx, common); e == nil { - reply.StreamOStart(common, common.Roomid) + reply.StreamOStart(common.Roomid) } else { danmulog.Base("功能", "指定房间录制区间").L(`I: `, common.Roomid, e) } diff --git a/cmd/cmd.go b/cmd/cmd.go index 457e7f5..46730a6 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -76,8 +76,7 @@ func Cmd() { if reply.StreamOStatus(room) { reply.StreamOStop(room) } else { - common, _ := c.CommonsLoadOrStore.LoadOrStoreP(c.Commons, room) - reply.StreamOStart(common, room) + reply.StreamOStart(room) } continue } @@ -88,8 +87,7 @@ func Cmd() { if reply.StreamOStatus(c.C.Roomid) { reply.StreamOStop(c.C.Roomid) } else { - common, _ := c.Commons.LoadV(c.C.Roomid).(*c.Common) - reply.StreamOStart(common, c.C.Roomid) + reply.StreamOStart(c.C.Roomid) } } continue @@ -103,7 +101,7 @@ func Cmd() { fmt.Print("\n") if room, ok := liveList[inputs]; ok { - c.C.Roomid = room + // c.C.Roomid = room c.C.Danmu_Main_mq.Push_tag(`change_room`, room) continue } else { @@ -220,7 +218,7 @@ func Cmd() { } //直接进入房间 if room, err := strconv.Atoi(inputs[1:]); err == nil { - c.C.Roomid = room + // c.C.Roomid = room cmdlog.L(`I: `, "进入房间", room) c.C.Danmu_Main_mq.Push_tag(`change_room`, room) continue diff --git a/go.mod b/go.mod index 8b6d52c..7da6cf5 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24 require ( github.com/gotk3/gotk3 v0.6.4 github.com/mdp/qrterminal/v3 v3.2.0 - github.com/qydysky/part v0.28.20250406180726 + github.com/qydysky/part v0.28.20250412164915 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 golang.org/x/text v0.23.0 // indirect @@ -28,7 +28,7 @@ require ( github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect golang.org/x/crypto v0.36.0 // indirect golang.org/x/sync v0.12.0 // indirect - golang.org/x/term v0.30.0 // indirect + golang.org/x/term v0.31.0 // indirect modernc.org/libc v1.61.13 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.8.2 // indirect @@ -49,7 +49,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/mod v0.23.0 // indirect golang.org/x/net v0.37.0 // indirect - golang.org/x/sys v0.31.0 // indirect + golang.org/x/sys v0.32.0 // indirect golang.org/x/tools v0.30.0 // indirect modernc.org/sqlite v1.35.0 rsc.io/qr v0.2.0 // indirect diff --git a/go.sum b/go.sum index e8beba5..533009e 100644 --- a/go.sum +++ b/go.sum @@ -46,8 +46,8 @@ github.com/qydysky/biliApi v0.0.0-20250406112014-bf8c070170f6 h1:eWklz9YhqcLnJeH github.com/qydysky/biliApi v0.0.0-20250406112014-bf8c070170f6/go.mod h1:1FbgCj+aOwIvuRRuX/l5uTLb3JIwWyJSa0uEfwpYV/8= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9 h1:k451T+bpsLr+Dq9Ujo+Qtx0iomRA1XXS5ttlEojvfuQ= github.com/qydysky/brotli v0.0.0-20240828134800-e9913a6e7ed9/go.mod h1:cI8/gy/wjy2Eb+p2IUj2ZuDnC8R5Vrx3O0VMPvMvphA= -github.com/qydysky/part v0.28.20250406180726 h1:uCHzGPpH3USZR7tilD5H0h07DjZNMF4XU2K+U+Q7TIc= -github.com/qydysky/part v0.28.20250406180726/go.mod h1:RHYTy8EbqCP6OioVf6BkvFcfWLNO0S220zl0DDlY84Y= +github.com/qydysky/part v0.28.20250412164915 h1:PKRGmiu0WUKG2u3r8++aj4Lg0eVkTosqSbXT88Ha+rg= +github.com/qydysky/part v0.28.20250412164915/go.mod h1:ZkQ6is2A8QCSwiJ9JGgKnW3FEPcUKwCDeY02Nu7eix8= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -82,10 +82,10 @@ golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=