diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/tst-getcpu.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/tst-getcpu.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/tst-getcpu.c b/sysdeps/unix/sysv/linux/tst-getcpu.c new file mode 100644 index 0000000000..78c4a6919e --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-getcpu.c @@ -0,0 +1,53 @@ +#include <errno.h> +#include <stdio.h> +#include <sched.h> + + +static int +do_test (void) +{ + cpu_set_t cs; + if (sched_getaffinity (getpid (), sizeof (cs), &cs) != 0) + { + printf ("getaffinity failed: %m\n"); + return 1; + } + + int result = 0; + int cpu = 0; + while (CPU_COUNT (&cs) != 0) + { + if (CPU_ISSET (cpu, &cs)) + { + cpu_set_t cs2; + CPU_ZERO (&cs2); + CPU_SET (cpu, &cs2); + if (sched_setaffinity (getpid (), sizeof (cs2), &cs2) != 0) + { + printf ("setaffinity(%d) failed: %m\n", cpu); + result = 1; + } + else + { + int cpu2 = sched_getcpu (); + if (cpu2 == -1 && errno == ENOSYS) + { + puts ("getcpu syscall not implemented"); + return 0; + } + if (cpu2 != cpu) + { + printf ("getcpu results %d not possible\n", cpu2); + result = 1; + } + } + CPU_CLR (cpu, &cs); + } + ++cpu; + } + + return result; +} + +#define TEST_FUNCTION do_test () +#include <test-skeleton.c> |