sync.go raw

   1  package sync
   2  
   3  type Semaphore struct {
   4  	ch chan struct{}
   5  }
   6  
   7  func NewSemaphore(size int) Semaphore {
   8  	return Semaphore{
   9  		ch: make(chan struct{}, size),
  10  	}
  11  }
  12  
  13  func (sem Semaphore) Acquire() {
  14  	sem.ch <- struct{}{}
  15  }
  16  
  17  func (sem Semaphore) AcquireMaybe() bool {
  18  	select {
  19  	case sem.ch <- struct{}{}:
  20  		return true
  21  	default:
  22  		return false
  23  	}
  24  }
  25  
  26  func (sem Semaphore) Release() {
  27  	<-sem.ch
  28  }
  29  
  30  func (sem Semaphore) Len() int {
  31  	return len(sem.ch)
  32  }
  33  
  34  func (sem Semaphore) Cap() int {
  35  	return cap(sem.ch)
  36  }
  37