Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git] / lunaix-os / scripts / gdb / lunadbg / structs / pcb.py
1 import gdb
2 from ..pp import MyPrettyPrinter
3 from . import KernelStruct
4 from ..utils import pid_argument, llist_foreach, get_dnode_path
5
6
7 class ProcInfo(KernelStruct):
8     def __init__(self, gdb_inferior: gdb.Value) -> None:
9         super().__init__(gdb_inferior, ProcInfo)
10     
11     @staticmethod
12     def get_type() -> gdb.Type:
13         return gdb.lookup_type("struct proc_info").pointer()
14     
15     def print_detailed(self, pp : MyPrettyPrinter, *args):
16         self.print_abstract(pp)
17         
18         pp2 = (pp.next_level()
19                  .clear_prefix())
20         self.print_simple(pp2)
21
22     def print_simple(self, pp : MyPrettyPrinter, *args):
23         pp.print_field(self._kstruct, 'pid')
24         pp.print_field(self._kstruct, 'pgid')
25         pp.print_field(self._kstruct, 'parent', fmt="(pid=%d)", cast=lambda v: v["pid"])
26         pp.print_field(self._kstruct, 'cwd', cast=lambda v: get_dnode_path(v))
27         pp.print_field(self._kstruct, 'created', '+%dms')
28         pp.print_field(self._kstruct, 'exit_code')
29         pp.print_field(self._kstruct, 'thread_count')
30         
31         pp.printf("active thread: (tid=%d)", self._kstruct['th_active']['tid'])
32
33     def print_abstract(self, pp : MyPrettyPrinter, *args):
34         pid = self._kstruct['pid']
35         ppid = self._kstruct['parent']['pid']
36         cmd = self._kstruct['cmd']
37         cmd = cmd.string() if cmd != 0 else ''
38         state = ProcInfo.get_state(self._kstruct["state"])
39         
40         pp.print(f"pid={pid}, ppid={ppid}, cmd='{cmd}', {state}")
41
42
43     PS_READY   = 0
44     PS_RUNNING = 1
45     PS_TERMNAT = 2
46     PS_DESTROY = 4
47     PS_PAUSED  = 8
48     PS_BLOCKED = 16
49     PS_CREATED = 32
50
51     @staticmethod
52     def get_state(state_t):
53         if (state_t == ProcInfo.PS_READY):
54             return "ready"
55         if (state_t == ProcInfo.PS_RUNNING):
56             return "running"
57         if (state_t & (ProcInfo.PS_TERMNAT | ProcInfo.PS_DESTROY)):
58             return "terminated"
59         if (state_t & ProcInfo.PS_BLOCKED):
60             return "blocked"
61         if (state_t & ProcInfo.PS_PAUSED):
62             return "paused"
63         return "<unknown> (0x%x)"%(state_t)
64     
65     @staticmethod
66     def process_at(pid):
67         return ProcInfo(gdb.parse_and_eval(pid_argument(pid)))
68     
69