github.com/MetalBlockchain/metalgo@v1.11.9/utils/wrappers/closers.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package wrappers 5 6 import ( 7 "io" 8 "sync" 9 ) 10 11 // Closer is a nice utility for closing a group of objects while reporting an 12 // error if one occurs. 13 type Closer struct { 14 lock sync.Mutex 15 closers []io.Closer 16 } 17 18 // Add a new object to be closed. 19 func (c *Closer) Add(closer io.Closer) { 20 c.lock.Lock() 21 defer c.lock.Unlock() 22 23 c.closers = append(c.closers, closer) 24 } 25 26 // Close closes each of the closers add to [c] and returns the first error 27 // that occurs or nil if no error occurs. 28 func (c *Closer) Close() error { 29 c.lock.Lock() 30 closers := c.closers 31 c.closers = nil 32 c.lock.Unlock() 33 34 errs := Errs{} 35 for _, closer := range closers { 36 errs.Add(closer.Close()) 37 } 38 return errs.Err 39 }