OSDN Git Service

perf cpumap: Add intersect function
[tomoyo/tomoyo-test1.git] / tools / lib / perf / cpumap.c
index 1229b18..d4f3a1a 100644 (file)
@@ -402,3 +402,38 @@ struct perf_cpu_map *perf_cpu_map__merge(struct perf_cpu_map *orig,
        perf_cpu_map__put(orig);
        return merged;
 }
+
+struct perf_cpu_map *perf_cpu_map__intersect(struct perf_cpu_map *orig,
+                                            struct perf_cpu_map *other)
+{
+       struct perf_cpu *tmp_cpus;
+       int tmp_len;
+       int i, j, k;
+       struct perf_cpu_map *merged = NULL;
+
+       if (perf_cpu_map__is_subset(other, orig))
+               return perf_cpu_map__get(orig);
+       if (perf_cpu_map__is_subset(orig, other))
+               return perf_cpu_map__get(other);
+
+       tmp_len = max(orig->nr, other->nr);
+       tmp_cpus = malloc(tmp_len * sizeof(struct perf_cpu));
+       if (!tmp_cpus)
+               return NULL;
+
+       i = j = k = 0;
+       while (i < orig->nr && j < other->nr) {
+               if (orig->map[i].cpu < other->map[j].cpu)
+                       i++;
+               else if (orig->map[i].cpu > other->map[j].cpu)
+                       j++;
+               else {
+                       j++;
+                       tmp_cpus[k++] = orig->map[i++];
+               }
+       }
+       if (k)
+               merged = cpu_map__trim_new(k, tmp_cpus);
+       free(tmp_cpus);
+       return merged;
+}