2017-05-28 08:19:01 +00:00
|
|
|
package backend
|
|
|
|
|
2017-07-23 12:21:03 +00:00
|
|
|
import "github.com/restic/restic/internal/errors"
|
2017-06-05 22:17:21 +00:00
|
|
|
|
2017-05-28 08:19:01 +00:00
|
|
|
// Semaphore limits access to a restricted resource.
|
|
|
|
type Semaphore struct {
|
|
|
|
ch chan struct{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewSemaphore returns a new semaphore with capacity n.
|
2017-06-05 22:17:21 +00:00
|
|
|
func NewSemaphore(n uint) (*Semaphore, error) {
|
|
|
|
if n <= 0 {
|
|
|
|
return nil, errors.New("must be a positive number")
|
|
|
|
}
|
2017-05-28 08:19:01 +00:00
|
|
|
return &Semaphore{
|
|
|
|
ch: make(chan struct{}, n),
|
2017-06-05 22:17:21 +00:00
|
|
|
}, nil
|
2017-05-28 08:19:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetToken blocks until a Token is available.
|
|
|
|
func (s *Semaphore) GetToken() {
|
|
|
|
s.ch <- struct{}{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReleaseToken returns a token.
|
|
|
|
func (s *Semaphore) ReleaseToken() {
|
|
|
|
<-s.ch
|
|
|
|
}
|