store list of all processes and toplevel processes
Stefan Schuermans

Stefan Schuermans commited on 2020-05-23 16:21:02
Showing 1 changed files, with 16 additions and 4 deletions.

... ...
@@ -54,9 +54,19 @@ class Processes(uproctrace.parse.Visitor):
54 54
         """
55 55
         super().__init__()
56 56
         self._timeline = dict()  # time -> list(parse.BaseEvent)
57
-        self._current_processes = dict()  # pid -> Process
57
+        self._all_processes = list()  # list of all processess
58
+        self._current_processes = dict()  # pid -> process
59
+        self._toplevel_processes = list()  # list of processes without parent
58 60
         self._readTrace(proto_file)
59 61
 
62
+    def _newProcess(self, pid: int):
63
+        """
64
+        Create new process, set its ID (pid), store it and return it.
65
+        """
66
+        proc = Process(pid)
67
+        self._all_processes.append(proc)
68
+        return proc
69
+
60 70
     def _readTrace(self, proto_file):
61 71
         """
62 72
         Read events from trace file (proto_file) and add them.
... ...
@@ -77,7 +87,7 @@ class Processes(uproctrace.parse.Visitor):
77 87
         """
78 88
         self._visitBaseEvent(proc_begin)
79 89
         # new process
80
-        proc = Process(proc_begin.pid)
90
+        proc = self._newProcess(proc_begin.pid)
81 91
         # add process to dict of current processes
82 92
         self._current_processes[proc_begin.pid] = proc
83 93
         # set begin event of process and process of begin event
... ...
@@ -88,17 +98,19 @@ class Processes(uproctrace.parse.Visitor):
88 98
             parent = self._current_processes[proc_begin.ppid]
89 99
             proc.setParent(parent)
90 100
             parent.addChild(proc)
101
+        else:
102
+            self._toplevel_processes.append(proc)
91 103
 
92 104
     def visitProcEnd(self, proc_end: uproctrace.parse.ProcEnd):
93 105
         """
94 106
         Process a process end event.
95 107
         """
96 108
         self._visitBaseEvent(proc_end)
97
-        # get process (or create it it is not known)
109
+        # get process (or create it if it is not known)
98 110
         if proc_end.pid in self._current_processes:
99 111
             proc = self._current_processes[proc_end.pid]
100 112
         else:
101
-            proc = Process(proc_end.pid)
113
+            proc = self._newProcess(proc_end.pid)
102 114
         # set end event of process and process of end event
103 115
         proc.setEnd(proc_end)
104 116
         proc_end.setProcess(proc)
105 117