From e36d7bdde255bb7b48838f06ba196d846b691d62 Mon Sep 17 00:00:00 2001 From: Jordan Orelli Date: Wed, 4 Nov 2020 04:39:22 +0000 Subject: [PATCH] fixing up some outbox race conditions --- internal/sim/player.go | 16 +++++++++++++++- internal/sim/world.go | 6 +++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/internal/sim/player.go b/internal/sim/player.go index e07afa0..a45303a 100644 --- a/internal/sim/player.go +++ b/internal/sim/player.go @@ -50,7 +50,7 @@ func (p *player) start(c chan Request, conn *websocket.Conn, r *room) { welcome.Players[p.name] = wp } p.Info("sending welcome to outbox") - p.outbox <- wire.Response{Re: 1, Body: welcome} + p.send(wire.Response{Re: 1, Body: welcome}) p.Info("sent welcome, starting loops") p.stop = make(chan bool, 1) go p.readLoop(c, conn) @@ -115,6 +115,20 @@ func (p *player) runLoop(conn *websocket.Conn) { } } +func (p *player) send(res wire.Response) bool { + select { + case p.outbox <- res: + return true + default: + select { + case <-p.outbox: + return p.send(res) + default: + return false + } + } +} + func sendResponse(conn *websocket.Conn, res wire.Response) error { payload, err := json.Marshal(res) if err != nil { diff --git a/internal/sim/world.go b/internal/sim/world.go index a5435ff..f9bffca 100644 --- a/internal/sim/world.go +++ b/internal/sim/world.go @@ -193,9 +193,9 @@ func (w *world) tick(d time.Duration) { res := req.Wants.exec(w, r, p, req.Seq) if res.reply != nil { - p.outbox <- wire.Response{Re: req.Seq, Body: res.reply} + p.send(wire.Response{Re: req.Seq, Body: res.reply}) } else { - p.outbox <- wire.Response{Re: req.Seq, Body: wire.OK{}} + p.send(wire.Response{Re: req.Seq, Body: wire.OK{}}) } } } @@ -214,7 +214,7 @@ func (w *world) tick(d time.Duration) { } for _, p := range r.players { - p.outbox <- wire.Response{Body: frame} + p.send(wire.Response{Body: frame}) } } }