| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | 
							- package signal
 
- import (
 
- 	"sync"
 
- )
 
- // Done is a utility for notifications of something being done.
 
- type Done struct {
 
- 	access sync.Mutex
 
- 	c      chan struct{}
 
- 	closed bool
 
- }
 
- // NewDone returns a new Done.
 
- func NewDone() *Done {
 
- 	return &Done{
 
- 		c: make(chan struct{}),
 
- 	}
 
- }
 
- // Done returns true if Close() is called.
 
- func (d *Done) Done() bool {
 
- 	select {
 
- 	case <-d.c:
 
- 		return true
 
- 	default:
 
- 		return false
 
- 	}
 
- }
 
- // C returns a channel for waiting for done.
 
- func (d *Done) C() chan struct{} {
 
- 	return d.c
 
- }
 
- // Wait blocks until Close() is called.
 
- func (d *Done) Wait() {
 
- 	<-d.c
 
- }
 
- // Close marks this Done 'done'. This method may be called multiple times. All calls after first call will have no effect on its status.
 
- func (d *Done) Close() error {
 
- 	d.access.Lock()
 
- 	defer d.access.Unlock()
 
- 	if d.closed {
 
- 		return nil
 
- 	}
 
- 	d.closed = true
 
- 	close(d.c)
 
- 	return nil
 
- }
 
 
  |