changes.
[IRC.git] / Robust / src / Runtime / affinity.c
1 #include <stdio.h>
2 #include <pthread.h>
3 #include <sys/syscall.h>
4 #include <unistd.h>
5 #include <errno.h>
6 #include <sched.h>
7 #include <stdarg.h>
8 #include <stdlib.h>
9 #include <runtime.h>
10
11 static volatile unsigned int corecount=0;
12
13
14 static inline int atomicinc(volatile unsigned int *lock) {
15   int retval=1;
16   __asm__ __volatile__("lock; xadd %0,%1"
17                        : "=r"(retval)
18                        : "m"(*lock), "0"(retval)
19                        : "memory");
20   return retval;
21 }
22
23
24 void set_affinity() {
25   int err;
26   cpu_set_t cpumask;
27
28   CPU_ZERO(&cpumask);
29
30   int ourcount=atomicinc(&corecount);
31   ourcount=ourcount&7;
32   int newvalue=ourcount>>1;
33   if (ourcount&1) {
34     newvalue=newvalue|4;
35   }
36
37   CPU_SET(newvalue, &cpumask);
38
39   err = sched_setaffinity(syscall(SYS_gettid), sizeof(cpu_set_t), &cpumask);
40
41   if (err == -1)
42     printf("set_affinity: %s\n", strerror(errno));
43 }