github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/net/reactor_bsd.go (about) 1 // +build darwin netbsd freebsd openbsd dragonfly 2 3 package net 4 5 import "github.com/angenalZZZ/gofunc/net/internal/netpoll" 6 7 func (svr *server) activateMainReactor() { 8 defer svr.signalShutdown() 9 10 svr.logger.Printf("main reactor exits with error:%v\n", svr.mainLoop.poller.Polling(func(fd int, filter int16) error { 11 return svr.acceptNewConnection(fd) 12 })) 13 } 14 15 func (svr *server) activateSubReactor(el *eventloop) { 16 defer func() { 17 el.closeAllConns() 18 if el.idx == 0 && svr.opts.Ticker { 19 close(svr.ticktock) 20 } 21 svr.signalShutdown() 22 }() 23 24 if el.idx == 0 && svr.opts.Ticker { 25 go el.loopTicker() 26 } 27 28 svr.logger.Printf("event-loop:%d exits with error:%v\n", el.idx, el.poller.Polling(func(fd int, filter int16) error { 29 if c, ack := el.connections[fd]; ack { 30 if filter == netpoll.EVFilterSock { 31 return el.loopCloseConn(c, nil) 32 } 33 switch c.outboundBuffer.IsEmpty() { 34 // Don't change the ordering of processing EVFILT_WRITE | EVFILT_READ | EV_ERROR/EV_EOF unless you're 100% 35 // sure what you're doing! 36 // Re-ordering can easily introduce bugs and bad side-effects, as I found out painfully in the past. 37 case false: 38 if filter == netpoll.EVFilterWrite { 39 return el.loopWrite(c) 40 } 41 return nil 42 case true: 43 if filter == netpoll.EVFilterRead { 44 return el.loopRead(c) 45 } 46 return nil 47 } 48 } 49 return nil 50 })) 51 }