aboutsummaryrefslogtreecommitdiffstats
path: root/Affinity.c
diff options
context:
space:
mode:
authorDaniel Lange <DLange@git.local>2016-04-11 13:01:07 +0200
committerDaniel Lange <DLange@git.local>2016-04-11 13:01:07 +0200
commitff9409b1737627857eb47f64f536a3f66b6a09a4 (patch)
tree61b631ba551e68a4f656b8b76ff7bd0d9955fc64 /Affinity.c
parentf75ab6d2c11e8a8e18191b087564aedebbeb96c5 (diff)
downloaddebian_htop-ff9409b1737627857eb47f64f536a3f66b6a09a4.tar.gz
debian_htop-ff9409b1737627857eb47f64f536a3f66b6a09a4.tar.bz2
debian_htop-ff9409b1737627857eb47f64f536a3f66b6a09a4.zip
Imported Upstream version 2.0.0upstream/2.0.0
Diffstat (limited to 'Affinity.c')
-rw-r--r--Affinity.c77
1 files changed, 73 insertions, 4 deletions
diff --git a/Affinity.c b/Affinity.c
index 3b1e311..471e102 100644
--- a/Affinity.c
+++ b/Affinity.c
@@ -9,9 +9,18 @@ in the source distribution for its full text.
#include <stdlib.h>
+#ifdef HAVE_LIBHWLOC
+#include <hwloc/linux.h>
+#elif HAVE_NATIVE_AFFINITY
+#include <sched.h>
+#endif
+
/*{
+#include "Process.h"
+#include "ProcessList.h"
typedef struct Affinity_ {
+ ProcessList* pl;
int size;
int used;
int* cpus;
@@ -19,10 +28,11 @@ typedef struct Affinity_ {
}*/
-Affinity* Affinity_new() {
- Affinity* this = calloc(1, sizeof(Affinity));
+Affinity* Affinity_new(ProcessList* pl) {
+ Affinity* this = xCalloc(1, sizeof(Affinity));
this->size = 8;
- this->cpus = calloc(this->size, sizeof(int));
+ this->cpus = xCalloc(this->size, sizeof(int));
+ this->pl = pl;
return this;
}
@@ -34,9 +44,68 @@ void Affinity_delete(Affinity* this) {
void Affinity_add(Affinity* this, int id) {
if (this->used == this->size) {
this->size *= 2;
- this->cpus = realloc(this->cpus, sizeof(int) * this->size);
+ this->cpus = xRealloc(this->cpus, sizeof(int) * this->size);
}
this->cpus[this->used] = id;
this->used++;
}
+
+#ifdef HAVE_LIBHWLOC
+
+Affinity* Affinity_get(Process* proc, ProcessList* pl) {
+ hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
+ bool ok = (hwloc_linux_get_tid_cpubind(pl->topology, proc->pid, cpuset) == 0);
+ Affinity* affinity = NULL;
+ if (ok) {
+ affinity = Affinity_new(pl);
+ if (hwloc_bitmap_last(cpuset) == -1) {
+ for (int i = 0; i < pl->cpuCount; i++) {
+ Affinity_add(affinity, i);
+ }
+ } else {
+ unsigned int id;
+ hwloc_bitmap_foreach_begin(id, cpuset);
+ Affinity_add(affinity, id);
+ hwloc_bitmap_foreach_end();
+ }
+ }
+ hwloc_bitmap_free(cpuset);
+ return affinity;
+}
+
+bool Affinity_set(Process* proc, Affinity* this) {
+ hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
+ for (int i = 0; i < affinity->used; i++) {
+ hwloc_bitmap_set(cpuset, affinity->cpus[i]);
+ }
+ bool ok = (hwloc_linux_set_tid_cpubind(this->pl->topology, proc->pid, cpuset) == 0);
+ hwloc_bitmap_free(cpuset);
+ return ok;
+}
+
+#elif HAVE_NATIVE_AFFINITY
+
+Affinity* Affinity_get(Process* proc, ProcessList* pl) {
+ cpu_set_t cpuset;
+ bool ok = (sched_getaffinity(proc->pid, sizeof(cpu_set_t), &cpuset) == 0);
+ if (!ok) return NULL;
+ Affinity* affinity = Affinity_new(pl);
+ for (int i = 0; i < pl->cpuCount; i++) {
+ if (CPU_ISSET(i, &cpuset))
+ Affinity_add(affinity, i);
+ }
+ return affinity;
+}
+
+bool Affinity_set(Process* proc, Affinity* this) {
+ cpu_set_t cpuset;
+ CPU_ZERO(&cpuset);
+ for (int i = 0; i < this->used; i++) {
+ CPU_SET(this->cpus[i], &cpuset);
+ }
+ bool ok = (sched_setaffinity(proc->pid, sizeof(unsigned long), &cpuset) == 0);
+ return ok;
+}
+
+#endif

© 2014-2024 Faster IT GmbH | imprint | privacy policy