| package sync | |
| // Rudimentary implementation of a mutex for interp tests. | |
| type Mutex struct { | |
| c chan int // Mutex is held when held c!=nil and is empty. Access is guarded by g. | |
| } | |
| func (m *Mutex) Lock() { | |
| c := ch(m) | |
| <-c | |
| } | |
| func (m *Mutex) Unlock() { | |
| c := ch(m) | |
| c <- 1 | |
| } | |
| // sequentializes Mutex.c access. | |
| var g = make(chan int, 1) | |
| func init() { | |
| g <- 1 | |
| } | |
| // ch initializes the m.c field if needed and returns it. | |
| func ch(m *Mutex) chan int { | |
| <-g | |
| defer func() { | |
| g <- 1 | |
| }() | |
| if m.c == nil { | |
| m.c = make(chan int, 1) | |
| m.c <- 1 | |
| } | |
| return m.c | |
| } |