From 8ad1ecf4df971cac30a6e58cbec1b38f1b1fafca Mon Sep 17 00:00:00 2001 From: Nikodemus Siivola Date: Wed, 29 Oct 2008 10:52:19 +0200 Subject: [PATCH] initial commit --- Makefile | 7 +++++++ sb-sched.c | 38 ++++++++++++++++++++++++++++++++++++++ sb-sched.lisp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 Makefile create mode 100644 sb-sched.c create mode 100644 sb-sched.lisp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2e9affa --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +all: sb-sched.so + +sb-sched.so: sb-sched.o + ld -shared -o sb-sched.so sb-sched.o + +sb-sched.o: sb-sched.c + gcc -c sb-sched.c -o sb-sched.o -fPIC diff --git a/sb-sched.c b/sb-sched.c new file mode 100644 index 0000000..f656580 --- /dev/null +++ b/sb-sched.c @@ -0,0 +1,38 @@ +#define _GNU_SOURCE +#include + +int cpu_setsize = CPU_SETSIZE; +int cpu_masksize = sizeof(cpu_set_t); + +int get_cpu_affinity_mask(cpu_set_t *mask) +{ + return sched_getaffinity(0, CPU_SETSIZE, mask); +} + +int set_cpu_affinity_mask(cpu_set_t *mask) +{ + return sched_setaffinity(0, CPU_SETSIZE, mask); +} + +void zero_cpu_affinity_mask(cpu_set_t *mask) +{ + CPU_ZERO(mask); +} + +void set_cpu_affinity(int cpu, cpu_set_t *mask) +{ + CPU_SET(cpu, mask); +} + +int cpu_affinity_p(int cpu, cpu_set_t *mask) +{ + return CPU_ISSET(cpu, mask); +} + +void clear_cpu_affinity(int cpu, cpu_set_t *mask) +{ + CPU_CLR(cpu, mask); +} + + + diff --git a/sb-sched.lisp b/sb-sched.lisp new file mode 100644 index 0000000..12f304a --- /dev/null +++ b/sb-sched.lisp @@ -0,0 +1,54 @@ +(load-shared-object "/home/nikodemus/Desktop/sb-sched.so") + +(define-alien-variable cpu-setsize int) + +(define-alien-variable cpu-masksize int) + +(defun make-cpu-mask () + (make-alien (unsigned 8) cpu-masksize)) + +(define-alien-routine get-cpu-affinity-mask int (mask (* (unsigned 8)))) + +(define-alien-routine set-cpu-affinity-mask int (mask (* (unsigned 8)))) + +(define-alien-routine clear-cpu-affinity-mask void (mask (* (unsigned 8)))) + +(define-alien-routine cpu-affinity-p int (cpu int) (mask (* (unsigned 8)))) + +(define-alien-routine set-cpu-affinity void (cpu int) (mask (* (unsigned 8)))) + +(define-alien-routine clear-cpu-affinity void (cpu int) (mask (* (unsigned 8)))) + +(defmacro with-cpu-affinity-mask ((mask &key save) &body body) + `(let (,mask) + (unwind-protect + (progn + (setf ,mask (make-cpu-mask)) + (unless (zerop (get-cpu-affinity-mask ,mask)) + (error "Could not read CPU affinity mask.")) + ,@body) + (when ,mask + (when ,save + (unless (zerop (set-cpu-affinity-mask ,mask)) + (error "Could not set CPU affinity mask."))) + ;; FIXME: This leaks 128 bytes per call, but glibc complains about + ;; double free if we free this! Not sure what is going on. + #+nil + (free-alien ,mask))))) + +;; Usage examples +#+nil +(progn + + (with-cpu-affinity-mask (mask) + (dotimes (i cpu-setsize) + (when (plusp (cpu-affinity-p i mask)) + (print (list :cpu i))))) + + (with-cpu-affinity-mask (mask :save t) + (clear-cpu-affinity 0 mask)) + + (with-cpu-affinity-mask (mask) + (dotimes (i cpu-setsize) + (when (plusp (cpu-affinity-p i mask)) + (print (list :cpu i)))))) -- 2.11.4.GIT