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  }