locking in prog

master
Bel LaPointe 2020-05-13 16:29:23 -06:00
parent c9872c7725
commit d2cebde4dc
2 changed files with 19 additions and 4 deletions

21
pool.go
View File

@ -8,17 +8,32 @@ import (
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
) )
type Conn struct {
ws websocket.Conn
lock sync.Mutex
}
type Pool struct { type Pool struct {
conns *sync.Map //map[string]*websocket.Conn lock *sync.RWMutex
conns *sync.Map //map[string]*Conn
} }
func NewPool() *Pool { func NewPool() *Pool {
return &Pool{ return &Pool{
conns: &sync.Map{}, //map[string]*websocket.Conn{}, conns: &sync.Map{},
lock: &sync.RWMutex{},
} }
} }
func (p *Pool) Push(id string, conn *websocket.Conn) {
p.lock.Lock()
defer p.lock.Unlock()
p.conns.Store(id, &Conn{ws: *conn})
}
func (p *Pool) Broadcast(mt int, r io.Reader) error { func (p *Pool) Broadcast(mt int, r io.Reader) error {
p.lock.RLock()
defer p.lock.RUnlock()
// io.MultiWriter exists but I like this // io.MultiWriter exists but I like this
b, err := ioutil.ReadAll(r) b, err := ioutil.ReadAll(r)
if err != nil { if err != nil {
@ -28,7 +43,7 @@ func (p *Pool) Broadcast(mt int, r io.Reader) error {
cnt := 0 cnt := 0
p.conns.Range(func(k, v interface{}) bool { p.conns.Range(func(k, v interface{}) bool {
k = k.(string) k = k.(string)
conn := v.(*websocket.Conn) conn := &v.(*Conn).ws
cnt += 1 cnt += 1
w, err := conn.NextWriter(mt) w, err := conn.NextWriter(mt)
if err != nil { if err != nil {

2
ws.go
View File

@ -49,7 +49,7 @@ func (ws *WS) serveHTTP(w http.ResponseWriter, r *http.Request) error {
if err != nil { if err != nil {
return err return err
} }
pool.conns.Store(id, conn) pool.Push(id, conn) // conns.Store(id, conn)
for { for {
mt, reader, err := conn.NextReader() mt, reader, err := conn.NextReader()
if err != nil { if err != nil {