1*4882a593Smuzhiyun #pragma once 2*4882a593Smuzhiyun #undef NDEBUG 3*4882a593Smuzhiyun #include <assert.h> 4*4882a593Smuzhiyun #include <dirent.h> 5*4882a593Smuzhiyun #include <errno.h> 6*4882a593Smuzhiyun #include <stdbool.h> 7*4882a593Smuzhiyun #include <stdlib.h> 8*4882a593Smuzhiyun #include <string.h> 9*4882a593Smuzhiyun #include <unistd.h> 10*4882a593Smuzhiyun #include <sys/syscall.h> 11*4882a593Smuzhiyun sys_getpid(void)12*4882a593Smuzhiyunstatic inline pid_t sys_getpid(void) 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun return syscall(SYS_getpid); 15*4882a593Smuzhiyun } 16*4882a593Smuzhiyun sys_gettid(void)17*4882a593Smuzhiyunstatic inline pid_t sys_gettid(void) 18*4882a593Smuzhiyun { 19*4882a593Smuzhiyun return syscall(SYS_gettid); 20*4882a593Smuzhiyun } 21*4882a593Smuzhiyun streq(const char * s1,const char * s2)22*4882a593Smuzhiyunstatic inline bool streq(const char *s1, const char *s2) 23*4882a593Smuzhiyun { 24*4882a593Smuzhiyun return strcmp(s1, s2) == 0; 25*4882a593Smuzhiyun } 26*4882a593Smuzhiyun xstrtoull(const char * p,char ** end)27*4882a593Smuzhiyunstatic unsigned long long xstrtoull(const char *p, char **end) 28*4882a593Smuzhiyun { 29*4882a593Smuzhiyun if (*p == '0') { 30*4882a593Smuzhiyun *end = (char *)p + 1; 31*4882a593Smuzhiyun return 0; 32*4882a593Smuzhiyun } else if ('1' <= *p && *p <= '9') { 33*4882a593Smuzhiyun unsigned long long val; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun errno = 0; 36*4882a593Smuzhiyun val = strtoull(p, end, 10); 37*4882a593Smuzhiyun assert(errno == 0); 38*4882a593Smuzhiyun return val; 39*4882a593Smuzhiyun } else 40*4882a593Smuzhiyun assert(0); 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun xreaddir(DIR * d)43*4882a593Smuzhiyunstatic struct dirent *xreaddir(DIR *d) 44*4882a593Smuzhiyun { 45*4882a593Smuzhiyun struct dirent *de; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun errno = 0; 48*4882a593Smuzhiyun de = readdir(d); 49*4882a593Smuzhiyun assert(de || errno == 0); 50*4882a593Smuzhiyun return de; 51*4882a593Smuzhiyun } 52