github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/tsa/tsacmd/server_runner.go (about)

     1  package tsacmd
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"os"
     7  
     8  	"code.cloudfoundry.org/lager"
     9  )
    10  
    11  type serverRunner struct {
    12  	logger lager.Logger
    13  
    14  	server *server
    15  
    16  	listenAddr string
    17  }
    18  
    19  func (runner serverRunner) Run(signals <-chan os.Signal, ready chan<- struct{}) error {
    20  	listener, err := net.Listen("tcp", runner.listenAddr)
    21  	if err != nil {
    22  		return fmt.Errorf("failed to listen on %s: %s", runner.listenAddr, err)
    23  	}
    24  
    25  	runner.logger.Info("listening")
    26  
    27  	close(ready)
    28  
    29  	exited := make(chan struct{})
    30  
    31  	go func() {
    32  		defer close(exited)
    33  		runner.server.Serve(listener)
    34  	}()
    35  
    36  	for {
    37  		select {
    38  		case <-exited:
    39  			return nil
    40  		case <-signals:
    41  			listener.Close()
    42  		}
    43  	}
    44  }