2 from . import KernelStruct
3 from .pcb import ProcInfo
4 from .thread import ThreadStruct
5 from ..utils import llist_foreach
7 class Scheduler(KernelStruct):
8 def __init__(self, gdb_inferior: gdb.Value) -> None:
9 super().__init__(gdb_inferior, Scheduler)
11 self._current_t = gdb.parse_and_eval("current_thread")
12 self._current_p = gdb.parse_and_eval("__current")
15 def get_type() -> gdb.Type:
16 return gdb.lookup_type("struct scheduler").pointer()
18 def __print_thread_cb(self, v, pp, long_list):
22 pi.print_simple(pp.next_level())
26 def __print_threads(self, pp, long_list):
27 pp.print("# of threads:", self._kstruct["ttable_len"])
28 pp.printf("scheduled: pid=%d, tid=%d", self._current_p['pid'], self._current_t['tid'] )
32 plist = self._kstruct["threads"]
33 llist_foreach(plist, ThreadStruct.get_type(), "sched_sibs",
34 lambda i,v: self.__print_thread_cb(v, pp2, long_list))
38 def __print_proc_cb(self, v, pp, long_list):
42 pi.print_simple(pp.next_level())
45 def __print_processes(self, pp, long_list = False):
46 pp.print("# of process:", self._kstruct["ptable_len"])
47 pp.printf("scheduled: pid=%d", self._current_p['pid'])
51 plist = self._kstruct["proc_list"]
52 llist_foreach(plist, ProcInfo.get_type(), "tasks",
53 lambda i,v: self.__print_proc_cb(v, pp2, long_list))
56 def print_detailed(self, pp, *args):
58 print_longlist = args[1]
59 if print_type == 'procs':
60 self.__print_processes(pp, print_longlist)
61 elif print_type == 'threads':
62 self.__print_threads(pp, print_longlist)
64 pp.print("Unknown print type:", print_type)
67 def print_abstract(self, pp, *args):
68 self.print_detailed(pp, *args)
71 def print_simple(self, pp, *args):
72 self.print_detailed(pp, *args)