github.com/moqsien/xraycore@v1.8.5/common/signal/done/done.go (about)

     1  package done
     2  
     3  import (
     4  	"sync"
     5  )
     6  
     7  // Instance is a utility for notifications of something being done.
     8  type Instance struct {
     9  	access sync.Mutex
    10  	c      chan struct{}
    11  	closed bool
    12  }
    13  
    14  // New returns a new Done.
    15  func New() *Instance {
    16  	return &Instance{
    17  		c: make(chan struct{}),
    18  	}
    19  }
    20  
    21  // Done returns true if Close() is called.
    22  func (d *Instance) Done() bool {
    23  	select {
    24  	case <-d.Wait():
    25  		return true
    26  	default:
    27  		return false
    28  	}
    29  }
    30  
    31  // Wait returns a channel for waiting for done.
    32  func (d *Instance) Wait() <-chan struct{} {
    33  	return d.c
    34  }
    35  
    36  // Close marks this Done 'done'. This method may be called multiple times. All calls after first call will have no effect on its status.
    37  func (d *Instance) Close() error {
    38  	d.access.Lock()
    39  	defer d.access.Unlock()
    40  
    41  	if d.closed {
    42  		return nil
    43  	}
    44  
    45  	d.closed = true
    46  	close(d.c)
    47  
    48  	return nil
    49  }