From: Melissa LeBlanc-Williams Date: Mon, 25 Nov 2019 22:42:33 +0000 (-0800) Subject: Merge pull request #170 from hamishmb/fix-thread-safety X-Git-Tag: 3.0.2 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/5d1689e9657a53c655171b8373de0f145eeba0a3?hp=-c Merge pull request #170 from hamishmb/fix-thread-safety Add a lock for thread safety when the I2C class is used in a with statement --- 5d1689e9657a53c655171b8373de0f145eeba0a3 diff --combined src/busio.py index ddf290d,73c88ef..f71871b --- a/src/busio.py +++ b/src/busio.py @@@ -7,6 -7,8 +7,8 @@@ See `CircuitPython:busio` in CircuitPyt * Author(s): cefn """ + import threading + from adafruit_blinka import Enum, Lockable, agnostic from adafruit_blinka.agnostic import board_id, detector import adafruit_platformdetect.board as ap_board @@@ -31,10 -33,12 +33,12 @@@ class I2C(Lockable) self._i2c = _I2C(portId, mode=_I2C.MASTER, baudrate=frequency) break else: - raise NotImplementedError( + raise ValueError( "No Hardware I2C on (scl,sda)={}\nValid I2C ports: {}".format((scl, sda), i2cPorts) ) + self._lock = threading.RLock() + def deinit(self): try: del self._i2c @@@ -42,9 -46,11 +46,11 @@@ pass def __enter__(self): + self._lock.acquire() return self def __exit__(self, exc_type, exc_value, traceback): + self._lock.release() self.deinit() def scan(self): @@@ -95,7 -101,7 +101,7 @@@ class SPI(Lockable) self._pins = (portSck, portMosi, portMiso) break else: - raise NotImplementedError( + raise ValueError( "No Hardware SPI on (SCLK, MOSI, MISO)={}\nValid SPI ports:{}". format((clock, MOSI, MISO), spiPorts)) @@@ -230,7 -236,7 +236,7 @@@ class UART(Lockable) ) break else: - raise NotImplementedError( + raise ValueError( "No Hardware UART on (tx,rx)={}\nValid UART ports: {}".format((tx, rx), uartPorts) )