src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

sync.go (498B)


      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 }