aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Senozhatsky <sergey.senozhatsky@gmail.com>2011-05-08 22:28:14 +0300
committerArjan van de Ven <arjan@linux.intel.com>2011-05-11 00:04:35 -0400
commite78f77ae42cca7c442c9af1c429e316d0df931ae (patch)
treeffcacefde927bec3be7715abab1814069ba56fa0
parent96c48bfd9e348108593774f351df48d0841fc80c (diff)
downloadpowertop-e78f77ae42cca7c442c9af1c429e316d0df931ae.tar.gz
Relax merge_processes() complexity
Attempt to relax merge_processes() complexity. Currently we are performing 2 iterations in merge_processes(), iterating through even already merged threads/processes. This patch removes merged process (process *two) from all_processes. Also, do not 'NULL' process *two in merge_process(), since we're about to delete it. Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
-rw-r--r--process/process.cpp49
1 files changed, 22 insertions, 27 deletions
diff --git a/process/process.cpp b/process/process.cpp
index a1fb725..024f613 100644
--- a/process/process.cpp
+++ b/process/process.cpp
@@ -119,8 +119,7 @@ process::process(const char *_comm, int _pid, int _tid) : power_consumer()
if (strncmp(_comm, "kondemand/", 10) == 0)
is_idle = 1;
- sprintf(desc, "%s", comm);
-
+ strcpy(desc, comm);
sprintf(line, "/proc/%i/cmdline", _pid);
file.open(line, ios::binary);
@@ -184,42 +183,38 @@ static void merge_process(class process *one, class process *two)
one->hard_disk_hits += two->hard_disk_hits;
one->gpu_ops += two->gpu_ops;
one->power_charge += two->power_charge;
-
- two->accumulated_runtime = 0;
- two->child_runtime = 0;
- two->wake_ups = 0;
- two->disk_hits = 0;
- two->hard_disk_hits = 0;
- two->gpu_ops = 0;
- two->power_charge = 0;
}
void merge_processes(void)
{
- unsigned int i,j;
+ std::vector<class process*>::iterator it1, it2;
class process *one, *two;
- /* fold threads */
- for (i = 0; i < all_processes.size() ; i++) {
- one = all_processes[i];
- for (j = i + 1; j < all_processes.size(); j++) {
- two = all_processes[j];
- if (one->pid == two->tgid && two->tgid != 0)
+ it1 = all_processes.begin();
+ while (it1 != all_processes.end()) {
+ it2 = it1 + 1;
+ one = *it1;
+ while (it2 != all_processes.end()) {
+ two = *it2;
+ /* fold threads */
+ if (one->pid == two->tgid && two->tgid != 0) {
merge_process(one, two);
- }
- }
-
- /* find dupes and add up */
- for (i = 0; i < all_processes.size() ; i++) {
- one = all_processes[i];
- for (j = i + 1; j < all_processes.size(); j++) {
- two = all_processes[j];
- if (strcmp(one->desc, two->desc) == 0)
+ delete *it2;
+ it2 = all_processes.erase(it2);
+ continue;
+ }
+ /* find dupes and add up */
+ if (!strcmp(one->desc, two->desc)) {
merge_process(one, two);
+ delete *it2;
+ it2 = all_processes.erase(it2);
+ continue;
+ }
+ ++it2;
}
+ ++it1;
}
-
}
void all_processes_to_all_power(void)