commit c37b3fbffc3394d03e645e5f1ad2a5c8b3bd1538
parent 829e13f78ed4322a3cb0d961599e4adaea3007c9
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Wed, 6 Dec 2023 05:09:15 -0500
fix data race
Diffstat:
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()