blob: aac9f321c117005df7acd833fd077467bcf4375e [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
int main(int argc, char* argv[]) {
long ncpus = sysconf(_SC_NPROCESSORS_ONLN);
char arg[] = "--expected-cpus=";
if (argc <= 1 || 0 != strncmp(argv[1], arg, sizeof(arg)-1)) {
atomic_puts("Usage: sys_cpu_online --expected-cpus=[n] [--inner]");
return 1;
}
// We test this both with and without the preload library
// We also always allow 1 in case that's all the machine has
test_assert(ncpus == atoi(argv[1]+sizeof(arg)-1) || ncpus == 1);
if (argc > 2) {
atomic_puts("EXIT-SUCCESS");
return 0;
}
// Test reading /sys/devices/system/cpu/online directly, making sure that
// rr properly emulates the fd position
int fd = open("/sys/devices/system/cpu/online", O_RDONLY);
if (fd < 0 && errno == ENOENT) {
atomic_puts("Warning: sysfs not mapped. Skipping test.");
atomic_puts("EXIT-SUCCESS");
return 77;
}
test_assert(fd >= 0);
char result[1024];
size_t nread = read(fd, &result, sizeof(result));
test_assert(nread > 0);
nread = read(fd, &result, sizeof(result));
test_assert(nread == 0);
close(fd);
char* execv_argv[] = {"/proc/self/exe", argv[1], "--inner", NULL};
// NULL here drops LD_PRELOAD
execve("/proc/self/exe", execv_argv, NULL);
test_assert(0 && "Should not have returned");
}