1
0
mirror of https://github.com/kidoman/embd synced 2024-06-06 19:17:49 +02:00

fixed OneWire bus concurrency

This commit is contained in:
Max Matveev 2016-02-06 00:31:35 -08:00
parent 5b489bdc8f
commit 199e05ae40

View File

@ -15,7 +15,7 @@ import (
type w1Bus struct { type w1Bus struct {
l byte l byte
busMap map[string]embd.W1Device busMap map[string]embd.W1Device
mu sync.Mutex Mu sync.Mutex
initialized bool initialized bool
} }
@ -23,9 +23,8 @@ type w1Bus struct {
type w1Device struct { type w1Device struct {
file *os.File file *os.File
addr string addr string
mu sync.Mutex
initialized bool initialized bool
bus w1Bus
} }
func NewW1Bus(l byte) embd.W1Bus { func NewW1Bus(l byte) embd.W1Bus {
@ -68,8 +67,8 @@ func (d *w1Device) init() error {
} }
func (d *w1Device) ReadByte() (byte, error) { func (d *w1Device) ReadByte() (byte, error) {
d.mu.Lock() d.bus.Mu.Lock()
defer d.mu.Unlock() defer d.bus.Mu.Unlock()
if err := d.init(); err != nil { if err := d.init(); err != nil {
return 0, err return 0, err
@ -86,8 +85,8 @@ func (d *w1Device) ReadByte() (byte, error) {
} }
func (d *w1Device) WriteByte(value byte) error { func (d *w1Device) WriteByte(value byte) error {
d.mu.Lock() d.bus.Mu.Lock()
defer d.mu.Unlock() defer d.bus.Mu.Unlock()
if err := d.init(); err != nil { if err := d.init(); err != nil {
return err return err
@ -103,8 +102,8 @@ func (d *w1Device) WriteByte(value byte) error {
} }
func (d *w1Device) WriteBytes(value []byte) error { func (d *w1Device) WriteBytes(value []byte) error {
d.mu.Lock() d.bus.Mu.Lock()
defer d.mu.Unlock() defer d.bus.Mu.Unlock()
if err := d.init(); err != nil { if err := d.init(); err != nil {
return err return err
@ -125,8 +124,8 @@ func (d *w1Device) WriteBytes(value []byte) error {
} }
func (d *w1Device) ReadBytes(number int) (value []byte, err error) { func (d *w1Device) ReadBytes(number int) (value []byte, err error) {
d.mu.Lock() d.bus.Mu.Lock()
defer d.mu.Unlock() defer d.bus.Mu.Unlock()
if err := d.init(); err != nil { if err := d.init(); err != nil {
return nil, err 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) { func (b *w1Bus) Open(address string) (device embd.W1Device, err error) {
b.mu.Lock() b.Mu.Lock()
defer b.mu.Unlock() defer b.Mu.Unlock()
if d, ok := b.busMap[address]; ok { if d, ok := b.busMap[address]; ok {
return d, nil return d, nil
} }
d := &w1Device{addr: address} d := &w1Device{addr: address, bus: b}
b.busMap[address] = d b.busMap[address] = d
return d, nil return d, nil
} }
func (b *w1Bus) Close() error { func (b *w1Bus) Close() error {
b.mu.Lock() b.Mu.Lock()
defer b.mu.Unlock() defer b.Mu.Unlock()
for _, b := range b.busMap { for _, b := range b.busMap {
b.Close() b.Close()
@ -180,13 +179,13 @@ func (b *w1Bus) Close() error {
return nil return nil
} }
func (b *w1Device) Close() error { func (d *w1Device) Close() error {
b.mu.Lock() d.bus.Mu.Lock()
defer b.mu.Unlock() defer d.bus.Mu.Unlock()
if !b.initialized { if !d.initialized {
return nil return nil
} }
return b.file.Close() return d.file.Close()
} }