Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git] / lunaix-os / scripts / gdb / lunadbg / structs / thread.py
1 import gdb
2 from . import KernelStruct
3 from .pcb import ProcInfo
4 from .signal import SignalContext
5
6 class ThreadStruct(KernelStruct):
7     def __init__(self, gdb_inferior: gdb.Value) -> None:
8         super().__init__(gdb_inferior, ThreadStruct)
9
10         self.__sigctx = SignalContext(self._kstruct["sigctx"].address)
11
12     @staticmethod
13     def get_type() -> gdb.Type:
14         return gdb.lookup_type("struct thread").pointer()
15     
16     def print_abstract(self, pp, *args):
17         tid = self._kstruct['tid']
18         pid = self._kstruct['process']['pid']
19         thactive = self._kstruct['process']['th_active']
20         state = ProcInfo.get_state(self._kstruct['state'])
21
22         notes = f"(acting, {state})" if thactive == self._kstruct else f"({state})"
23         pp.print(f"Thread: tid={int(tid)}, pid={int(pid)}", notes)
24
25         self.__sigctx.print_abstract(pp.next_level())
26     
27     def print_detailed(self, pp, *args):
28         self.print_abstract(pp)
29
30         pp2 = pp.next_level()
31         self.print_simple(pp2)
32
33         pp3 = pp2.next_level()
34         pp2.print("Containing Process")
35         pp3.print(ProcInfo(self._kstruct['process']))
36
37         self.__sigctx.print_detailed(pp2)
38
39     
40     def print_simple(self, pp, *args):
41         pp2 = pp.next_level()
42         pp2.print_field(self._kstruct, 'created', '+%dms')
43         pp2.print_field(self._kstruct, 'syscall_ret')
44         pp2.print_field(self._kstruct, 'exit_val')
45         pp2.print_field(self._kstruct, 'kstack')
46         self.__sigctx.print_simple(pp2)