Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git] / lunaix-os / scripts / gdb / lunadbg / structs / scheduler.py
1 import gdb
2 from . import KernelStruct
3 from .pcb import ProcInfo
4 from .thread import ThreadStruct
5 from ..utils import llist_foreach
6
7 class Scheduler(KernelStruct):
8     def __init__(self, gdb_inferior:  gdb.Value) -> None:
9         super().__init__(gdb_inferior, Scheduler)
10
11         self._current_t = gdb.parse_and_eval("current_thread")
12         self._current_p = gdb.parse_and_eval("__current")
13
14     @staticmethod
15     def get_type() -> gdb.Type:
16         return gdb.lookup_type("struct scheduler").pointer()
17     
18     def __print_thread_cb(self, v, pp, long_list):
19         pi = ThreadStruct(v)
20         pi.print_abstract(pp)
21         if long_list:
22             pi.print_simple(pp.next_level())
23         pp.print()
24
25
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'] )
29         pp.print()
30
31         pp2 = pp.next_level()
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))
35         pp.print()
36     
37
38     def __print_proc_cb(self, v, pp, long_list):
39         pi = ProcInfo(v)
40         pi.print_abstract(pp)
41         if long_list:
42             pi.print_simple(pp.next_level())
43
44
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'])
48         pp.print()
49
50         pp2 = pp.next_level()
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))
54     
55
56     def print_detailed(self, pp, *args):
57         print_type = args[0]
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)
63         else:
64             pp.print("Unknown print type:", print_type)
65
66
67     def print_abstract(self, pp, *args):
68         self.print_detailed(pp, *args)
69     
70
71     def print_simple(self, pp, *args):
72         self.print_detailed(pp, *args)