X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/92f6e64a6da763c45ff9f4ab5eafcab3d8766dcb..b60166b327a9108b07e3069fa6568a451529ffd9:/lunaix-os/scripts/gdb/lunadbg/structs/scheduler.py diff --git a/lunaix-os/scripts/gdb/lunadbg/structs/scheduler.py b/lunaix-os/scripts/gdb/lunadbg/structs/scheduler.py new file mode 100644 index 0000000..3d4ccfb --- /dev/null +++ b/lunaix-os/scripts/gdb/lunadbg/structs/scheduler.py @@ -0,0 +1,72 @@ +import gdb +from . import KernelStruct +from .pcb import ProcInfo +from .thread import ThreadStruct +from ..utils import llist_foreach + +class Scheduler(KernelStruct): + def __init__(self, gdb_inferior: gdb.Value) -> None: + super().__init__(gdb_inferior, Scheduler) + + self._current_t = gdb.parse_and_eval("current_thread") + self._current_p = gdb.parse_and_eval("__current") + + @staticmethod + def get_type() -> gdb.Type: + return gdb.lookup_type("struct scheduler").pointer() + + def __print_thread_cb(self, v, pp, long_list): + pi = ThreadStruct(v) + pi.print_abstract(pp) + if long_list: + pi.print_simple(pp.next_level()) + pp.print() + + + def __print_threads(self, pp, long_list): + pp.print("# of threads:", self._kstruct["ttable_len"]) + pp.printf("scheduled: pid=%d, tid=%d", self._current_p['pid'], self._current_t['tid'] ) + pp.print() + + pp2 = pp.next_level() + plist = self._kstruct["threads"] + llist_foreach(plist, ThreadStruct.get_type(), "sched_sibs", + lambda i,v: self.__print_thread_cb(v, pp2, long_list)) + pp.print() + + + def __print_proc_cb(self, v, pp, long_list): + pi = ProcInfo(v) + pi.print_abstract(pp) + if long_list: + pi.print_simple(pp.next_level()) + + + def __print_processes(self, pp, long_list = False): + pp.print("# of process:", self._kstruct["ptable_len"]) + pp.printf("scheduled: pid=%d", self._current_p['pid']) + pp.print() + + pp2 = pp.next_level() + plist = self._kstruct["proc_list"] + llist_foreach(plist, ProcInfo.get_type(), "tasks", + lambda i,v: self.__print_proc_cb(v, pp2, long_list)) + + + def print_detailed(self, pp, *args): + print_type = args[0] + print_longlist = args[1] + if print_type == 'procs': + self.__print_processes(pp, print_longlist) + elif print_type == 'threads': + self.__print_threads(pp, print_longlist) + else: + pp.print("Unknown print type:", print_type) + + + def print_abstract(self, pp, *args): + self.print_detailed(pp, *args) + + + def print_simple(self, pp, *args): + self.print_detailed(pp, *args) \ No newline at end of file