From 199e05ae40c764b0074ca9e7774793a2ef99f3c6 Mon Sep 17 00:00:00 2001 From: Max Matveev Date: Sat, 6 Feb 2016 00:31:35 -0800 Subject: [PATCH] fixed OneWire bus concurrency --- host/rpi/onewirebus.go | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/host/rpi/onewirebus.go b/host/rpi/onewirebus.go index 48e4d0d..3b3e27a 100644 --- a/host/rpi/onewirebus.go +++ b/host/rpi/onewirebus.go @@ -15,7 +15,7 @@ import ( type w1Bus struct { l byte busMap map[string]embd.W1Device - mu sync.Mutex + Mu sync.Mutex initialized bool } @@ -23,9 +23,8 @@ type w1Bus struct { type w1Device struct { file *os.File addr string - mu sync.Mutex - initialized bool + bus w1Bus } func NewW1Bus(l byte) embd.W1Bus { @@ -68,8 +67,8 @@ func (d *w1Device) init() error { } func (d *w1Device) ReadByte() (byte, error) { - d.mu.Lock() - defer d.mu.Unlock() + d.bus.Mu.Lock() + defer d.bus.Mu.Unlock() if err := d.init(); err != nil { return 0, err @@ -86,8 +85,8 @@ func (d *w1Device) ReadByte() (byte, error) { } func (d *w1Device) WriteByte(value byte) error { - d.mu.Lock() - defer d.mu.Unlock() + d.bus.Mu.Lock() + defer d.bus.Mu.Unlock() if err := d.init(); err != nil { return err @@ -103,8 +102,8 @@ func (d *w1Device) WriteByte(value byte) error { } func (d *w1Device) WriteBytes(value []byte) error { - d.mu.Lock() - defer d.mu.Unlock() + d.bus.Mu.Lock() + defer d.bus.Mu.Unlock() if err := d.init(); err != nil { return err @@ -125,8 +124,8 @@ func (d *w1Device) WriteBytes(value []byte) error { } func (d *w1Device) ReadBytes(number int) (value []byte, err error) { - d.mu.Lock() - defer d.mu.Unlock() + d.bus.Mu.Lock() + defer d.bus.Mu.Unlock() if err := d.init(); err != nil { return nil, err @@ -157,21 +156,21 @@ func (b *w1Bus) ListDevices() (devices []string, err error) { } func (b *w1Bus) Open(address string) (device embd.W1Device, err error) { - b.mu.Lock() - defer b.mu.Unlock() + b.Mu.Lock() + defer b.Mu.Unlock() if d, ok := b.busMap[address]; ok { return d, nil } - d := &w1Device{addr: address} + d := &w1Device{addr: address, bus: b} b.busMap[address] = d return d, nil } func (b *w1Bus) Close() error { - b.mu.Lock() - defer b.mu.Unlock() + b.Mu.Lock() + defer b.Mu.Unlock() for _, b := range b.busMap { b.Close() @@ -180,13 +179,13 @@ func (b *w1Bus) Close() error { return nil } -func (b *w1Device) Close() error { - b.mu.Lock() - defer b.mu.Unlock() +func (d *w1Device) Close() error { + d.bus.Mu.Lock() + defer d.bus.Mu.Unlock() - if !b.initialized { + if !d.initialized { return nil } - return b.file.Close() + return d.file.Close() }