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 }