Stefan Schuermans commited on 2020-05-23 15:50:39
Showing 2 changed files, with 49 additions and 11 deletions.
| ... | ... |
@@ -68,7 +68,40 @@ class BaseEvent(): |
| 68 | 68 |
return self._timestamp |
| 69 | 69 |
|
| 70 | 70 |
|
| 71 |
-class ProcBegin(BaseEvent): |
|
| 71 |
+class ProcBeginOrEnd(BaseEvent): |
|
| 72 |
+ """ |
|
| 73 |
+ Process begin or end event. |
|
| 74 |
+ """ |
|
| 75 |
+ def __init__(self, pb2_ev: pb2.event): |
|
| 76 |
+ """ |
|
| 77 |
+ Initialize process begin or end event from PB2 event. |
|
| 78 |
+ """ |
|
| 79 |
+ super().__init__(pb2_ev) |
|
| 80 |
+ self._process = None |
|
| 81 |
+ self._pid = None |
|
| 82 |
+ |
|
| 83 |
+ @property |
|
| 84 |
+ def pid(self) -> int: |
|
| 85 |
+ """ |
|
| 86 |
+ ID of process. |
|
| 87 |
+ """ |
|
| 88 |
+ return self._pid |
|
| 89 |
+ |
|
| 90 |
+ @property |
|
| 91 |
+ def process(self): |
|
| 92 |
+ """ |
|
| 93 |
+ Process object. |
|
| 94 |
+ """ |
|
| 95 |
+ return self._process |
|
| 96 |
+ |
|
| 97 |
+ def setProcess(self, process): |
|
| 98 |
+ """ |
|
| 99 |
+ Set process object. |
|
| 100 |
+ """ |
|
| 101 |
+ self._process = process |
|
| 102 |
+ |
|
| 103 |
+ |
|
| 104 |
+class ProcBegin(ProcBeginOrEnd): |
|
| 72 | 105 |
""" |
| 73 | 106 |
Process begin event. |
| 74 | 107 |
""" |
| ... | ... |
@@ -87,13 +120,6 @@ class ProcBegin(BaseEvent): |
| 87 | 120 |
self._environ = self._pb2GetStringList( |
| 88 | 121 |
p_b.environ) if p_b.hasField('environ') else None
|
| 89 | 122 |
|
| 90 |
- @property |
|
| 91 |
- def pid(self) -> int: |
|
| 92 |
- """ |
|
| 93 |
- ID of process. |
|
| 94 |
- """ |
|
| 95 |
- return self._pid |
|
| 96 |
- |
|
| 97 | 123 |
@property |
| 98 | 124 |
def ppid(self) -> int: |
| 99 | 125 |
""" |
| ... | ... |
@@ -130,7 +156,7 @@ class ProcBegin(BaseEvent): |
| 130 | 156 |
return self._environ.copy() |
| 131 | 157 |
|
| 132 | 158 |
|
| 133 |
-class ProcEnd(BaseEvent): |
|
| 159 |
+class ProcEnd(ProcBeginOrEnd): |
|
| 134 | 160 |
""" |
| 135 | 161 |
Process end event. |
| 136 | 162 |
""" |
| ... | ... |
@@ -55,6 +53,7 @@ class Processes(uproctrace.parse.Visitor): |
| 55 | 53 |
Initialize processes from a trace file (f). |
| 56 | 54 |
""" |
| 57 | 55 |
super().__init__() |
| 56 |
+ self._timeline = dict() # time -> list(parse.BaseEvent) |
|
| 58 | 57 |
self._current_processes = dict() # pid -> Process |
| 59 | 58 |
self._readTrace(proto_file) |
| 60 | 59 |
|
| ... | ... |
@@ -65,16 +64,25 @@ class Processes(uproctrace.parse.Visitor): |
| 65 | 64 |
while uproctrace.parse.parse_event(proto_file, self): |
| 66 | 65 |
pass |
| 67 | 66 |
|
| 67 |
+ def _visitBaseEvent(self, event: uproctrace.parse.BaseEvent): |
|
| 68 |
+ """ |
|
| 69 |
+ Common processing for all events. |
|
| 70 |
+ """ |
|
| 71 |
+ # store event in timeline |
|
| 72 |
+ self._timeline.setdefault(event.time, list()).append(event) |
|
| 73 |
+ |
|
| 68 | 74 |
def visitProcBegin(self, proc_begin: uproctrace.parse.ProcBegin): |
| 69 | 75 |
""" |
| 70 | 76 |
Process a process begin event. |
| 71 | 77 |
""" |
| 78 |
+ self._visitBaseEvent(proc_begin) |
|
| 72 | 79 |
# new process |
| 73 | 80 |
proc = Process(proc_begin.pid) |
| 74 | 81 |
# add process to dict of current processes |
| 75 | 82 |
self._current_processes[proc_begin.pid] = proc |
| 76 |
- # set begin event of process |
|
| 83 |
+ # set begin event of process and process of begin event |
|
| 77 | 84 |
proc.setBegin(proc_begin) |
| 85 |
+ proc_begin.setProcess(proc) |
|
| 78 | 86 |
# connect to parent |
| 79 | 87 |
if proc_begin.ppid in self._current_processes: |
| 80 | 88 |
parent = self._current_processes[proc_begin.ppid] |
| ... | ... |
@@ -85,12 +93,14 @@ class Processes(uproctrace.parse.Visitor): |
| 85 | 93 |
""" |
| 86 | 94 |
Process a process end event. |
| 87 | 95 |
""" |
| 96 |
+ self._visitBaseEvent(proc_end) |
|
| 88 | 97 |
# get process (or create it it is not known) |
| 89 | 98 |
if proc_end.pid in self._current_processes: |
| 90 | 99 |
proc = self._current_processes[proc_end.pid] |
| 91 | 100 |
else: |
| 92 | 101 |
proc = Process(proc_end.pid) |
| 93 |
- # set end event of process |
|
| 102 |
+ # set end event of process and process of end event |
|
| 94 | 103 |
proc.setEnd(proc_end) |
| 104 |
+ proc_end.setProcess(proc) |
|
| 95 | 105 |
# remove process from dict of current processes (it ended) |
| 96 | 106 |
self._current_processes[proc_end.pid] = None |
| 97 | 107 |