#include #include #include #include #include #include #include #include #include "syscall.h" #include "libc.h" #define _GNU_SOURCE #include #define JT(x) (-256|(x)) #define VER JT(1) #define JT_ARG_MAX JT(2) #define JT_MQ_PRIO_MAX JT(3) #define JT_PAGE_SIZE JT(4) #define JT_SEM_VALUE_MAX JT(5) #define JT_NPROCESSORS_CONF JT(6) #define JT_NPROCESSORS_ONLN JT(7) #define JT_PHYS_PAGES JT(8) #define JT_AVPHYS_PAGES JT(9) #define JT_ZERO JT(10) #define JT_DELAYTIMER_MAX JT(11) #define RLIM(x) (-32768|(RLIMIT_ ## x)) static inline int get_nrprocessors_conf(void) { DIR *d = opendir("/sys/devices/system/cpu"); struct dirent *de; unsigned int cnt = 0; if (!d) return -1; while ((de = readdir(d))) { if (de->d_type == DT_DIR && strlen(de->d_name) > 3 && de->d_name[0] == 'c' && de->d_name[1] == 'p' && de->d_name[2] == 'u' && isdigit(de->d_name[3])) cnt++; } closedir(d); return cnt; } static inline int get_nrprocessors_onln(void) { unsigned char set[128] = {1}; int i, cnt; __syscall(SYS_sched_getaffinity, 0, sizeof set, set); for (i=cnt=0; i= sizeof(values)/sizeof(values[0]) || !values[name]) { errno = EINVAL; return -1; } else if (values[name] >= -1) { return values[name]; } else if (values[name] < -256) { struct rlimit lim; getrlimit(values[name]&16383, &lim); if (lim.rlim_cur == RLIM_INFINITY) return -1; return lim.rlim_cur > LONG_MAX ? LONG_MAX : lim.rlim_cur; } switch ((unsigned char)values[name]) { case VER & 255: return _POSIX_VERSION; case JT_ARG_MAX & 255: return ARG_MAX; case JT_MQ_PRIO_MAX & 255: return MQ_PRIO_MAX; case JT_PAGE_SIZE & 255: return PAGE_SIZE; case JT_SEM_VALUE_MAX & 255: return SEM_VALUE_MAX; case JT_DELAYTIMER_MAX & 255: return DELAYTIMER_MAX; case JT_NPROCESSORS_CONF & 255: ; int cnt = get_nrprocessors_conf(); if (cnt > 0) return cnt; return get_nrprocessors_onln(); case JT_NPROCESSORS_ONLN & 255: ; return get_nrprocessors_onln(); case JT_PHYS_PAGES & 255: case JT_AVPHYS_PAGES & 255: ; unsigned long long mem; struct sysinfo si; __lsysinfo(&si); if (!si.mem_unit) si.mem_unit = 1; if (name==_SC_PHYS_PAGES) mem = si.totalram; else mem = si.freeram + si.bufferram; mem *= si.mem_unit; mem /= PAGE_SIZE; return (mem > LONG_MAX) ? LONG_MAX : mem; case JT_ZERO & 255: return 0; } return values[name]; }