Example #1
0
func NewMon() *ImpMon {
	//
	var m mon.Monitor
	var nR, nW int
	f := func(a Any, k uint) Any {
		switch k {
		case rIn:
			for nW > 0 {
				m.Wait(rIn)
			}
			nR++
			m.Signal(rIn)
		case rOut:
			nR--
			if nR == 0 {
				m.Signal(wIn)
			}
		case wIn:
			for nR > 0 || nW > 0 {
				m.Wait(wIn)
			}
			nW = 1
		case wOut:
			nW = 0
			if m.Awaited(rIn) {
				m.Signal(rIn)
			} else {
				m.Signal(wIn)
			}
		}
		return nil
	}
	m = mon.New(4, f)
	return &ImpMon{m}
}