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
21namespace Commonlibrary::Platform {
22
23#define MACOS_ARG_MAX 4096
24#define MACOS_NOT_EXIST (-1)
25
26enum 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
168enum 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
299std::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
429void ProcessExit(int signal)
430{
431    exit(signal);
432}
433
434int 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
449double 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
467int GetThreadId()
468{
469    uint64_t proTid;
470    pthread_threadid_np(0, &proTid);
471    return proTid;
472}
473
474int GetThreadPRY(int tid)
475{
476    int32_t pri = getpriority(PRIO_DARWIN_THREAD, 0);   // 0: current thread
477    return pri;
478}
479
480double 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