""".format(css_class, pid, process['uid'], process['tgid'], process['total_vm_pages'], process['rss_pages'],
process['nr_ptes_pages'], process['swapents_pages'], process['oom_score_adj'], process['name'],
- comment)
+ process['notes'])
new_table += line
table_content.innerHTML = new_table
+ self.set_sort_triangle()
+
+ def set_sort_triangle(self):
+ """Set the sorting symbols for all columns in the process table"""
+ for column_name in ['pid', 'uid', 'tgid', 'total_vm_pages', 'rss_pages', 'nr_ptes_pages', 'swapents_pages',
+ 'oom_score_adj', 'name', 'notes']:
+
+ element_id = "pstable_sort_{}".format(column_name)
+ element = document.getElementById(element_id)
+ if not element:
+ internal_error('Missing id "{}" in process table.'.format(element_id))
+ continue
+
+ if column_name == self.sorted_column:
+ if self.sort_order == 'descending':
+ element.innerHTML=self.svg_array_down
+ else:
+ element.innerHTML=self.svg_array_up
+ else:
+ element.innerHTML=self.svg_array_updown
+
def set_HTML_defaults(self, clean_oom=True):
"""Reset the HTML document but don't clean elements"""
if clean_oom:
@@ -1014,6 +1082,11 @@ Killed process 6576 (java) total-vm:33914892kB, anon-rss:20629004kB, file-rss:0k
while element.firstChild:
element.removeChild(element.firstChild)
+ # reset sort triangles
+ self.sorted_column = None
+ self.sort_order = None
+ self.set_sort_triangle()
+
# remove svg charts
for element_id in ('svg_swap', 'svg_ram'):
element = document.getElementById(element_id)
@@ -1231,5 +1304,66 @@ Killed process 6576 (java) total-vm:33914892kB, anon-rss:20629004kB, file-rss:0k
element.textContent = self.oom.text
self.toggle_oom(show=False)
+ def sort_pstable(self, column_name):
+ """Sort process table by the values in the given column"""
+ if column_name not in ['pid', 'uid', 'tgid', 'total_vm_pages', 'rss_pages', 'nr_ptes_pages', 'swapents_pages',
+ 'oom_score_adj', 'name', 'notes']:
+ internal_error('Can not sort process table with an unknown column name "{}"'.format(column_name))
+ return
+
+ # reset sort order if the column has changes
+ if column_name != self.sorted_column:
+ self.sort_order = None
+ self.sorted_column = column_name
+
+ if not self.sort_order or self.sort_order == 'descending':
+ self.sort_order = 'ascending'
+ self.sort_psindex_by_column(column_name)
+ else:
+ self.sort_order = 'descending'
+ self.sort_psindex_by_column(column_name, True)
+
+ self.sorted_column = column_name
+
+ self.update_process_table()
+
+ def sort_psindex_by_column(self, column_name, reverse=False):
+ """
+ Sort the pid list '_ps_index' based on the values in the process dict '_ps'.
+
+ Is uses bubble sort with all disadvantages but just a few lines of code
+ """
+
+ ps = self.oom_details['_ps']
+ ps_index = self.oom_details['_ps_index']
+
+ def getvalue(column_name, i):
+ if column_name == 'pid':
+ value = ps_index[i]
+ else:
+ value = ps[ps_index[i]][column_name]
+
+ # JS sorts alphanumeric by default, convert values explicit to integers to sort numerically
+ if column_name not in ['name', 'notes'] and value is not js_undefined:
+ value = int(value)
+
+ return value
+
+ # We set swapped to True so the loop looks runs at least once
+ swapped = True
+ while swapped:
+ swapped = False
+ for i in range(len(ps_index) - 1):
+
+ v1 = getvalue(column_name, i)
+ v2 = getvalue(column_name, i+1)
+
+ if (not reverse and v1 > v2) or (reverse and v1 < v2):
+ # Swap the elements
+ ps_index[i], ps_index[i+1] = ps_index[i+1], ps_index[i]
+
+ # Set the flag to True so we'll loop again
+ swapped = True
+
OOMDisplayInstance = OOMDisplay()