dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit c37b3fbffc3394d03e645e5f1ad2a5c8b3bd1538
parent 829e13f78ed4322a3cb0d961599e4adaea3007c9
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Wed,  6 Dec 2023 05:09:15 -0500

fix data race

Diffstat:
Mpkg/web/handlers/poker/poker.go | 32++++++++++++++++++++++++--------
1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/pkg/web/handlers/poker/poker.go b/pkg/web/handlers/poker/poker.go @@ -76,7 +76,9 @@ type Ongoing struct { Deck []string Players []*PokerPlayer Events []PokerEvent + EventsMtx sync.RWMutex LogEvents []LogEvent + LogEventsMtx sync.RWMutex CommunityCards []string WaitTurnEvent PokerWaitTurnEvent MainPot int @@ -110,6 +112,12 @@ type PokerGame struct { IsGameOver bool } +func (g *Ongoing) AddEvent(evts ...PokerEvent) string { + g.EventsMtx.Lock() + defer g.EventsMtx.Unlock() + g.Events = append(g.Events, evts...) +} + func (g *Ongoing) GetDeckStr() string { return g.getDeckStr() } @@ -187,7 +195,9 @@ func NewOngoing(g *PokerGame) *Ongoing { func newLogEvent(g *PokerGame, roomLogsTopic, msg string) { logEvt := LogEvent{Message: msg} PokerPubSub.Pub(roomLogsTopic, logEvt) + g.Ongoing.LogEventsMtx.Lock() g.Ongoing.LogEvents = append(g.Ongoing.LogEvents, logEvt) + g.Ongoing.LogEventsMtx.Unlock() } // Return either or not the game ended because only 1 player left playing @@ -244,7 +254,7 @@ OUTER: evt2 := PokerEvent{ID: "card" + itoa(player.Cards[1].Idx), Name: "", Idx: player.Cards[1].Idx, Top: BurnStackY, Left: BurnStackX, Reveal: false} PokerPubSub.Pub(roomTopic, evt1) PokerPubSub.Pub(roomTopic, evt2) - g.Ongoing.Events = append(g.Ongoing.Events, evt1, evt2) + g.Ongoing.AddEvent(evt1, evt2) //PokerPubSub.Pub(roomTopic, PlayerFoldEvent{Card1Idx: player.Cards[0].Idx, Card2Idx: player.Cards[1].Idx}) newLogEvent(g, roomLogsTopic, fmt.Sprintf("%s auto fold", p.Username)) @@ -269,7 +279,7 @@ OUTER: evt2 := PokerEvent{ID: "card" + itoa(player.Cards[1].Idx), Name: "", Idx: player.Cards[1].Idx, Top: BurnStackY, Left: BurnStackX, Reveal: false} PokerPubSub.Pub(roomTopic, evt1) PokerPubSub.Pub(roomTopic, evt2) - g.Ongoing.Events = append(g.Ongoing.Events, evt1, evt2) + g.Ongoing.AddEvent(evt1, evt2) //PokerPubSub.Pub(roomTopic, PlayerFoldEvent{Card1Idx: player.Cards[0].Idx, Card2Idx: player.Cards[1].Idx}) newLogEvent(g, roomLogsTopic, fmt.Sprintf("%s fold", p.Username)) @@ -385,7 +395,7 @@ func dealerThread(g *PokerGame, roomID string) { Left: BurnStackX + (burnIdx * 4), } PokerPubSub.Pub(roomTopic, evt) - g.Ongoing.Events = append(g.Ongoing.Events, evt) + g.Ongoing.AddEvent(evt) burnIdx++ } @@ -402,7 +412,7 @@ func dealerThread(g *PokerGame, roomID string) { Reveal: true, } PokerPubSub.Pub(roomTopic, evt) - g.Ongoing.Events = append(g.Ongoing.Events, evt) + g.Ongoing.AddEvent(evt) g.Ongoing.CommunityCards = append(g.Ongoing.CommunityCards, card) dealCardIdx++ } @@ -441,7 +451,7 @@ func dealerThread(g *PokerGame, roomID string) { PokerPubSub.Pub(roomTopic+"_"+p.Username, YourCardEvent{Idx: cardIdx, Name: card}) g.Ongoing.Players[i].Cards = append(g.Ongoing.Players[i].Cards, PlayerCard{Idx: idx, Name: card}) - g.Ongoing.Events = append(g.Ongoing.Events, evt) + g.Ongoing.AddEvent(evt) } } @@ -502,7 +512,7 @@ func dealerThread(g *PokerGame, roomID string) { evt2 := PokerEvent{ID: "card" + itoa(p.Cards[1].Idx), Name: p.Cards[1].Name, Idx: p.Cards[1].Idx, Top: seats[idx].Top, Left: seats[idx].Left + 53, Reveal: true} PokerPubSub.Pub(roomTopic, evt1) PokerPubSub.Pub(roomTopic, evt2) - g.Ongoing.Events = append(g.Ongoing.Events, evt1, evt2) + g.Ongoing.AddEvent(evt1, evt2) } } @@ -1192,9 +1202,11 @@ func PokerLogsHandler(c echo.Context) error { send(cssReset) send(`<style>body { background-color: #ccc; }</style><div style="display:flex;flex-direction:column-reverse;">`) if g.Ongoing != nil { + g.Ongoing.LogEventsMtx.RLock() for _, evt := range g.Ongoing.LogEvents { send(fmt.Sprintf(`<div>%s</div>`, evt.Message)) } + g.Ongoing.LogEventsMtx.RUnlock() } c.Response().Flush() @@ -1275,9 +1287,13 @@ func PokerHandler(c echo.Context) error { if g.IsGameDone { send(`<style>#deckStr:before { content: "` + g.Ongoing.GetDeckStr() + `"; }</style>`) } - for _, payload := range g.Ongoing.Events { - send(getPokerEventHtml(payload, "0s")) + + g.Ongoing.EventsMtx.RLock() + for _, evt := range g.Ongoing.Events { + send(getPokerEventHtml(evt, "0s")) } + g.Ongoing.EventsMtx.RUnlock() + } c.Response().Flush()