Skip to content

Commit 04ddae7

Browse files
committed
Close template trace resources
1 parent 063f65c commit 04ddae7

5 files changed

Lines changed: 45 additions & 20 deletions

File tree

phy/apps/_utils.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""Shared application resource helpers."""
2+
3+
4+
def _close_trace_reader(traces):
5+
"""Close a phylib trace reader, including readers without a public close method."""
6+
if traces is None:
7+
return
8+
9+
close = getattr(traces, 'close', None)
10+
if callable(close):
11+
close()
12+
return
13+
14+
arrays = list(getattr(traces, '_mmaps', ()))
15+
arr = getattr(traces, 'arr', None)
16+
if arr is not None:
17+
arrays.append(arr)
18+
for arr in arrays:
19+
mmap = getattr(arr, '_mmap', None)
20+
if mmap is not None and not mmap.closed:
21+
mmap.close()
22+
23+
reader = getattr(traces, 'reader', None)
24+
close = getattr(reader, 'close', None)
25+
if callable(close):
26+
close()

phy/apps/base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
from phy.utils.context import Context, _cache_methods
4949
from phy.utils.plugin import attach_plugins
5050

51+
from ._utils import _close_trace_reader
52+
5153
logger = logging.getLogger(__name__)
5254

5355

@@ -976,6 +978,7 @@ def close(self, close_model=True):
976978
recreate a GUI around the same model. Resource cleanup is therefore explicit.
977979
"""
978980
if close_model and not self._model_closed:
981+
_close_trace_reader(getattr(self.model, 'traces', None))
979982
close = getattr(self.model, 'close', None)
980983
if callable(close):
981984
close()

phy/apps/template/tests/test_gui.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ def test_template_describe(qtbot, tempdir):
4848
assert '314' in stdout.getvalue()
4949

5050

51+
def test_template_controller_close(tempdir):
52+
dataset = _make_dataset(tempdir, param='dense', has_spike_attributes=False)
53+
controller = _template_controller(tempdir, dataset.parent)
54+
mmaps = list(controller.model.traces._mmaps)
55+
56+
controller.close()
57+
58+
assert all(arr._mmap.closed for arr in mmaps)
59+
60+
5161
class TemplateControllerTests(GlobalViewsTests, BaseControllerTests):
5262
"""Base template controller tests."""
5363

@@ -114,9 +124,9 @@ def test_z1_close_reopen(self):
114124

115125
# Close the GUI.
116126
self.__class__._close_gui()
117-
self.__class__._controller.close(close_model=False)
127+
self.__class__._controller.close()
118128

119-
# Recreate the controller on the model.
129+
# Recreate the controller from the saved dataset.
120130
self.__class__._controller = _template_controller(
121131
self.__class__._tempdir, self.__class__._dataset.parent, clear_cache=False
122132
)

phy/apps/tests/test_base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,8 @@ class BaseControllerTests(MinimalControllerTests):
319319

320320
def test_common_01(self):
321321
"""Select one cluster."""
322+
self.supervisor.select_actions.reset_wizard()
323+
self.supervisor.block()
322324
self.next_best()
323325
self.assertEqual(len(self.selected), 1)
324326

phy/apps/trace/gui.py

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,9 @@
1414
from phy.cluster.views.trace import TraceView, select_traces
1515
from phy.gui import GUI, create_app, run_app
1616

17-
logger = logging.getLogger(__name__)
18-
19-
20-
def _close_trace_reader(traces):
21-
"""Close a phylib trace reader, including readers without a public close method."""
22-
close = getattr(traces, 'close', None)
23-
if callable(close):
24-
close()
25-
return
17+
from .._utils import _close_trace_reader
2618

27-
for arr in getattr(traces, '_mmaps', ()):
28-
mmap = getattr(arr, '_mmap', None)
29-
if mmap is not None and not mmap.closed:
30-
mmap.close()
31-
32-
reader = getattr(traces, 'reader', None)
33-
close = getattr(reader, 'close', None)
34-
if callable(close):
35-
close()
19+
logger = logging.getLogger(__name__)
3620

3721

3822
# ------------------------------------------------------------------------------

0 commit comments

Comments
 (0)