diff --git a/roomserver/internal/input/input.go b/roomserver/internal/input/input.go index 2bed0c7f..6b833072 100644 --- a/roomserver/internal/input/input.go +++ b/roomserver/internal/input/input.go @@ -54,10 +54,8 @@ type inputWorker struct { input chan *inputTask } +// Guarded by a CAS on w.running func (w *inputWorker) start() { - if !w.running.CAS(false, true) { - return - } defer w.running.Store(false) for { select { @@ -142,7 +140,7 @@ func (r *Inputer) InputRoomEvents( // room - the channel will be quite small as it's just pointer types. w, _ := r.workers.LoadOrStore(roomID, &inputWorker{ r: r, - input: make(chan *inputTask, 10), + input: make(chan *inputTask, 32), }) worker := w.(*inputWorker) @@ -156,7 +154,9 @@ func (r *Inputer) InputRoomEvents( } // Send the task to the worker. - go worker.start() + if worker.running.CAS(false, true) { + go worker.start() + } worker.input <- tasks[i] }