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  }