initial commit
[sb-cpu-affinity.git] / sb-sched.lisp
blob12f304ac500ca42ae5615e4f36eddbb76a57ad5d
1 (load-shared-object "/home/nikodemus/Desktop/sb-sched.so")
3 (define-alien-variable cpu-setsize int)
5 (define-alien-variable cpu-masksize int)
7 (defun make-cpu-mask ()
8 (make-alien (unsigned 8) cpu-masksize))
10 (define-alien-routine get-cpu-affinity-mask int (mask (* (unsigned 8))))
12 (define-alien-routine set-cpu-affinity-mask int (mask (* (unsigned 8))))
14 (define-alien-routine clear-cpu-affinity-mask void (mask (* (unsigned 8))))
16 (define-alien-routine cpu-affinity-p int (cpu int) (mask (* (unsigned 8))))
18 (define-alien-routine set-cpu-affinity void (cpu int) (mask (* (unsigned 8))))
20 (define-alien-routine clear-cpu-affinity void (cpu int) (mask (* (unsigned 8))))
22 (defmacro with-cpu-affinity-mask ((mask &key save) &body body)
23 `(let (,mask)
24 (unwind-protect
25 (progn
26 (setf ,mask (make-cpu-mask))
27 (unless (zerop (get-cpu-affinity-mask ,mask))
28 (error "Could not read CPU affinity mask."))
29 ,@body)
30 (when ,mask
31 (when ,save
32 (unless (zerop (set-cpu-affinity-mask ,mask))
33 (error "Could not set CPU affinity mask.")))
34 ;; FIXME: This leaks 128 bytes per call, but glibc complains about
35 ;; double free if we free this! Not sure what is going on.
36 #+nil
37 (free-alien ,mask)))))
39 ;; Usage examples
40 #+nil
41 (progn
43 (with-cpu-affinity-mask (mask)
44 (dotimes (i cpu-setsize)
45 (when (plusp (cpu-affinity-p i mask))
46 (print (list :cpu i)))))
48 (with-cpu-affinity-mask (mask :save t)
49 (clear-cpu-affinity 0 mask))
51 (with-cpu-affinity-mask (mask)
52 (dotimes (i cpu-setsize)
53 (when (plusp (cpu-affinity-p i mask))
54 (print (list :cpu i))))))