#include "selfdrive/common/util.h" #include #include #include #include #include #include #include #ifdef __linux__ #include #include #ifndef __USE_GNU #define __USE_GNU #endif #include #endif // __linux__ 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 } int set_core_affinity(int core) { #ifdef __linux__ 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 } namespace util { std::string read_file(const std::string& fn) { std::ifstream ifs(fn, std::ios::binary | std::ios::ate); if (ifs) { std::ifstream::pos_type pos = ifs.tellg(); if (pos != std::ios::beg) { std::string result; result.resize(pos); ifs.seekg(0, std::ios::beg); ifs.read(result.data(), pos); if (ifs) { return result; } } } ifs.close(); // fallback for files created on read, e.g. procfs std::ifstream f(fn); std::stringstream buffer; buffer << f.rdbuf(); return buffer.str(); } int read_files_in_dir(const std::string &path, std::map *contents) { DIR *d = opendir(path.c_str()); if (!d) return -1; struct dirent *de = NULL; while ((de = readdir(d))) { if (isalnum(de->d_name[0])) { (*contents)[de->d_name] = util::read_file(path + "/" + de->d_name); } } closedir(d); return 0; } int write_file(const char* path, const void* data, size_t size, int flags, mode_t mode) { int fd = open(path, flags, mode); if (fd == -1) { return -1; } ssize_t n = write(fd, data, size); close(fd); return (n >= 0 && (size_t)n == size) ? 0 : -1; } std::string readlink(const std::string &path) { char buff[4096]; ssize_t len = ::readlink(path.c_str(), buff, sizeof(buff)-1); if (len != -1) { buff[len] = '\0'; return std::string(buff); } return ""; } bool file_exists(const std::string& fn) { std::ifstream f(fn); return f.good(); } std::string getenv_default(const char* env_var, const char * suffix, const char* default_val) { const char* env_val = getenv(env_var); if (env_val != NULL){ return std::string(env_val) + std::string(suffix); } else { return std::string(default_val); } } std::string tohex(const uint8_t *buf, size_t buf_size) { std::unique_ptr hexbuf(new char[buf_size * 2 + 1]); for (size_t i = 0; i < buf_size; i++) { sprintf(&hexbuf[i * 2], "%02x", buf[i]); } hexbuf[buf_size * 2] = 0; return std::string(hexbuf.get(), hexbuf.get() + buf_size * 2); } std::string hexdump(const std::string& in) { std::stringstream ss; ss << std::hex << std::setfill('0'); for (size_t i = 0; i < in.size(); i++) { ss << std::setw(2) << static_cast(static_cast(in[i])); } return ss.str(); } std::string base_name(std::string const &path) { size_t pos = path.find_last_of("/"); if (pos == std::string::npos) return path; return path.substr(pos + 1); } std::string dir_name(std::string const &path) { size_t pos = path.find_last_of("/"); if (pos == std::string::npos) return ""; return path.substr(0, pos); } struct tm get_time(){ time_t rawtime; time(&rawtime); struct tm sys_time; gmtime_r(&rawtime, &sys_time); return sys_time; } bool time_valid(struct tm sys_time){ int year = 1900 + sys_time.tm_year; int month = 1 + sys_time.tm_mon; return (year > 2020) || (year == 2020 && month >= 10); } } // namespace util