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:
parent
5b489bdc8f
commit
199e05ae40
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user