diff --git a/artiq/browser/files.py b/artiq/browser/files.py index e03f26483..339c12d34 100644 --- a/artiq/browser/files.py +++ b/artiq/browser/files.py @@ -188,17 +188,27 @@ class FilesDock(QtWidgets.QDockWidget): except: logger.warning("unable to read metadata from %s", info.filePath(), exc_info=True) - rd = dict() + + rd = {} if "archive" in f: - rd = {k: (True, v[()]) for k, v in f["archive"].items()} + def visitor(k, v): + if isinstance(v, h5py.Dataset): + rd[k] = (True, v[()]) + + f["archive"].visititems(visitor) + if "datasets" in f: - for k, v in f["datasets"].items(): - if k in rd: - logger.warning("dataset '%s' is both in archive and " - "outputs", k) - rd[k] = (True, v[()]) - if rd: - self.datasets.init(rd) + def visitor(k, v): + if isinstance(v, h5py.Dataset): + if k in rd: + logger.warning("dataset '%s' is both in archive " + "and outputs", k) + rd[k] = (True, v[()]) + + f["datasets"].visititems(visitor) + + self.datasets.init(rd) + self.dataset_changed.emit(info.filePath()) def list_activated(self, idx): diff --git a/artiq/coredevice/comm.py b/artiq/coredevice/comm.py deleted file mode 100644 index fb70a59b5..000000000 --- a/artiq/coredevice/comm.py +++ /dev/null @@ -1,28 +0,0 @@ -import sys -import socket -import logging - -logger = logging.getLogger(__name__) - - -def set_keepalive(sock, after_idle, interval, max_fails): - if sys.platform.startswith("linux"): - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, after_idle) - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval) - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, max_fails) - elif sys.platform.startswith("win") or sys.platform.startswith("cygwin"): - # setting max_fails is not supported, typically ends up being 5 or 10 - # depending on Windows version - sock.ioctl(socket.SIO_KEEPALIVE_VALS, - (1, after_idle * 1000, interval * 1000)) - else: - logger.warning("TCP keepalive not supported on platform '%s', ignored", - sys.platform) - - -def initialize_connection(host, port): - sock = socket.create_connection((host, port)) - set_keepalive(sock, 10, 10, 3) - logger.debug("connected to %s:%d", host, port) - return sock diff --git a/artiq/coredevice/comm_kernel.py b/artiq/coredevice/comm_kernel.py index 34151288f..c89b874f1 100644 --- a/artiq/coredevice/comm_kernel.py +++ b/artiq/coredevice/comm_kernel.py @@ -11,10 +11,10 @@ from fractions import Fraction from collections import namedtuple from artiq.coredevice import exceptions -from artiq.coredevice.comm import initialize_connection from artiq import __version__ as software_version from artiq import __artiq_dir__ as artiq_dir +from sipyco.keepalive import create_connection logger = logging.getLogger(__name__) @@ -302,7 +302,7 @@ class CommKernel: def open(self): if hasattr(self, "socket"): return - self.socket = initialize_connection(self.host, self.port) + self.socket = create_connection(self.host, self.port) self.socket.sendall(b"ARTIQ coredev\n") endian = self._read(1) if endian == b"e": diff --git a/artiq/coredevice/comm_mgmt.py b/artiq/coredevice/comm_mgmt.py index 793b44a75..539643751 100644 --- a/artiq/coredevice/comm_mgmt.py +++ b/artiq/coredevice/comm_mgmt.py @@ -2,8 +2,7 @@ from enum import Enum import logging import struct -from artiq.coredevice.comm import initialize_connection - +from sipyco.keepalive import create_connection logger = logging.getLogger(__name__) @@ -54,7 +53,7 @@ class CommMgmt: def open(self): if hasattr(self, "socket"): return - self.socket = initialize_connection(self.host, self.port) + self.socket = create_connection(self.host, self.port) self.socket.sendall(b"ARTIQ management\n") endian = self._read(1) if endian == b"e": diff --git a/artiq/coredevice/comm_moninj.py b/artiq/coredevice/comm_moninj.py index a6b95983e..b5c2ee40d 100644 --- a/artiq/coredevice/comm_moninj.py +++ b/artiq/coredevice/comm_moninj.py @@ -2,7 +2,8 @@ import asyncio import logging import struct from enum import Enum -from .comm import set_keepalive + +from sipyco.keepalive import async_open_connection __all__ = ["TTLProbe", "TTLOverride", "CommMonInj"] @@ -28,8 +29,13 @@ class CommMonInj: self.disconnect_cb = disconnect_cb async def connect(self, host, port=1383): - self._reader, self._writer = await asyncio.open_connection(host, port) - set_keepalive(self._writer.transport.get_extra_info('socket'), 1, 1, 3) + self._reader, self._writer = await async_open_connection( + host, + port, + after_idle=1, + interval=1, + max_fails=3, + ) try: self._writer.write(b"ARTIQ moninj\n")