2020-01-17 11:01:02 -08:00
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <assert.h>
|
|
|
|
|
#include <unistd.h>
|
2020-09-21 22:10:38 +08:00
|
|
|
#include <fcntl.h>
|
2020-10-17 12:40:01 -07:00
|
|
|
#include <errno.h>
|
|
|
|
|
|
2020-01-17 11:01:02 -08:00
|
|
|
#ifdef __linux__
|
|
|
|
|
#include <sys/prctl.h>
|
|
|
|
|
#include <sys/syscall.h>
|
2020-10-17 12:40:01 -07:00
|
|
|
#ifndef __USE_GNU
|
2020-06-05 17:09:41 -04:00
|
|
|
#define __USE_GNU
|
2020-01-17 11:01:02 -08:00
|
|
|
#endif
|
2020-10-17 12:40:01 -07:00
|
|
|
#include <sched.h>
|
|
|
|
|
#endif // __linux__
|
2020-01-17 11:01:02 -08:00
|
|
|
|
|
|
|
|
void* read_file(const char* path, size_t* out_len) {
|
|
|
|
|
FILE* f = fopen(path, "r");
|
|
|
|
|
if (!f) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
fseek(f, 0, SEEK_END);
|
|
|
|
|
long f_len = ftell(f);
|
|
|
|
|
rewind(f);
|
|
|
|
|
|
2020-06-12 09:06:47 +08:00
|
|
|
// malloc one extra byte so the file will always be NULL terminated
|
2020-06-03 14:22:45 -07:00
|
|
|
// cl_cached_program_from_file relies on this
|
2020-06-12 09:06:47 +08:00
|
|
|
char* buf = (char*)malloc(f_len+1);
|
2020-01-17 11:01:02 -08:00
|
|
|
assert(buf);
|
|
|
|
|
|
|
|
|
|
size_t num_read = fread(buf, f_len, 1, f);
|
|
|
|
|
fclose(f);
|
|
|
|
|
|
|
|
|
|
if (num_read != 1) {
|
|
|
|
|
free(buf);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-12 09:06:47 +08:00
|
|
|
buf[f_len] = '\0';
|
2020-01-17 11:01:02 -08:00
|
|
|
if (out_len) {
|
|
|
|
|
*out_len = f_len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-21 22:10:38 +08:00
|
|
|
int write_file(const char* path, const void* data, size_t size) {
|
|
|
|
|
int fd = open(path, O_WRONLY);
|
|
|
|
|
if (fd == -1) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
ssize_t n = write(fd, data, size);
|
|
|
|
|
close(fd);
|
2020-10-20 13:44:24 +08:00
|
|
|
return (n >= 0 && (size_t)n == size) ? 0 : -1;
|
2020-09-21 22:10:38 +08:00
|
|
|
}
|
|
|
|
|
|
2020-01-17 11:01:02 -08:00
|
|
|
void set_thread_name(const char* name) {
|
|
|
|
|
#ifdef __linux__
|
|
|
|
|
// pthread_setname_np is dumb (fails instead of truncates)
|
|
|
|
|
prctl(PR_SET_NAME, (unsigned long)name, 0, 0, 0);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int set_realtime_priority(int level) {
|
|
|
|
|
#ifdef __linux__
|
|
|
|
|
long tid = syscall(SYS_gettid);
|
|
|
|
|
|
|
|
|
|
// should match python using chrt
|
|
|
|
|
struct sched_param sa;
|
|
|
|
|
memset(&sa, 0, sizeof(sa));
|
|
|
|
|
sa.sched_priority = level;
|
|
|
|
|
return sched_setscheduler(tid, SCHED_FIFO, &sa);
|
|
|
|
|
#else
|
|
|
|
|
return -1;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-05 17:09:41 -04:00
|
|
|
int set_core_affinity(int core) {
|
2020-09-02 17:52:41 +02:00
|
|
|
#ifdef __linux__
|
2020-06-05 17:09:41 -04:00
|
|
|
long tid = syscall(SYS_gettid);
|
|
|
|
|
cpu_set_t rt_cpu;
|
|
|
|
|
|
|
|
|
|
CPU_ZERO(&rt_cpu);
|
|
|
|
|
CPU_SET(core, &rt_cpu);
|
|
|
|
|
return sched_setaffinity(tid, sizeof(rt_cpu), &rt_cpu);
|
|
|
|
|
#else
|
|
|
|
|
return -1;
|
|
|
|
|
#endif
|
|
|
|
|
}
|