GDB Bridge class, exposing the common expected interface for the OpenImageDebugger to access the required buffer data and interact with the debugger.
| 14 | from oidscripts.logger import log |
| 15 | |
| 16 | class GdbBridge(BridgeInterface): |
| 17 | """ |
| 18 | GDB Bridge class, exposing the common expected interface for the OpenImageDebugger |
| 19 | to access the required buffer data and interact with the debugger. |
| 20 | """ |
| 21 | def __init__(self, type_bridge): |
| 22 | self._type_bridge = type_bridge |
| 23 | self._commands = dict(plot=PlotterCommand(self)) |
| 24 | self._event_handler = None # type: BridgeEventHandlerInterface |
| 25 | |
| 26 | self._pending_requests = [] |
| 27 | self._lock = threading.Lock() |
| 28 | |
| 29 | gdb.events.stop.connect(self._event_stop_handler) |
| 30 | gdb.events.exited.connect(self._event_exit_handler) |
| 31 | |
| 32 | event_loop_thread = threading.Thread(target=self.event_loop) |
| 33 | event_loop_thread.daemon = True |
| 34 | event_loop_thread.start() |
| 35 | |
| 36 | def event_loop(self): |
| 37 | while True: |
| 38 | requests_to_process = [] |
| 39 | with self._lock: |
| 40 | requests_to_process = self._pending_requests |
| 41 | self._pending_requests = [] |
| 42 | |
| 43 | while requests_to_process: |
| 44 | callback = requests_to_process.pop(0) |
| 45 | gdb.post_event(callback) |
| 46 | |
| 47 | time.sleep(0.1) |
| 48 | |
| 49 | def queue_request(self, callable_request): |
| 50 | with self._lock: |
| 51 | self._pending_requests.append(callable_request) |
| 52 | |
| 53 | def get_backend_name(self): |
| 54 | return 'gdb' |
| 55 | |
| 56 | def get_buffer_metadata(self, variable): |
| 57 | picked_obj = gdb.parse_and_eval(variable) |
| 58 | |
| 59 | buffer_metadata = self._type_bridge.get_buffer_metadata( |
| 60 | variable, picked_obj, self) |
| 61 | |
| 62 | if buffer_metadata is None: |
| 63 | # Invalid symbol for current frame |
| 64 | return None |
| 65 | |
| 66 | bufsize = sysinfo.get_buffer_size( |
| 67 | buffer_metadata['height'], |
| 68 | buffer_metadata['channels'], |
| 69 | buffer_metadata['type'], |
| 70 | buffer_metadata['row_stride'] |
| 71 | ) |
| 72 | |
| 73 | # Check if buffer is initialized |
nothing calls this directly
no outgoing calls
no test coverage detected