1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package entry
- import (
- "io"
- "net"
- "sync/atomic"
- )
- type Listener struct {
- addr net.Addr
- ch chan net.Conn
- exitFlag int32
- exitChan chan struct{}
- }
- func (l *Listener) Receive(conn net.Conn) {
- select {
- case l.ch <- conn:
- case <-l.exitChan:
- }
- }
- func (l *Listener) Accept() (net.Conn, error) {
- select {
- case conn, ok := <-l.ch:
- if ok {
- return conn, nil
- } else {
- return nil, io.ErrClosedPipe
- }
- case <-l.exitChan:
- return nil, io.ErrClosedPipe
- }
- }
- func (l *Listener) Close() error {
- if atomic.CompareAndSwapInt32(&l.exitFlag, 0, 1) {
- close(l.exitChan)
- }
- return nil
- }
- func (l *Listener) Addr() net.Addr {
- return l.addr
- }
- func newListener(addr net.Addr) *Listener {
- return &Listener{
- addr: addr,
- ch: make(chan net.Conn, 10),
- exitChan: make(chan struct{}),
- }
- }
|