xref: /unit/go/observable.go (revision 1323:6dfc9895e25e)
1*1323Smax.romanov@nginx.com/*
2*1323Smax.romanov@nginx.com * Copyright (C) NGINX, Inc.
3*1323Smax.romanov@nginx.com */
4*1323Smax.romanov@nginx.com
5*1323Smax.romanov@nginx.compackage unit
6*1323Smax.romanov@nginx.com
7*1323Smax.romanov@nginx.comimport (
8*1323Smax.romanov@nginx.com	"sync"
9*1323Smax.romanov@nginx.com)
10*1323Smax.romanov@nginx.com
11*1323Smax.romanov@nginx.comtype observable struct {
12*1323Smax.romanov@nginx.com	sync.Mutex
13*1323Smax.romanov@nginx.com	observers []chan int
14*1323Smax.romanov@nginx.com}
15*1323Smax.romanov@nginx.com
16*1323Smax.romanov@nginx.comfunc (o *observable) attach(c chan int) {
17*1323Smax.romanov@nginx.com	o.Lock()
18*1323Smax.romanov@nginx.com	defer o.Unlock()
19*1323Smax.romanov@nginx.com
20*1323Smax.romanov@nginx.com	o.observers = append(o.observers, c)
21*1323Smax.romanov@nginx.com}
22*1323Smax.romanov@nginx.com
23*1323Smax.romanov@nginx.comfunc (o *observable) notify(e int) {
24*1323Smax.romanov@nginx.com	o.Lock()
25*1323Smax.romanov@nginx.com	defer o.Unlock()
26*1323Smax.romanov@nginx.com
27*1323Smax.romanov@nginx.com	for _, v := range o.observers {
28*1323Smax.romanov@nginx.com		v <- e
29*1323Smax.romanov@nginx.com	}
30*1323Smax.romanov@nginx.com
31*1323Smax.romanov@nginx.com	o.observers = nil
32*1323Smax.romanov@nginx.com}
33