forked from M-Labs/artiq
host: support runtime device exceptions
This commit is contained in:
parent
f4d6bfc094
commit
4f26b6281d
|
@ -6,7 +6,9 @@ from enum import Enum
|
|||
import logging
|
||||
|
||||
from artiq.language import units
|
||||
from artiq.language import core as core_language
|
||||
from artiq.devices.runtime import Environment
|
||||
from artiq.devices import runtime_exceptions
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -142,7 +144,7 @@ class CoreCom:
|
|||
_write_exactly(self.port, struct.pack("B", ord(c)))
|
||||
logger.debug("running kernel: {}".format(kname))
|
||||
|
||||
def serve(self, rpc_map, exception_map):
|
||||
def serve(self, rpc_map, user_exception_map):
|
||||
while True:
|
||||
msg = self._get_device_msg()
|
||||
if msg == _D2HMsgType.RPC_REQUEST:
|
||||
|
@ -160,9 +162,12 @@ class CoreCom:
|
|||
logger.debug("rpc service: {} ({}) == {}".format(
|
||||
rpc_num, args, r))
|
||||
elif msg == _D2HMsgType.KERNEL_EXCEPTION:
|
||||
(exception_num, ) = struct.unpack(">l",
|
||||
_read_exactly(self.port, 4))
|
||||
raise exception_map[exception_num]
|
||||
(eid, ) = struct.unpack(">l", _read_exactly(self.port, 4))
|
||||
if eid < core_language.first_user_eid:
|
||||
exception = runtime_exceptions.exception_map[eid]
|
||||
else:
|
||||
exception = user_exception_map[eid]
|
||||
raise exception
|
||||
elif msg == _D2HMsgType.KERNEL_FINISHED:
|
||||
return
|
||||
else:
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
class RuntimeException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class OutOfMemory(RuntimeException):
|
||||
eid = 0
|
||||
|
||||
|
||||
class RTIOUnderflow(RuntimeException):
|
||||
eid = 1
|
||||
|
||||
|
||||
exception_map = {e.eid: e for e in globals().values()
|
||||
if isinstance(e, RuntimeException.__class__)
|
||||
and hasattr(e, "eid")}
|
|
@ -330,6 +330,8 @@ def syscall(*args):
|
|||
|
||||
_encoded_exceptions = dict()
|
||||
|
||||
first_user_eid = 1024
|
||||
|
||||
|
||||
def EncodedException(eid):
|
||||
"""Represents exceptions on the core device, which are identified
|
||||
|
|
|
@ -41,8 +41,7 @@ class _ReferenceManager:
|
|||
# inlined_name -> use_count
|
||||
self.use_count = dict()
|
||||
self.rpc_mapper = _HostObjectMapper()
|
||||
# exceptions 0-1023 are for runtime
|
||||
self.exception_mapper = _HostObjectMapper(1024)
|
||||
self.exception_mapper = _HostObjectMapper(core_language.first_user_eid)
|
||||
self.kernel_attr_init = []
|
||||
|
||||
# reserved names
|
||||
|
|
Loading…
Reference in New Issue