From 1c74459c838fe676457dc9125dd2713be989bca9 Mon Sep 17 00:00:00 2001 From: Andy Pan Date: Fri, 5 Feb 2021 23:15:50 +0800 Subject: [PATCH] fix: resolve race test --- eventloop_unix.go | 7 ------- reactor_bsd.go | 11 +---------- reactor_linux.go | 11 +---------- server_unix.go | 16 +++++++++++++++- server_windows.go | 8 +++++++- 5 files changed, 24 insertions(+), 29 deletions(-) diff --git a/eventloop_unix.go b/eventloop_unix.go index 1599a230a..eeb18598d 100644 --- a/eventloop_unix.go +++ b/eventloop_unix.go @@ -72,16 +72,9 @@ func (el *eventloop) loopRun(lockOSThread bool) { defer func() { el.closeAllConns() el.ln.close() - if el.idx == 0 && el.svr.opts.Ticker { - close(el.svr.ticktock) - } el.svr.signalShutdown() }() - if el.idx == 0 && el.svr.opts.Ticker { - go el.loopTicker() - } - err := el.poller.Polling(el.handleEvent) el.svr.logger.Infof("Event-loop(%d) is exiting due to error: %v", el.idx, err) } diff --git a/reactor_bsd.go b/reactor_bsd.go index 3687bac00..907141983 100644 --- a/reactor_bsd.go +++ b/reactor_bsd.go @@ -34,16 +34,7 @@ func (svr *server) activateMainReactor(lockOSThread bool) { defer runtime.UnlockOSThread() } - defer func() { - if svr.opts.Ticker { - close(svr.ticktock) - } - svr.signalShutdown() - }() - - if svr.opts.Ticker { - go svr.mainLoop.loopTicker() - } + defer svr.signalShutdown() err := svr.mainLoop.poller.Polling(func(fd int, filter int16) error { return svr.acceptNewConnection(fd) }) svr.logger.Infof("Main reactor is exiting due to error: %v", err) diff --git a/reactor_linux.go b/reactor_linux.go index c00071014..de0c248be 100644 --- a/reactor_linux.go +++ b/reactor_linux.go @@ -32,16 +32,7 @@ func (svr *server) activateMainReactor(lockOSThread bool) { defer runtime.UnlockOSThread() } - defer func() { - if svr.opts.Ticker { - close(svr.ticktock) - } - svr.signalShutdown() - }() - - if svr.opts.Ticker { - go svr.mainLoop.loopTicker() - } + defer svr.signalShutdown() err := svr.mainLoop.poller.Polling(func(fd int, ev uint32) error { return svr.acceptNewConnection(fd) }) svr.logger.Infof("Main reactor is exiting due to error: %v", err) diff --git a/server_unix.go b/server_unix.go index 0061747a5..6ace13ccd 100644 --- a/server_unix.go +++ b/server_unix.go @@ -122,6 +122,11 @@ func (svr *server) activateEventLoops(numEventLoop int) (err error) { el.calibrateCallback = svr.lb.calibrate _ = el.poller.AddRead(el.ln.fd) svr.lb.register(el) + + // Start the ticker. + if el.idx == 0 && svr.opts.Ticker { + go el.loopTicker() + } } else { return } @@ -145,6 +150,11 @@ func (svr *server) activateReactors(numEventLoop int) error { el.eventHandler = svr.eventHandler el.calibrateCallback = svr.lb.calibrate svr.lb.register(el) + + // Start the ticker. + if el.idx == 0 && svr.opts.Ticker { + go el.loopTicker() + } } else { return err } @@ -159,7 +169,6 @@ func (svr *server) activateReactors(numEventLoop int) error { el.idx = -1 el.svr = svr el.poller = p - el.eventHandler = svr.eventHandler _ = el.poller.AddRead(el.ln.fd) svr.mainLoop = el @@ -214,6 +223,11 @@ func (svr *server) stop(s Server) { sniffErrorAndLog(svr.mainLoop.poller.Close()) } + // Stop the ticker. + if svr.opts.Ticker { + close(svr.ticktock) + } + atomic.StoreInt32(&svr.inShutdown, 1) } diff --git a/server_windows.go b/server_windows.go index 5e7c26f57..08c3a1ef8 100644 --- a/server_windows.go +++ b/server_windows.go @@ -97,6 +97,8 @@ func (svr *server) startEventLoops(numEventLoop int) { el.eventHandler = svr.eventHandler el.calibrateCallback = svr.lb.calibrate svr.lb.register(el) + + // Start the ticker. if el.idx == 0 && svr.opts.Ticker { go el.loopTicker() } @@ -115,7 +117,6 @@ func (svr *server) stop(s Server) { svr.eventHandler.OnShutdown(s) - close(svr.ticktock) // Close listener. svr.ln.close() svr.listenerWG.Wait() @@ -137,6 +138,11 @@ func (svr *server) stop(s Server) { }) svr.loopWG.Wait() + // Stop the ticker. + if svr.opts.Ticker { + close(svr.ticktock) + } + atomic.StoreInt32(&svr.inShutdown, 1) }