| # Copyright 2026 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| from dataclasses import dataclass, field | |
| @dataclass | |
| class Thread: | |
| """Represents a thread in a target process.""" | |
| id: int | |
| name: str = field(default="", compare=False) | |
| is_stopped: bool = field(default=False, compare=False) | |
| process: Process | None = field(default=None, repr=False, compare=False) | |
| def resume(self) -> None: | |
| """Marks this thread as not stopped.""" | |
| self.is_stopped = False | |
| @dataclass | |
| class Process: | |
| """Represents a debugged target process.""" | |
| id: int | |
| name: str = field(default="", compare=False) | |
| target_id: int = field(default=1, compare=False) | |
| threads: dict[int, Thread] = field( | |
| default_factory=dict, repr=False, compare=False | |
| ) | |
| def resume(self) -> None: | |
| """Marks all threads in the process as resumed.""" | |
| for t in self.threads.values(): | |
| t.resume() | |
| @property | |
| def all_threads_stopped(self) -> bool: | |
| return bool(self.threads) and all( | |
| t.is_stopped for t in self.threads.values() | |
| ) |