Phasor 3.1.1
Stack VM based Programming Language
Loading...
Searching...
No Matches
system.c
Go to the documentation of this file.
1#include "system.h"
2
4{
5#ifdef _WIN32
6 MEMORYSTATUSEX statex;
7 statex.dwLength = sizeof(statex);
8 if (!GlobalMemoryStatusEx(&statex))
9 return 0;
10 return (size_t)statex.ullAvailPhys;
11
12#elif defined(__APPLE__) && defined(__MACH__)
13 mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
14 vm_statistics_data_t vmstat;
15 if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count) != KERN_SUCCESS)
16 return 0;
17
18 vm_size_t page_size = 0;
19 if (host_page_size(mach_host_self(), &page_size) != KERN_SUCCESS || page_size == 0)
20 return 0;
21
22 natural_t available_pages = vmstat.free_count + vmstat.inactive_count;
23 return (size_t)available_pages * (size_t)page_size;
24
25#elif defined(__linux__)
26 long pages = sysconf(_SC_AVPHYS_PAGES);
27 long page_size = sysconf(_SC_PAGESIZE);
28 if (pages == -1 || page_size == -1)
29 return 0;
30 return (size_t)pages * (size_t)page_size;
31
32#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
33 size_t page_size = 0;
34 size_t len = sizeof(page_size);
35 if (sysctlbyname("hw.pagesize", &page_size, &len, NULL, 0) != 0 || page_size == 0)
36 return 0;
37
38 long free_pages = 0;
39#if defined(__OpenBSD__)
40 len = sizeof(free_pages);
41 if (sysctlbyname("uvm.stats.sys.free", &free_pages, &len, NULL, 0) != 0)
42 return 0;
43#else
44 len = sizeof(free_pages);
45 if (sysctlbyname("vm.stats.vm.v_free_count", &free_pages, &len, NULL, 0) != 0)
46 return 0;
47#endif
48
49 return (size_t)free_pages * (size_t)page_size;
50
51#else
52 return 0;
53#endif
54}
55
56int PHASORstd_sys_run(const char *name, int argc, char **argv)
57{
58 char **args = (char **)malloc((argc + 2) * sizeof(char *));
59 if (!args)
60 return -1;
61
62 args[0] = (char *)name;
63 for (int i = 0; i < argc; i++)
64 args[i + 1] = argv[i];
65 args[argc + 1] = NULL;
66
67#ifdef _WIN32
68 int ret = (int)_spawnvp(_P_WAIT, name, (const char *const *)args);
69 if (ret == -1)
70 {
71 perror(name);
72 }
73#else
74 int ret = -1;
75 pid_t pid = fork();
76 if (pid == 0)
77 {
78 execvp(name, args);
79 exit(1); // execvp failed
80 }
81 int status;
82 waitpid(pid, &status, 0);
83 ret = WEXITSTATUS(status);
84#endif
85
86 free(args);
87 return ret;
88}
89
90int PHASORstd_sys_run_detached(const char *name, int argc, char **argv)
91{
92 char **args = (char **)malloc((argc + 2) * sizeof(char *));
93 if (!args)
94 return -1;
95
96 args[0] = (char *)name;
97 for (int i = 0; i < argc; i++)
98 args[i + 1] = argv[i];
99 args[argc + 1] = NULL;
100
101#ifdef _WIN32
102
103 int ret = (int)_spawnvp(_P_NOWAIT, name, (const char *const *)args);
104 if (ret == -1)
105 perror(name);
106
107 free(args);
108 return ret;
109
110#else
111
112 pid_t pid = fork();
113 if (pid < 0)
114 {
115 free(args);
116 return -1;
117 }
118
119 if (pid == 0)
120 {
121 setsid();
122
123 pid_t pid2 = fork();
124 if (pid2 < 0)
125 exit(1);
126
127 if (pid2 > 0)
128 exit(0);
129
130 execvp(name, args);
131 exit(1);
132 }
133
134 free(args);
135 return 0;
136
137#endif
138}
int PHASORstd_sys_run_detached(const char *name, int argc, char **argv)
Definition system.c:90
size_t PHASORstd_sys_getAvailableMemory()
Definition system.c:3
int PHASORstd_sys_run(const char *name, int argc, char **argv)
Definition system.c:56