-
Notifications
You must be signed in to change notification settings - Fork 0
/
semaphore.go
29 lines (25 loc) · 1019 Bytes
/
semaphore.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package hashgrab
// Semaphore is a simple implementation of a counting semaphore using a channel.
type Semaphore struct {
// sem is a channel that will be used to manage resources.
sem chan struct{}
}
// NewSemaphore initializes a new Semaphore with a provided limit.
// It returns a pointer to the Semaphore instance.
func NewSemaphore(limit int) *Semaphore {
// The channel is buffered with a capacity of 'limit'.
// Any write to the channel blocks when 'limit' number of writes have been made
// that have not yet been matched by reads.
return &Semaphore{sem: make(chan struct{}, limit)}
}
// Acquire acquires a unit of resource.
// If all units of the resource are occupied, Acquire blocks until a unit becomes free.
func (s *Semaphore) Acquire() {
// Writing to the 'sem' channel represents acquiring a unit of resource.
s.sem <- struct{}{}
}
// Release releases a unit of resource.
func (s *Semaphore) Release() {
// Reading from the 'sem' channel represents releasing a unit of resource.
<-s.sem
}