github.com/MetalBlockchain/metalgo@v1.11.9/vms/rpcchainvm/grpcutils/server_closer.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package grpcutils
     5  
     6  import (
     7  	"sync"
     8  
     9  	"google.golang.org/grpc"
    10  )
    11  
    12  type ServerCloser struct {
    13  	lock    sync.Mutex
    14  	closed  bool
    15  	servers []*grpc.Server
    16  }
    17  
    18  func (s *ServerCloser) Add(server *grpc.Server) {
    19  	s.lock.Lock()
    20  	defer s.lock.Unlock()
    21  
    22  	if s.closed {
    23  		server.Stop()
    24  	} else {
    25  		s.servers = append(s.servers, server)
    26  	}
    27  }
    28  
    29  func (s *ServerCloser) Stop() {
    30  	s.lock.Lock()
    31  	defer s.lock.Unlock()
    32  
    33  	for _, server := range s.servers {
    34  		server.Stop()
    35  	}
    36  	s.closed = true
    37  	s.servers = nil
    38  }
    39  
    40  func (s *ServerCloser) GracefulStop() {
    41  	s.lock.Lock()
    42  	defer s.lock.Unlock()
    43  
    44  	for _, server := range s.servers {
    45  		server.GracefulStop()
    46  	}
    47  	s.closed = true
    48  	s.servers = nil
    49  }