1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "process_helper.h"
17 
18 #include <map>
19 #include <sys/sysctl.h>
20 
21 namespace Commonlibrary::Platform {
22 
23 #define MACOS_ARG_MAX 4096
24 #define MACOS_NOT_EXIST (-1)
25 
26 enum class SYSArgUnix : uint8_t {
27     SC_ARG_MAX = 0, // kernel
28     SC_CHILD_MAX = 1,
29     SC_CLK_TCK = 2,
30     SC_NGROUPS_MAX = 3,
31     SC_OPEN_MAX = 4,
32     SC_STREAM_MAX = 5,
33     SC_TZNAME_MAX = 6,
34     SC_JOB_CONTROL = 7,
35     SC_SAVED_IDS = 8,
36     SC_REALTIME_SIGNALS = 9,
37     SC_PRIORITY_SCHEDULING = 10,
38     SC_TIMERS = 11,
39     SC_ASYNCHRONOUS_IO = 12,
40     SC_PRIORITIZED_IO = 13,
41     SC_SYNCHRONIZED_IO = 14,
42     SC_FSYNC = 15,
43     SC_MAPPED_FILES = 16,
44     SC_MEMLOCK = 17,
45     SC_MEMLOCK_RANGE = 18,
46     SC_MEMORY_PROTECTION = 19,
47     SC_MESSAGE_PASSING = 20,
48     SC_SEMAPHORES = 21,
49     SC_SHARED_MEMORY_OBJECTS = 22,
50     SC_AIO_LISTIO_MAX = 23,
51     SC_AIO_MAX = 24,
52     SC_AIO_PRIO_DELTA_MAX = 25,
53     SC_DELAYTIMER_MAX = 26,
54     SC_MQ_OPEN_MAX = 27,
55     SC_MQ_PRIO_MAX = 28,
56     SC_VERSION = 29,
57     SC_PAGESIZE = 30,  // same with _SC_PAGE_SIZE in unix
58     SC_RTSIG_MAX = 31,
59     SC_SEM_NSEMS_MAX = 32,
60     SC_SEM_VALUE_MAX = 33,
61     SC_SIGQUEUE_MAX = 34,
62     SC_TIMER_MAX = 35,
63     SC_BC_BASE_MAX = 36,
64     SC_BC_DIM_MAX = 37,
65     SC_BC_SCALE_MAX = 38,
66     SC_BC_STRING_MAX = 39,
67     SC_COLL_WEIGHTS_MAX = 40,
68     SC_EXPR_NEST_MAX = 42,
69     SC_LINE_MAX = 43,
70     SC_RE_DUP_MAX = 44,
71     SC_2_VERSION = 46,
72     SC_2_C_BIND = 47,
73     SC_2_C_DEV = 48,
74     SC_2_FORT_DEV = 49,
75     SC_2_FORT_RUN = 50,
76     SC_2_SW_DEV = 51,
77     SC_2_LOCALEDEF = 52,
78     SC_IOV_MAX = 60,   //  same with _SC_UIO_MAXIOV in unix
79     SC_THREADS = 67,
80     SC_THREAD_SAFE_FUNCTIONS = 68,
81     SC_GETGR_R_SIZE_MAX = 69,
82     SC_GETPW_R_SIZE_MAX = 70,
83     SC_LOGIN_NAME_MAX = 71,
84     SC_TTY_NAME_MAX = 72,
85     SC_THREAD_DESTRUCTOR_ITERATIONS = 73,
86     SC_THREAD_KEYS_MAX = 74,
87     SC_THREAD_STACK_MIN = 75,
88     SC_THREAD_THREADS_MAX = 76,
89     SC_THREAD_ATTR_STACKADDR = 77,
90     SC_THREAD_ATTR_STACKSIZE = 78,
91     SC_THREAD_PRIORITY_SCHEDULING = 79,
92     SC_THREAD_PRIO_INHERIT = 80,
93     SC_THREAD_PRIO_PROTECT = 81,
94     SC_THREAD_PROCESS_SHARED = 82,
95     SC_NPROCESSORS_CONF = 83,
96     SC_NPROCESSORS_ONLN = 84,
97     SC_PHYS_PAGES = 85,
98     SC_AVPHYS_PAGES = 86,
99     SC_ATEXIT_MAX = 87,
100     SC_PASS_MAX = 88,
101     SC_XOPEN_VERSION = 89,
102     SC_XOPEN_XCU_VERSION = 90,
103     SC_XOPEN_UNIX = 91,
104     SC_XOPEN_CRYPT = 92,
105     SC_XOPEN_ENH_I18N = 93,
106     SC_XOPEN_SHM = 94,
107     SC_2_CHAR_TERM = 95,
108     SC_2_UPE = 97,
109     SC_XOPEN_XPG2 = 98,
110     SC_XOPEN_XPG3 = 99,
111     SC_XOPEN_XPG4 = 100,
112     SC_NZERO = 109,
113     SC_XBS5_ILP32_OFF32 = 125,
114     SC_XBS5_ILP32_OFFBIG = 126,
115     SC_XBS5_LP64_OFF64 = 127,
116     SC_XBS5_LPBIG_OFFBIG = 128,
117     SC_XOPEN_LEGACY = 129,
118     SC_XOPEN_REALTIME = 130,
119     SC_XOPEN_REALTIME_THREADS = 131,
120     SC_ADVISORY_INFO = 132,
121     SC_BARRIERS = 133,
122     SC_CLOCK_SELECTION = 137,
123     SC_CPUTIME = 138,
124     SC_THREAD_CPUTIME = 139,
125     SC_MONOTONIC_CLOCK = 149,
126     SC_READER_WRITER_LOCKS = 153,
127     SC_SPIN_LOCKS = 154,
128     SC_REGEXP = 155,
129     SC_SHELL = 157,
130     SC_SPAWN = 159,
131     SC_SPORADIC_SERVER = 160,
132     SC_THREAD_SPORADIC_SERVER = 161,
133     SC_TIMEOUTS = 164,
134     SC_TYPED_MEMORY_OBJECTS = 165,
135     SC_2_PBS = 168,
136     SC_2_PBS_ACCOUNTING = 169,
137     SC_2_PBS_LOCATE = 170,
138     SC_2_PBS_MESSAGE = 171,
139     SC_2_PBS_TRACK = 172,
140     SC_SYMLOOP_MAX = 173,
141     SC_STREAMS = 174,
142     SC_2_PBS_CHECKPOINT = 175,
143     SC_V6_ILP32_OFF32 = 176,
144     SC_V6_ILP32_OFFBIG = 177,
145     SC_V6_LP64_OFF64 = 178,
146     SC_V6_LPBIG_OFFBIG = 179,
147     SC_HOST_NAME_MAX = 180,
148     SC_TRACE = 181,
149     SC_TRACE_EVENT_FILTER = 182,
150     SC_TRACE_INHERIT = 183,
151     SC_TRACE_LOG = 184,
152     SC_IPV6 = 235,
153     SC_RAW_SOCKETS = 236,
154     SC_V7_ILP32_OFF32 = 237,
155     SC_V7_ILP32_OFFBIG = 238,
156     SC_V7_LP64_OFF64 = 239,
157     SC_V7_LPBIG_OFFBIG = 240,
158     SC_SS_REPL_MAX = 241,
159     SC_TRACE_EVENT_NAME_MAX = 242,
160     SC_TRACE_NAME_MAX = 243,
161     SC_TRACE_SYS_MAX = 244,
162     SC_TRACE_USER_EVENT_MAX = 245,
163     SC_XOPEN_STREAMS = 246,
164     SC_THREAD_ROBUST_PRIO_INHERIT = 247,
165     SC_THREAD_ROBUST_PRIO_PROTECT = 248
166 };
167 
168 enum class SYSArgMacOS : uint16_t {
169     SC_ARG_MAX = 1,
170     SC_CHILD_MAX = 2,
171     SC_CLK_TCK = 3,
172     SC_NGROUPS_MAX = 4,
173     SC_OPEN_MAX = 5,
174     SC_JOB_CONTROL = 6,
175     SC_SAVED_IDS = 7,
176     SC_VERSION = 8,
177     SC_BC_BASE_MAX = 9,
178     SC_BC_DIM_MAX = 10,
179     SC_BC_SCALE_MAX = 11,
180     SC_BC_STRING_MAX = 12,
181     SC_COLL_WEIGHTS_MAX = 13,
182     SC_EXPR_NEST_MAX = 14,
183     SC_LINE_MAX = 15,
184     SC_RE_DUP_MAX = 16,
185     SC_2_VERSION = 17,
186     SC_2_C_BIND = 18,
187     SC_2_C_DEV = 19,
188     SC_2_CHAR_TERM = 20,
189     SC_2_FORT_DEV = 21,
190     SC_2_FORT_RUN = 22,
191     SC_2_LOCALEDEF = 23,
192     SC_2_SW_DEV = 24,
193     SC_2_UPE = 25,
194     SC_STREAM_MAX = 26,
195     SC_TZNAME_MAX = 27,
196     SC_ASYNCHRONOUS_IO = 28,
197     SC_PAGESIZE = 29,   // same with _SC_PAGE_SIZE in mac platform
198     SC_MEMLOCK = 30,
199     SC_MEMLOCK_RANGE = 31,
200     SC_MEMORY_PROTECTION = 32,
201     SC_MESSAGE_PASSING = 33,
202     SC_PRIORITIZED_IO = 34,
203     SC_PRIORITY_SCHEDULING = 35,
204     SC_REALTIME_SIGNALS = 36,
205     SC_SEMAPHORES = 37,
206     SC_FSYNC = 38,
207     SC_SHARED_MEMORY_OBJECTS = 39,
208     SC_SYNCHRONIZED_IO = 40,
209     SC_TIMERS = 41,
210     SC_AIO_LISTIO_MAX = 42,
211     SC_AIO_MAX = 43,
212     SC_AIO_PRIO_DELTA_MAX = 44,
213     SC_DELAYTIMER_MAX = 45,
214     SC_MQ_OPEN_MAX = 46,
215     SC_MAPPED_FILES = 47,
216     SC_RTSIG_MAX = 48,
217     SC_SEM_NSEMS_MAX = 49,
218     SC_SEM_VALUE_MAX = 50,
219     SC_SIGQUEUE_MAX = 51,
220     SC_TIMER_MAX = 52,
221     SC_NPROCESSORS_CONF = 57,
222     SC_NPROCESSORS_ONLN = 58,
223     SC_2_PBS = 59,
224     SC_2_PBS_ACCOUNTING = 60,
225     SC_2_PBS_CHECKPOINT = 61,
226     SC_2_PBS_LOCATE = 62,
227     SC_2_PBS_MESSAGE = 63,
228     SC_2_PBS_TRACK = 64,
229     SC_ADVISORY_INFO = 65,
230     SC_BARRIERS = 66,
231     SC_CLOCK_SELECTION = 67,
232     SC_CPUTIME = 68,
233     SC_FILE_LOCKING = 69,
234     SC_GETGR_R_SIZE_MAX = 70,
235     SC_GETPW_R_SIZE_MAX = 71,
236     SC_HOST_NAME_MAX = 72,
237     SC_LOGIN_NAME_MAX = 73,
238     SC_MONOTONIC_CLOCK = 74,
239     SC_MQ_PRIO_MAX = 75,
240     SC_READER_WRITER_LOCKS = 76,
241     SC_REGEXP = 77,
242     SC_SHELL = 78,
243     SC_SPAWN = 79,
244     SC_SPIN_LOCKS = 80,
245     SC_SPORADIC_SERVER = 81,
246     SC_THREAD_ATTR_STACKADDR = 82,
247     SC_THREAD_ATTR_STACKSIZE = 83,
248     SC_THREAD_CPUTIME = 84,
249     SC_THREAD_DESTRUCTOR_ITERATIONS = 85,
250     SC_THREAD_KEYS_MAX = 86,
251     SC_THREAD_PRIO_INHERIT = 87,
252     SC_THREAD_PRIO_PROTECT = 88,
253     SC_THREAD_PRIORITY_SCHEDULING = 89,
254     SC_THREAD_PROCESS_SHARED = 90,
255     SC_THREAD_SAFE_FUNCTIONS = 91,
256     SC_THREAD_SPORADIC_SERVER = 92,
257     SC_THREAD_STACK_MIN = 93,
258     SC_THREAD_THREADS_MAX = 94,
259     SC_TIMEOUTS = 95,
260     SC_THREADS = 96,
261     SC_TRACE = 97,
262     SC_TRACE_EVENT_FILTER = 98,
263     SC_TRACE_INHERIT = 99,
264     SC_TRACE_LOG = 100,
265     SC_TTY_NAME_MAX = 101,
266     SC_TYPED_MEMORY_OBJECTS = 102,
267     SC_V6_ILP32_OFF32 = 103,
268     SC_V6_ILP32_OFFBIG = 104,
269     SC_V6_LP64_OFF64 = 105,
270     SC_V6_LPBIG_OFFBIG = 106,
271     SC_IPV6 = 118,
272     SC_RAW_SOCKETS = 119,
273     SC_SYMLOOP_MAX = 120,
274     SC_ATEXIT_MAX = 107,
275     SC_IOV_MAX = 56,
276     SC_XOPEN_CRYPT = 108,
277     SC_XOPEN_ENH_I18N = 109,
278     SC_XOPEN_LEGACY = 110,
279     SC_XOPEN_REALTIME = 111,
280     SC_XOPEN_REALTIME_THREADS = 112,
281     SC_XOPEN_SHM = 113,
282     SC_XOPEN_STREAMS = 114,
283     SC_XOPEN_UNIX = 115,
284     SC_XOPEN_VERSION = 116,
285     SC_XOPEN_XCU_VERSION = 121,
286     SC_XBS5_ILP32_OFF32 = 122,
287     SC_XBS5_ILP32_OFFBIG = 123,
288     SC_XBS5_LP64_OFF64 = 124,
289     SC_XBS5_LPBIG_OFFBIG = 125,
290     SC_SS_REPL_MAX = 126,
291     SC_TRACE_EVENT_NAME_MAX = 127,
292     SC_TRACE_NAME_MAX = 128,
293     SC_TRACE_SYS_MAX = 129,
294     SC_TRACE_USER_EVENT_MAX = 130,
295     SC_PASS_MAX = 131,
296     SC_PHYS_PAGES = 200
297 };
298 
299 std::map<SYSArgUnix, SYSArgMacOS> sysconfig_map = {
300     {SYSArgUnix::SC_ARG_MAX, SYSArgMacOS::SC_ARG_MAX},
301     {SYSArgUnix::SC_CHILD_MAX, SYSArgMacOS::SC_CHILD_MAX},
302     {SYSArgUnix::SC_CLK_TCK, SYSArgMacOS::SC_CLK_TCK},
303     {SYSArgUnix::SC_NGROUPS_MAX, SYSArgMacOS::SC_NGROUPS_MAX},
304     {SYSArgUnix::SC_OPEN_MAX, SYSArgMacOS::SC_OPEN_MAX},
305     {SYSArgUnix::SC_STREAM_MAX, SYSArgMacOS::SC_STREAM_MAX},
306     {SYSArgUnix::SC_TZNAME_MAX, SYSArgMacOS::SC_TZNAME_MAX},
307     {SYSArgUnix::SC_JOB_CONTROL, SYSArgMacOS::SC_JOB_CONTROL},
308     {SYSArgUnix::SC_SAVED_IDS, SYSArgMacOS::SC_SAVED_IDS},
309     {SYSArgUnix::SC_REALTIME_SIGNALS, SYSArgMacOS::SC_REALTIME_SIGNALS},
310     {SYSArgUnix::SC_PRIORITY_SCHEDULING, SYSArgMacOS::SC_PRIORITY_SCHEDULING},
311     {SYSArgUnix::SC_TIMERS, SYSArgMacOS::SC_TIMERS},
312     {SYSArgUnix::SC_ASYNCHRONOUS_IO, SYSArgMacOS::SC_ASYNCHRONOUS_IO},
313     {SYSArgUnix::SC_PRIORITIZED_IO, SYSArgMacOS::SC_PRIORITIZED_IO},
314     {SYSArgUnix::SC_SYNCHRONIZED_IO, SYSArgMacOS::SC_SYNCHRONIZED_IO},
315     {SYSArgUnix::SC_FSYNC, SYSArgMacOS::SC_FSYNC},
316     {SYSArgUnix::SC_MAPPED_FILES, SYSArgMacOS::SC_MAPPED_FILES},
317     {SYSArgUnix::SC_MEMLOCK, SYSArgMacOS::SC_MEMLOCK},
318     {SYSArgUnix::SC_MEMLOCK_RANGE, SYSArgMacOS::SC_MEMLOCK_RANGE},
319     {SYSArgUnix::SC_MEMORY_PROTECTION, SYSArgMacOS::SC_MEMORY_PROTECTION},
320     {SYSArgUnix::SC_MESSAGE_PASSING, SYSArgMacOS::SC_MESSAGE_PASSING},
321     {SYSArgUnix::SC_SEMAPHORES, SYSArgMacOS::SC_SEMAPHORES},
322     {SYSArgUnix::SC_SHARED_MEMORY_OBJECTS, SYSArgMacOS::SC_SHARED_MEMORY_OBJECTS},
323     {SYSArgUnix::SC_AIO_LISTIO_MAX, SYSArgMacOS::SC_AIO_LISTIO_MAX},
324     {SYSArgUnix::SC_AIO_MAX, SYSArgMacOS::SC_AIO_MAX},
325     {SYSArgUnix::SC_AIO_PRIO_DELTA_MAX, SYSArgMacOS::SC_AIO_PRIO_DELTA_MAX},
326     {SYSArgUnix::SC_DELAYTIMER_MAX, SYSArgMacOS::SC_DELAYTIMER_MAX},
327     {SYSArgUnix::SC_MQ_OPEN_MAX, SYSArgMacOS::SC_MQ_OPEN_MAX},
328     {SYSArgUnix::SC_MQ_PRIO_MAX, SYSArgMacOS::SC_MQ_PRIO_MAX},
329     {SYSArgUnix::SC_VERSION, SYSArgMacOS::SC_VERSION},
330     {SYSArgUnix::SC_PAGESIZE, SYSArgMacOS::SC_PAGESIZE},
331     {SYSArgUnix::SC_RTSIG_MAX, SYSArgMacOS::SC_RTSIG_MAX},
332     {SYSArgUnix::SC_SEM_NSEMS_MAX, SYSArgMacOS::SC_SEM_NSEMS_MAX},
333     {SYSArgUnix::SC_SEM_VALUE_MAX, SYSArgMacOS::SC_SEM_VALUE_MAX},
334     {SYSArgUnix::SC_SIGQUEUE_MAX, SYSArgMacOS::SC_SIGQUEUE_MAX},
335     {SYSArgUnix::SC_TIMER_MAX, SYSArgMacOS::SC_TIMER_MAX},
336     {SYSArgUnix::SC_BC_BASE_MAX, SYSArgMacOS::SC_BC_BASE_MAX},
337     {SYSArgUnix::SC_BC_DIM_MAX, SYSArgMacOS::SC_BC_DIM_MAX},
338     {SYSArgUnix::SC_BC_SCALE_MAX, SYSArgMacOS::SC_BC_SCALE_MAX},
339     {SYSArgUnix::SC_BC_STRING_MAX, SYSArgMacOS::SC_BC_STRING_MAX},
340     {SYSArgUnix::SC_COLL_WEIGHTS_MAX, SYSArgMacOS::SC_COLL_WEIGHTS_MAX},
341     {SYSArgUnix::SC_EXPR_NEST_MAX, SYSArgMacOS::SC_EXPR_NEST_MAX},
342     {SYSArgUnix::SC_LINE_MAX, SYSArgMacOS::SC_LINE_MAX},
343     {SYSArgUnix::SC_RE_DUP_MAX, SYSArgMacOS::SC_RE_DUP_MAX},
344     {SYSArgUnix::SC_2_VERSION, SYSArgMacOS::SC_2_VERSION},
345     {SYSArgUnix::SC_2_C_BIND, SYSArgMacOS::SC_2_C_BIND},
346     {SYSArgUnix::SC_2_C_DEV, SYSArgMacOS::SC_2_C_DEV},
347     {SYSArgUnix::SC_2_FORT_DEV, SYSArgMacOS::SC_2_FORT_DEV},
348     {SYSArgUnix::SC_2_FORT_RUN, SYSArgMacOS::SC_2_FORT_RUN},
349     {SYSArgUnix::SC_2_SW_DEV, SYSArgMacOS::SC_2_SW_DEV},
350     {SYSArgUnix::SC_2_LOCALEDEF, SYSArgMacOS::SC_2_LOCALEDEF},
351     {SYSArgUnix::SC_IOV_MAX, SYSArgMacOS::SC_IOV_MAX},
352     {SYSArgUnix::SC_THREADS, SYSArgMacOS::SC_THREADS},
353     {SYSArgUnix::SC_THREAD_SAFE_FUNCTIONS, SYSArgMacOS::SC_THREAD_SAFE_FUNCTIONS},
354     {SYSArgUnix::SC_GETGR_R_SIZE_MAX, SYSArgMacOS::SC_GETGR_R_SIZE_MAX},
355     {SYSArgUnix::SC_GETPW_R_SIZE_MAX, SYSArgMacOS::SC_GETPW_R_SIZE_MAX},
356     {SYSArgUnix::SC_LOGIN_NAME_MAX, SYSArgMacOS::SC_LOGIN_NAME_MAX},
357     {SYSArgUnix::SC_TTY_NAME_MAX, SYSArgMacOS::SC_TTY_NAME_MAX},
358     {SYSArgUnix::SC_THREAD_DESTRUCTOR_ITERATIONS, SYSArgMacOS::SC_THREAD_DESTRUCTOR_ITERATIONS},
359     {SYSArgUnix::SC_THREAD_KEYS_MAX, SYSArgMacOS::SC_THREAD_KEYS_MAX},
360     {SYSArgUnix::SC_THREAD_STACK_MIN, SYSArgMacOS::SC_THREAD_STACK_MIN},
361     {SYSArgUnix::SC_THREAD_THREADS_MAX, SYSArgMacOS::SC_THREAD_THREADS_MAX},
362     {SYSArgUnix::SC_THREAD_ATTR_STACKADDR, SYSArgMacOS::SC_THREAD_ATTR_STACKADDR},
363     {SYSArgUnix::SC_THREAD_ATTR_STACKSIZE, SYSArgMacOS::SC_THREAD_ATTR_STACKSIZE},
364     {SYSArgUnix::SC_THREAD_PRIORITY_SCHEDULING, SYSArgMacOS::SC_THREAD_PRIORITY_SCHEDULING},
365     {SYSArgUnix::SC_THREAD_PRIO_INHERIT, SYSArgMacOS::SC_THREAD_PRIO_INHERIT},
366     {SYSArgUnix::SC_THREAD_PRIO_PROTECT, SYSArgMacOS::SC_THREAD_PRIO_PROTECT},
367     {SYSArgUnix::SC_THREAD_PROCESS_SHARED, SYSArgMacOS::SC_THREAD_PROCESS_SHARED},
368     {SYSArgUnix::SC_NPROCESSORS_CONF, SYSArgMacOS::SC_NPROCESSORS_CONF},
369     {SYSArgUnix::SC_NPROCESSORS_ONLN, SYSArgMacOS::SC_NPROCESSORS_ONLN},
370     {SYSArgUnix::SC_PHYS_PAGES, SYSArgMacOS::SC_PHYS_PAGES},
371     {SYSArgUnix::SC_ATEXIT_MAX, SYSArgMacOS::SC_ATEXIT_MAX},
372     {SYSArgUnix::SC_PASS_MAX, SYSArgMacOS::SC_PASS_MAX},
373     {SYSArgUnix::SC_XOPEN_VERSION, SYSArgMacOS::SC_XOPEN_VERSION},
374     {SYSArgUnix::SC_XOPEN_XCU_VERSION, SYSArgMacOS::SC_XOPEN_XCU_VERSION},
375     {SYSArgUnix::SC_XOPEN_UNIX, SYSArgMacOS::SC_XOPEN_UNIX},
376     {SYSArgUnix::SC_XOPEN_CRYPT, SYSArgMacOS::SC_XOPEN_CRYPT},
377     {SYSArgUnix::SC_XOPEN_ENH_I18N, SYSArgMacOS::SC_XOPEN_ENH_I18N},
378     {SYSArgUnix::SC_XOPEN_SHM, SYSArgMacOS::SC_XOPEN_SHM},
379     {SYSArgUnix::SC_2_CHAR_TERM, SYSArgMacOS::SC_2_CHAR_TERM},
380     {SYSArgUnix::SC_2_UPE, SYSArgMacOS::SC_2_UPE},
381     {SYSArgUnix::SC_XBS5_ILP32_OFF32, SYSArgMacOS::SC_XBS5_ILP32_OFF32},
382     {SYSArgUnix::SC_XBS5_ILP32_OFFBIG, SYSArgMacOS::SC_XBS5_ILP32_OFFBIG},
383     {SYSArgUnix::SC_XBS5_LP64_OFF64, SYSArgMacOS::SC_XBS5_LP64_OFF64},
384     {SYSArgUnix::SC_XBS5_LPBIG_OFFBIG, SYSArgMacOS::SC_XBS5_LPBIG_OFFBIG},
385     {SYSArgUnix::SC_XOPEN_LEGACY, SYSArgMacOS::SC_XOPEN_LEGACY},
386     {SYSArgUnix::SC_XOPEN_REALTIME, SYSArgMacOS::SC_XOPEN_REALTIME},
387     {SYSArgUnix::SC_XOPEN_REALTIME_THREADS, SYSArgMacOS::SC_XOPEN_REALTIME_THREADS},
388     {SYSArgUnix::SC_ADVISORY_INFO, SYSArgMacOS::SC_ADVISORY_INFO},
389     {SYSArgUnix::SC_BARRIERS, SYSArgMacOS::SC_BARRIERS},
390     {SYSArgUnix::SC_CLOCK_SELECTION, SYSArgMacOS::SC_CLOCK_SELECTION},
391     {SYSArgUnix::SC_CPUTIME, SYSArgMacOS::SC_CPUTIME},
392     {SYSArgUnix::SC_THREAD_CPUTIME, SYSArgMacOS::SC_THREAD_CPUTIME},
393     {SYSArgUnix::SC_MONOTONIC_CLOCK, SYSArgMacOS::SC_MONOTONIC_CLOCK},
394     {SYSArgUnix::SC_READER_WRITER_LOCKS, SYSArgMacOS::SC_READER_WRITER_LOCKS},
395     {SYSArgUnix::SC_SPIN_LOCKS, SYSArgMacOS::SC_SPIN_LOCKS},
396     {SYSArgUnix::SC_REGEXP, SYSArgMacOS::SC_REGEXP},
397     {SYSArgUnix::SC_SHELL, SYSArgMacOS::SC_SHELL},
398     {SYSArgUnix::SC_SPAWN, SYSArgMacOS::SC_SPAWN},
399     {SYSArgUnix::SC_SPORADIC_SERVER, SYSArgMacOS::SC_SPORADIC_SERVER},
400     {SYSArgUnix::SC_THREAD_SPORADIC_SERVER, SYSArgMacOS::SC_THREAD_SPORADIC_SERVER},
401     {SYSArgUnix::SC_TIMEOUTS, SYSArgMacOS::SC_TIMEOUTS},
402     {SYSArgUnix::SC_TYPED_MEMORY_OBJECTS, SYSArgMacOS::SC_TYPED_MEMORY_OBJECTS},
403     {SYSArgUnix::SC_2_PBS, SYSArgMacOS::SC_2_PBS},
404     {SYSArgUnix::SC_2_PBS_ACCOUNTING, SYSArgMacOS::SC_2_PBS_ACCOUNTING},
405     {SYSArgUnix::SC_2_PBS_LOCATE, SYSArgMacOS::SC_2_PBS_LOCATE},
406     {SYSArgUnix::SC_2_PBS_MESSAGE, SYSArgMacOS::SC_2_PBS_MESSAGE},
407     {SYSArgUnix::SC_2_PBS_TRACK, SYSArgMacOS::SC_2_PBS_TRACK},
408     {SYSArgUnix::SC_SYMLOOP_MAX, SYSArgMacOS::SC_SYMLOOP_MAX},
409     {SYSArgUnix::SC_2_PBS_CHECKPOINT, SYSArgMacOS::SC_2_PBS_CHECKPOINT},
410     {SYSArgUnix::SC_V6_ILP32_OFF32, SYSArgMacOS::SC_V6_ILP32_OFF32},
411     {SYSArgUnix::SC_V6_ILP32_OFFBIG, SYSArgMacOS::SC_V6_ILP32_OFFBIG},
412     {SYSArgUnix::SC_V6_LP64_OFF64, SYSArgMacOS::SC_V6_LP64_OFF64},
413     {SYSArgUnix::SC_V6_LPBIG_OFFBIG, SYSArgMacOS::SC_V6_LPBIG_OFFBIG},
414     {SYSArgUnix::SC_HOST_NAME_MAX, SYSArgMacOS::SC_HOST_NAME_MAX},
415     {SYSArgUnix::SC_TRACE, SYSArgMacOS::SC_TRACE},
416     {SYSArgUnix::SC_TRACE_EVENT_FILTER, SYSArgMacOS::SC_TRACE_EVENT_FILTER},
417     {SYSArgUnix::SC_TRACE_INHERIT, SYSArgMacOS::SC_TRACE_INHERIT},
418     {SYSArgUnix::SC_TRACE_LOG, SYSArgMacOS::SC_TRACE_LOG},
419     {SYSArgUnix::SC_IPV6, SYSArgMacOS::SC_IPV6},
420     {SYSArgUnix::SC_RAW_SOCKETS, SYSArgMacOS::SC_RAW_SOCKETS},
421     {SYSArgUnix::SC_SS_REPL_MAX, SYSArgMacOS::SC_SS_REPL_MAX},
422     {SYSArgUnix::SC_TRACE_EVENT_NAME_MAX, SYSArgMacOS::SC_TRACE_EVENT_NAME_MAX},
423     {SYSArgUnix::SC_TRACE_NAME_MAX, SYSArgMacOS::SC_TRACE_NAME_MAX},
424     {SYSArgUnix::SC_TRACE_SYS_MAX, SYSArgMacOS::SC_TRACE_SYS_MAX},
425     {SYSArgUnix::SC_TRACE_USER_EVENT_MAX, SYSArgMacOS::SC_TRACE_USER_EVENT_MAX},
426     {SYSArgUnix::SC_XOPEN_STREAMS, SYSArgMacOS::SC_XOPEN_STREAMS},
427 };
428 
ProcessExit(int signal)429 void ProcessExit(int signal)
430 {
431     exit(signal);
432 }
433 
GetSysConfig(int number)434 int GetSysConfig(int number)
435 {
436     SYSArgUnix unixSysconf = static_cast<SYSArgUnix>(number);
437     if (unixSysconf == SYSArgUnix::SC_ARG_MAX) {
438         return MACOS_ARG_MAX;
439     }
440     uint16_t index = static_cast<uint16_t>(sysconfig_map[unixSysconf]);
441     auto configinfo = static_cast<int32_t>(sysconf(index));
442     if (configinfo < 0) {
443         HILOG_ERROR("Unable to find this system configuration on MAC platform:[unix]%d", unixSysconf);
444         return MACOS_NOT_EXIST;
445     }
446     return configinfo;
447 }
448 
GetSysTimer()449 double GetSysTimer()
450 {
451     struct timeval boottime;
452     struct timeval now;
453     struct timezone tz;
454     int mib[2] = { CTL_KERN, KERN_BOOTTIME };
455     size_t size = sizeof(boottime);
456     gettimeofday(&now, &tz);
457     double systimer = -1;
458 #define MIB_SIZE 2
459 #define MICROSECONDS_OF_SECOND (1000.0*1000.0)
460     if (sysctl(mib, MIB_SIZE, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) {
461         systimer = now.tv_sec - boottime.tv_sec;
462         systimer += (double)(now.tv_usec - boottime.tv_usec) / MICROSECONDS_OF_SECOND;
463     }
464     return systimer;
465 }
466 
GetThreadId()467 int GetThreadId()
468 {
469     uint64_t proTid;
470     pthread_threadid_np(0, &proTid);
471     return proTid;
472 }
473 
GetThreadPRY(int tid)474 int GetThreadPRY(int tid)
475 {
476     int32_t pri = getpriority(PRIO_DARWIN_THREAD, 0);   // 0: current thread
477     return pri;
478 }
479 
GetProcessStartRealtime()480 double GetProcessStartRealtime()
481 {
482     int pid = getpid();
483     struct kinfo_proc info;
484     size_t size = sizeof(info);
485     int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
486 
487     int ret = sysctl(mib, sizeof(mib)/sizeof(*mib), &info, &size, NULL, 0);
488     if (ret == 0) {
489         double tvSec = info.kp_proc.p_un.__p_starttime.tv_sec;
490         double tvUsec = info.kp_proc.p_un.__p_starttime.tv_usec;
491         return tvSec * 1000.0 + tvUsec / 1000.0; // 1000.0 : Calculate milliseconds
492     }
493     return 0;
494 }
495 } // namespace Commonlibrary::Platform