summaryrefslogtreecommitdiff
path: root/forks.go
blob: ba57ef73255f35cd262c0d25f93c838cf240127b (plain)
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
30
31
32
33
package main

import "time"

type Fork chan struct{}

func NewForks(n int) []Fork {
	forks := make([]Fork, n)

	for i := range forks {
		forks[i] = make(Fork, 1)
		forks[i].Put()
	}

	return forks
}

func (f Fork) Grab() {
	<-f
}

func (f Fork) TryGrab(d time.Duration) bool {
	select {
	case <-f:
		return true
	case <-time.After(d):
		return false
	}
}

func (f Fork) Put() {
	f <- struct{}{}
}