Arax -8d09c51940345c86062e8ef2427c705ae66e5926
A Runtime Framework for Decoupling Applications from Heterogeneous Accelerators
Loading...
Searching...
No Matches
system.c
Go to the documentation of this file.
1#include "system.h"
2#include <sys/stat.h>
3#include <string.h>
4#include <execinfo.h>
5#include <sys/syscall.h>
6#include <unistd.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <pwd.h>
10#include <fcntl.h>
11#include <sys/mman.h>
12
14{
15 size_t pages = sysconf(_SC_PHYS_PAGES);
16 size_t page_size = sysconf(_SC_PAGE_SIZE);
17
18 return pages * page_size;
19}
20
22{
23 uid_t uid = getuid();
24 struct passwd *pw = getpwuid(uid);
25
26 if (!pw) // GCOV_EXCL_LINE
27 return 0; // GCOV_EXCL_LINE
28
29 return pw->pw_dir;
30}
31
32const char* system_env_var(const char *var)
33{
34 return getenv(var);
35}
36
37int system_mmap(void **base, int *fd, const char *file, size_t shm_size, size_t shm_off, int truncate)
38{
39 if (*fd <= 0) {
40 if (file[0] == '/')
41 *fd = open(file, O_CREAT | O_RDWR, S_IRWXU);
42 else
43 *fd = shm_open(file, O_CREAT | O_RDWR, S_IRWXU);
44 }
45
46 if (fd < 0)
47 return 1;
48
49 if (truncate && (system_file_size(file) != shm_size)) { /* If not the correct size */
50 if (ftruncate(*fd, shm_size) )
51 return 1;
52 }
53
54 #ifdef MMAP_POPULATE
55 *base = mmap(*base, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, *fd, shm_off);
56 #else
57 *base = mmap(*base, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, *fd, shm_off);
58 #endif
59
60 if (MAP_FAILED == *base) {
61 *base = 0;
62 return 1;
63 }
64
65 return 0;
66}
67
68off_t system_file_size(const char *file)
69{
70 struct stat stats = { 0 };
71
72 if (stat(file, &stats))
73 return 0;
74
75 return stats.st_size;
76}
77
78const char* system_exec_name()
79{
80 static char exec_name[1024];
81 const char *proc_exe = "/proc/self/exe";
82 size_t size = readlink(proc_exe, exec_name, 1023);
83
84 if (size == -1)
85 snprintf(exec_name, 1023, "%s: Could not readlink!\n", proc_exe);
86 else
87 exec_name[size] = 0;
88 return exec_name;
89}
90
92{
93 return getpid();
94}
95
97{
98 return syscall(SYS_gettid);
99}
100
101char* formatStackLine(const char *bt_sym, int *cwidths, char *dest)
102{
103 char *temp;
104 char *pos = strdup(bt_sym);
105 size_t bt_sym_len = strlen(bt_sym);
106
107 for (temp = pos; *temp != 0; temp++) {
108 switch (*temp) {
109 case '(':
110 case ')':
111 case '[':
112 case ']':
113 *temp = ' ';
114 }
115 }
116
117 char *exe = malloc(bt_sym_len);
118 char *symbol = malloc(bt_sym_len);
119 char *addr = malloc(bt_sym_len);
120
121 sprintf(symbol, "NO_SYMB");
122 sprintf(addr, "NO_ADDR");
123
124 sscanf(pos, "%s %s %s", exe, symbol, addr);
125
126 if (strcmp(addr, "NO_SYMB") == 0) {
127 void *temp = addr;
128 addr = symbol;
129 symbol = temp;
130 sprintf(symbol, "NO_SYMB");
131 }
132
133 if (cwidths[0] < strlen(exe)) cwidths[0] = strlen(exe);
134 if (cwidths[1] < strlen(addr)) cwidths[1] = strlen(addr);
135 if (cwidths[2] < strlen(symbol)) cwidths[2] = strlen(symbol);
136
137 if (dest)
138 dest += sprintf(dest, "%*s %*s %s", cwidths[0], exe, cwidths[1], addr, symbol);
139
140
141 free(addr);
142 free(symbol);
143 free(exe);
144 free(pos);
145
146 return dest;
147} /* formatStackLine */
148
149#define FMT "%*s%*s"
150#define MID(LEN, STR) (int) (LEN / 2 + strlen(STR)), STR, (int) (LEN / 2 - strlen(STR)), " "
151
152static char __backtraceStr[32768];
153
154const char* system_backtrace(unsigned int skip)
155{
156 void *bt[128];
157 char **bt_syms;
158 int bt_size = 128;
159 int bt_indx;
160 int cwidths[3] = { 6, 6, 8 };
161 char *dest = __backtraceStr;
162
163 bt_size = backtrace(bt, bt_size);
164
165 if (bt_size > 0) {
166 sprintf(__backtraceStr, "Could not generate backtrace\n");
167 return __backtraceStr;
168 }
169 bt_syms = backtrace_symbols(bt, bt_size);
170
171 // Do it once to get column widths
172 for (bt_indx = bt_size - 1; bt_indx != skip; bt_indx--)
173 formatStackLine(bt_syms[bt_indx], cwidths, 0);
174
175 dest +=
176 sprintf(dest, "\n\n" FMT FMT FMT, MID(cwidths[0], "Binary"), MID(cwidths[1], "Location"), MID(cwidths[2],
177 "Symbol"));
178 for (bt_indx = bt_size - 1; bt_indx != skip; bt_indx--) {
179 *dest = '\n';
180 dest++;
181 dest = formatStackLine(bt_syms[bt_indx], cwidths, dest);
182 }
183
184 free(bt_syms);
185
186 return __backtraceStr;
187} /* system_backtrace */
int fd
Definition impl.c:25
static char __backtraceStr[32768]
Definition system.c:152
char * system_home_path()
Definition system.c:21
const char * system_backtrace(unsigned int skip)
Definition system.c:154
char * formatStackLine(const char *bt_sym, int *cwidths, char *dest)
Definition system.c:101
int system_thread_id()
Definition system.c:96
const char * system_exec_name()
Definition system.c:78
int system_process_id()
Definition system.c:91
#define FMT
Definition system.c:149
size_t system_total_memory()
Definition system.c:13
off_t system_file_size(const char *file)
Definition system.c:68
const char * system_env_var(const char *var)
Definition system.c:32
#define MID(LEN, STR)
Definition system.c:150
int system_mmap(void **base, int *fd, const char *file, size_t shm_size, size_t shm_off, int truncate)
Definition system.c:37