Fix shm index update race
There was a lingering issue where the fsp daemon would sync its shm array with the source data and we'd set the start/end indices to the same value. Under some races a reader would then read an empty `.array` which it wasn't expecting. This fixes that as well as tidies up the `ShmArray.push()` logic and adds a temporary check in `.array` for zero length if the array hasn't been written yet. We can now start removing read array length checks in consumer code and hopefully no more races will show up.windows_testing_volume
parent
4783dd7efa
commit
7d8202a63c
|
@ -220,7 +220,7 @@ class ShmArray:
|
||||||
self,
|
self,
|
||||||
length: int = 1,
|
length: int = 1,
|
||||||
) -> np.ndarray:
|
) -> np.ndarray:
|
||||||
return self.array[-length:]
|
return self.array[-length]
|
||||||
|
|
||||||
def push(
|
def push(
|
||||||
self,
|
self,
|
||||||
|
|
|
@ -936,11 +936,12 @@ class ChartPlotWidget(pg.PlotWidget):
|
||||||
**kwargs,
|
**kwargs,
|
||||||
|
|
||||||
) -> pg.GraphicsObject:
|
) -> pg.GraphicsObject:
|
||||||
"""Update the named internal graphics from ``array``.
|
'''Update the named internal graphics from ``array``.
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
assert len(array)
|
||||||
data_key = array_key or graphics_name
|
data_key = array_key or graphics_name
|
||||||
|
|
||||||
if graphics_name not in self._overlays:
|
if graphics_name not in self._overlays:
|
||||||
self._arrays['ohlc'] = array
|
self._arrays['ohlc'] = array
|
||||||
else:
|
else:
|
||||||
|
@ -948,16 +949,14 @@ class ChartPlotWidget(pg.PlotWidget):
|
||||||
|
|
||||||
curve = self._graphics[graphics_name]
|
curve = self._graphics[graphics_name]
|
||||||
|
|
||||||
if len(array):
|
|
||||||
# TODO: we should instead implement a diff based
|
|
||||||
# "only update with new items" on the pg.PlotCurveItem
|
|
||||||
# one place to dig around this might be the `QBackingStore`
|
|
||||||
# https://doc.qt.io/qt-5/qbackingstore.html
|
|
||||||
|
|
||||||
# NOTE: back when we weren't implementing the curve graphics
|
# NOTE: back when we weren't implementing the curve graphics
|
||||||
# ourselves you'd have updates using this method:
|
# ourselves you'd have updates using this method:
|
||||||
# curve.setData(y=array[graphics_name], x=array['index'], **kwargs)
|
# curve.setData(y=array[graphics_name], x=array['index'], **kwargs)
|
||||||
|
|
||||||
|
# NOTE: graphics **must** implement a diff based update
|
||||||
|
# operation where an internal ``FastUpdateCurve._xrange`` is
|
||||||
|
# used to determine if the underlying path needs to be
|
||||||
|
# pre/ap-pended.
|
||||||
curve.update_from_array(
|
curve.update_from_array(
|
||||||
x=array['index'],
|
x=array['index'],
|
||||||
y=array[data_key],
|
y=array[data_key],
|
||||||
|
|
Loading…
Reference in New Issue