--- /dev/null
+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