@@ -161,12 +161,18 @@ namespace Monitor {
161
161
return true ;
162
162
}
163
163
164
+ // THE BUG IS SOMEWHERE IN HERE
164
165
// reparent children to background processes
165
- private void reparent (Gtk .TreeIter iter ) {
166
+ private void reparent (ref Gtk .TreeIter iter ) {
166
167
Gtk . TreeIter child_iter;
168
+ Value pid_value_prev;
169
+
167
170
while (iter_children (out child_iter, iter)) {
168
171
Value pid_value;
169
172
get_value (child_iter, Column . PID , out pid_value);
173
+ pid_value_prev = pid_value;
174
+ debug( " reparent %d " , pid_value. get_int ());
175
+
170
176
add_process_to_row (background_apps_iter, pid_value. get_int ());
171
177
}
172
178
}
@@ -176,10 +182,26 @@ namespace Monitor {
176
182
// if process rows has pid
177
183
if (process_rows. has_key (pid)) {
178
184
var row = process_rows. get (pid);
179
- var iter = row. iter;
180
- reparent (iter);
181
- // remove row from model
182
- remove (ref iter);
185
+ Gtk . TreeIter iter = row. iter;
186
+
187
+ debug (" remove process: user_data %d , stamp %d " , (int ) iter. user_data, iter. stamp);
188
+
189
+ Value pid_value;
190
+ get_value (iter, Column . PID , out pid_value);
191
+
192
+ // Column.NAME, for example returns (null)
193
+ // Column.PID return 0
194
+
195
+ debug(" removing %d " , pid_value. get_int());
196
+
197
+ // sometimes iter has null values
198
+ // this potentially should prevent segfaults
199
+ if (pid_value. get_int() != 0 ) {
200
+ reparent (ref iter);
201
+ // remove row from model
202
+ remove (ref iter);
203
+ }
204
+
183
205
// remove row from row cache
184
206
process_rows. unset (pid);
185
207
}
@@ -223,7 +245,7 @@ namespace Monitor {
223
245
// reparenting it and it's children if it already exists.
224
246
private bool add_process_to_row (Gtk .TreeIter row , int pid ) {
225
247
var process = process_manager. get_process (pid);
226
- debug (" add_process_to_row %d " , pid);
248
+ debug (" add_process_to_row pid: %d " , pid);
227
249
228
250
if (process != null ) {
229
251
// if process is already in list, then we need to reparent it and it's children
@@ -252,9 +274,9 @@ namespace Monitor {
252
274
// i.e. skip if subprocess is already in but isn't an ancestor of this process row
253
275
if (process_rows. has_key (sub_pid) && (
254
276
(old_location != null && ! is_ancestor (old_location, process_rows[sub_pid]. iter))
255
- || old_location == null ))
256
- continue ;
257
-
277
+ || old_location == null )) {
278
+ continue ;
279
+ }
258
280
add_process_to_row (iter, sub_pid);
259
281
}
260
282
0 commit comments