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.
win_fixes
Tyler Goodlet 2021-09-30 07:33:43 -04:00
parent 9df27931ab
commit 436a86ba2d
2 changed files with 17 additions and 18 deletions

View File

@ -220,7 +220,7 @@ class ShmArray:
self,
length: int = 1,
) -> np.ndarray:
return self.array[-length:]
return self.array[-length]
def push(
self,

View File

@ -936,11 +936,12 @@ class ChartPlotWidget(pg.PlotWidget):
**kwargs,
) -> 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
if graphics_name not in self._overlays:
self._arrays['ohlc'] = array
else:
@ -948,16 +949,14 @@ class ChartPlotWidget(pg.PlotWidget):
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
# ourselves you'd have updates using this method:
# 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(
x=array['index'],
y=array[data_key],