1 /*
2 * Copyright (c) 2021 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 #include "hiperf_client_napi.h"
16 #include <cstdio>
17 #include <string>
18 #include "hiperf_hilog.h"
19 #include "hiperf_client.h"
20 #include "napi/native_api.h"
21 #include "napi/native_node_api.h"
22
23 namespace OHOS {
24 namespace Developtools {
25 namespace HiPerf {
26 namespace HiperfClient {
27 static std::unique_ptr<HiperfClient::Client> g_hiperfClient =
28 std::make_unique<HiperfClient::Client>();
29
30 static std::unique_ptr<HiperfClient::RecordOption> g_hiperfRecordOption =
31 std::make_unique<HiperfClient::RecordOption>();
32
StringSplit(std::string source, const std::string &split = �)33 static std::vector<std::string> StringSplit(std::string source, const std::string &split = ",")
34 {
35 size_t pos = 0;
36 std::vector<std::string> result;
37
38 // find
39 while ((pos = source.find(split)) != std::string::npos) {
40 // split
41 std::string token = source.substr(0, pos);
42 if (!token.empty()) {
43 result.push_back(token);
44 }
45 source.erase(0, pos + split.length());
46 }
47 // add last token
48 if (!source.empty()) {
49 result.push_back(source);
50 }
51 return result;
52 }
53
StringSplitToInt(std::string source, const std::string &split = �)54 static std::vector<int> StringSplitToInt(std::string source, const std::string &split = ",")
55 {
56 size_t pos = 0;
57 std::vector<int> result;
58
59 // find
60 while ((pos = source.find(split)) != std::string::npos) {
61 // split
62 std::string token = source.substr(0, pos);
63 if (!token.empty()) {
64 result.push_back(std::stoi(token));
65 }
66 source.erase(0, pos + split.length());
67 }
68 // add last token
69 if (!source.empty()) {
70 result.push_back(std::stoi(source));
71 }
72 return result;
73 }
74
GetJsStringFromOption(const napi_env &env, const napi_callback_info &info)75 static std::string GetJsStringFromOption(const napi_env &env, const napi_callback_info &info)
76 {
77 size_t argc = 1;
78 napi_value args[1] = {0};
79 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr), "");
80 NAPI_ASSERT_BASE(env, argc == 1, "requires 1 parameter", "");
81
82 napi_valuetype inputType = napi_undefined;
83 napi_typeof(env, args[0], &inputType);
84 NAPI_ASSERT_BASE(env, inputType == napi_string, "type mismatch for parameter path", "");
85
86 char value[PATH_MAX] = {0};
87 size_t valueLen = 0;
88 napi_get_value_string_utf8(env, args[0], value, sizeof(value), &valueLen);
89 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}s", value);
90 return std::string(value);
91 }
92
GetBoolFromOption(const napi_env &env, const napi_callback_info &info)93 static bool GetBoolFromOption(const napi_env &env, const napi_callback_info &info)
94 {
95 size_t argc = 1;
96 napi_value args[1] = {0};
97 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr), false);
98 NAPI_ASSERT_BASE(env, argc == 1, "requires 1 parameter", false);
99
100 napi_valuetype inputType = napi_undefined;
101 napi_typeof(env, args[0], &inputType);
102 NAPI_ASSERT_BASE(env, (inputType == napi_boolean), "type mismatch for parameter path", false);
103
104 bool result = false;
105 napi_get_value_bool(env, args[0], &result);
106 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
107 return result;
108 }
109
GetUintFromOption(const napi_env &env, const napi_callback_info &info)110 static uint32_t GetUintFromOption(const napi_env &env, const napi_callback_info &info)
111 {
112 size_t argc = 1;
113 napi_value args[1] = {0};
114 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr), 0);
115 NAPI_ASSERT_BASE(env, argc == 1, "requires 1 parameter", 0);
116
117 napi_valuetype inputType = napi_undefined;
118 napi_typeof(env, args[0], &inputType);
119 NAPI_ASSERT_BASE(env, (inputType == napi_number), "type mismatch for parameter path", false);
120
121 uint32_t result = 0;
122 napi_get_value_uint32(env, args[0], &result);
123 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
124 return result;
125 }
126
ResetOption(napi_env env, napi_callback_info info)127 static napi_value ResetOption(napi_env env, napi_callback_info info)
128 {
129 napi_value napiValue = nullptr;
130 bool result = true;
131 g_hiperfRecordOption = std::make_unique<HiperfClient::RecordOption>();
132
133 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
134 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
135 return napiValue;
136 }
137
SetOutputFilename(napi_env env, napi_callback_info info)138 static napi_value SetOutputFilename(napi_env env, napi_callback_info info)
139 {
140 napi_value napiValue = nullptr;
141 bool result = true;
142 const std::string option = GetJsStringFromOption(env, info);
143 g_hiperfRecordOption->SetOutputFilename(option);
144
145 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
146 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
147 return napiValue;
148 }
149
GetOutputFileName(napi_env env, napi_callback_info info)150 static napi_value GetOutputFileName(napi_env env, napi_callback_info info)
151 {
152 napi_value napiValue = nullptr;
153 std::string result = g_hiperfRecordOption->GetOutputFileName();
154 NAPI_CALL(env, napi_create_string_utf8(env, result.c_str(), result.size(), &napiValue));
155
156 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}s", result.c_str());
157 return napiValue;
158 }
159
SetTargetSystemWide(napi_env env, napi_callback_info info)160 static napi_value SetTargetSystemWide(napi_env env, napi_callback_info info)
161 {
162 napi_value napiValue = nullptr;
163 bool result = true;
164 bool enable = GetBoolFromOption(env, info);
165 g_hiperfRecordOption->SetTargetSystemWide(enable);
166
167 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
168 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
169 return napiValue;
170 }
171
SetCompressData(napi_env env, napi_callback_info info)172 static napi_value SetCompressData(napi_env env, napi_callback_info info)
173 {
174 napi_value napiValue = nullptr;
175 bool result = true;
176 bool enable = GetBoolFromOption(env, info);
177 g_hiperfRecordOption->SetCompressData(enable);
178
179 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
180 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
181 return napiValue;
182 }
183
SetSelectCpus(napi_env env, napi_callback_info info)184 static napi_value SetSelectCpus(napi_env env, napi_callback_info info)
185 {
186 napi_value napiValue = nullptr;
187 bool result = true;
188 std::string option = GetJsStringFromOption(env, info);
189 g_hiperfRecordOption->SetSelectCpus(StringSplitToInt(option));
190
191 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
192 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
193 return napiValue;
194 }
195
SetTimeStopSec(napi_env env, napi_callback_info info)196 static napi_value SetTimeStopSec(napi_env env, napi_callback_info info)
197 {
198 napi_value napiValue = nullptr;
199 bool result = true;
200 uint32_t option = GetUintFromOption(env, info);
201 g_hiperfRecordOption->SetTimeStopSec(option);
202
203 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
204 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
205 return napiValue;
206 }
207
SetFrequency(napi_env env, napi_callback_info info)208 static napi_value SetFrequency(napi_env env, napi_callback_info info)
209 {
210 napi_value napiValue = nullptr;
211 bool result = true;
212 uint32_t option = GetUintFromOption(env, info);
213 g_hiperfRecordOption->SetFrequency(option);
214
215 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
216 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
217 return napiValue;
218 }
219
SetPeriod(napi_env env, napi_callback_info info)220 static napi_value SetPeriod(napi_env env, napi_callback_info info)
221 {
222 napi_value napiValue = nullptr;
223 bool result = true;
224 uint32_t option = GetUintFromOption(env, info);
225 g_hiperfRecordOption->SetPeriod(option);
226
227 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
228 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
229 return napiValue;
230 }
231
SetSelectEvents(napi_env env, napi_callback_info info)232 static napi_value SetSelectEvents(napi_env env, napi_callback_info info)
233 {
234 napi_value napiValue = nullptr;
235 bool result = true;
236 std::string option = GetJsStringFromOption(env, info);
237 g_hiperfRecordOption->SetSelectEvents(StringSplit(option));
238
239 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
240 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
241 return napiValue;
242 }
SetSelectGroups(napi_env env, napi_callback_info info)243 static napi_value SetSelectGroups(napi_env env, napi_callback_info info)
244 {
245 napi_value napiValue = nullptr;
246 bool result = true;
247 std::string option = GetJsStringFromOption(env, info);
248 g_hiperfRecordOption->SetSelectGroups(StringSplit(option));
249
250 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
251 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
252 return napiValue;
253 }
SetNoInherit(napi_env env, napi_callback_info info)254 static napi_value SetNoInherit(napi_env env, napi_callback_info info)
255 {
256 napi_value napiValue = nullptr;
257 bool result = true;
258 bool enable = GetBoolFromOption(env, info);
259 g_hiperfRecordOption->SetNoInherit(enable);
260
261 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
262 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
263 return napiValue;
264 }
SetSelectPids(napi_env env, napi_callback_info info)265 static napi_value SetSelectPids(napi_env env, napi_callback_info info)
266 {
267 napi_value napiValue = nullptr;
268 bool result = true;
269 std::string option = GetJsStringFromOption(env, info);
270 g_hiperfRecordOption->SetSelectPids(StringSplitToInt(option));
271
272 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
273 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
274 return napiValue;
275 };
SetCallStackSamplingConfigs(napi_env env, napi_callback_info info)276 static napi_value SetCallStackSamplingConfigs(napi_env env, napi_callback_info info)
277 {
278 napi_value napiValue = nullptr;
279 bool result = true;
280 uint32_t option = GetUintFromOption(env, info);
281 g_hiperfRecordOption->SetCallStackSamplingConfigs(option);
282
283 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
284 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
285 return napiValue;
286 }
287
SetSelectTids(napi_env env, napi_callback_info info)288 static napi_value SetSelectTids(napi_env env, napi_callback_info info)
289 {
290 napi_value napiValue = nullptr;
291 bool result = true;
292 std::string option = GetJsStringFromOption(env, info);
293 g_hiperfRecordOption->SetSelectTids(StringSplitToInt(option));
294
295 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
296 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
297 return napiValue;
298 }
299
SetExcludePerf(napi_env env, napi_callback_info info)300 static napi_value SetExcludePerf(napi_env env, napi_callback_info info)
301 {
302 napi_value napiValue = nullptr;
303 bool result = true;
304 bool enable = GetBoolFromOption(env, info);
305 g_hiperfRecordOption->SetExcludePerf(enable);
306
307 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
308 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
309 return napiValue;
310 }
311
SetCpuPercent(napi_env env, napi_callback_info info)312 static napi_value SetCpuPercent(napi_env env, napi_callback_info info)
313 {
314 napi_value napiValue = nullptr;
315 bool result = true;
316 uint32_t option = GetUintFromOption(env, info);
317 g_hiperfRecordOption->SetCpuPercent(option);
318
319 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
320 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
321 return napiValue;
322 }
323
SetOffCPU(napi_env env, napi_callback_info info)324 static napi_value SetOffCPU(napi_env env, napi_callback_info info)
325 {
326 napi_value napiValue = nullptr;
327 bool result = true;
328 bool enable = GetBoolFromOption(env, info);
329 g_hiperfRecordOption->SetOffCPU(enable);
330
331 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
332 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
333 return napiValue;
334 }
335
SetCallGraph(napi_env env, napi_callback_info info)336 static napi_value SetCallGraph(napi_env env, napi_callback_info info)
337 {
338 napi_value napiValue = nullptr;
339 bool result = true;
340 std::string option = GetJsStringFromOption(env, info);
341 g_hiperfRecordOption->SetCallGraph((option));
342
343 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
344 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
345 return napiValue;
346 }
347
SetDelayUnwind(napi_env env, napi_callback_info info)348 static napi_value SetDelayUnwind(napi_env env, napi_callback_info info)
349 {
350 napi_value napiValue = nullptr;
351 bool result = true;
352 bool enable = GetBoolFromOption(env, info);
353 g_hiperfRecordOption->SetDelayUnwind(enable);
354
355 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
356 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
357 return napiValue;
358 }
359
SetDisableUnwind(napi_env env, napi_callback_info info)360 static napi_value SetDisableUnwind(napi_env env, napi_callback_info info)
361 {
362 napi_value napiValue = nullptr;
363 bool result = true;
364 bool enable = GetBoolFromOption(env, info);
365 g_hiperfRecordOption->SetDisableUnwind(enable);
366
367 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
368 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
369 return napiValue;
370 }
371
SetDisableCallstackMerge(napi_env env, napi_callback_info info)372 static napi_value SetDisableCallstackMerge(napi_env env, napi_callback_info info)
373 {
374 napi_value napiValue = nullptr;
375 bool result = true;
376 bool enable = GetBoolFromOption(env, info);
377 g_hiperfRecordOption->SetDisableCallstackMerge(enable);
378
379 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
380 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
381 return napiValue;
382 }
383
SetSymbolDir(napi_env env, napi_callback_info info)384 static napi_value SetSymbolDir(napi_env env, napi_callback_info info)
385 {
386 napi_value napiValue = nullptr;
387 bool result = true;
388 std::string option = GetJsStringFromOption(env, info);
389 g_hiperfRecordOption->SetSymbolDir(option);
390
391 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
392 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
393 return napiValue;
394 }
395
SetDataLimit(napi_env env, napi_callback_info info)396 static napi_value SetDataLimit(napi_env env, napi_callback_info info)
397 {
398 napi_value napiValue = nullptr;
399 bool result = true;
400 std::string option = GetJsStringFromOption(env, info);
401 g_hiperfRecordOption->SetDataLimit(option);
402
403 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
404 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
405 return napiValue;
406 }
407
SetAppPackage(napi_env env, napi_callback_info info)408 static napi_value SetAppPackage(napi_env env, napi_callback_info info)
409 {
410 napi_value napiValue = nullptr;
411 bool result = true;
412 std::string option = GetJsStringFromOption(env, info);
413 g_hiperfRecordOption->SetAppPackage(option);
414
415 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
416 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
417 return napiValue;
418 }
419
SetClockId(napi_env env, napi_callback_info info)420 static napi_value SetClockId(napi_env env, napi_callback_info info)
421 {
422 napi_value napiValue = nullptr;
423 bool result = true;
424 std::string option = GetJsStringFromOption(env, info);
425 g_hiperfRecordOption->SetClockId(option);
426
427 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
428 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
429 return napiValue;
430 }
431
SetVecBranchSampleTypes(napi_env env, napi_callback_info info)432 static napi_value SetVecBranchSampleTypes(napi_env env, napi_callback_info info)
433 {
434 napi_value napiValue = nullptr;
435 bool result = true;
436 std::string option = GetJsStringFromOption(env, info);
437 g_hiperfRecordOption->SetVecBranchSampleTypes(StringSplit(option));
438
439 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
440 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
441 return napiValue;
442 }
443
SetMmapPages(napi_env env, napi_callback_info info)444 static napi_value SetMmapPages(napi_env env, napi_callback_info info)
445 {
446 napi_value napiValue = nullptr;
447 bool result = true;
448 uint32_t option = GetUintFromOption(env, info);
449 g_hiperfRecordOption->SetMmapPages(option);
450
451 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
452 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
453 return napiValue;
454 }
455
GetOptionVecString(napi_env env, napi_callback_info info)456 static napi_value GetOptionVecString(napi_env env, napi_callback_info info)
457 {
458 napi_value napiValue = nullptr;
459 const std::vector<std::string> items = g_hiperfRecordOption->GetOptionVecString();
460 std::string result;
461 const std::string split = ",";
462 for (auto item : items) {
463 if (!result.empty())
464 result.append(split);
465 result.append(item);
466 }
467 if (result.empty()) {
468 result.append("<empty>");
469 }
470
471 NAPI_CALL(env, napi_create_string_utf8(env, result.c_str(), result.size(), &napiValue));
472
473 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}s", result.c_str());
474 return napiValue;
475 }
476
StartWithOption(napi_env env, napi_callback_info info)477 static napi_value StartWithOption(napi_env env, napi_callback_info info)
478 {
479 napi_value napiValue = nullptr;
480
481 // for js api , we always use hilog
482 g_hiperfClient->EnableHilog();
483
484 bool result = g_hiperfClient->Setup(g_hiperfRecordOption->GetOutputFileName());
485 if (result) {
486 const HiperfClient::RecordOption *option = g_hiperfRecordOption.get();
487 result = g_hiperfClient->Start(*option);
488 }
489 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
490 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
491 return napiValue;
492 }
493
Start(napi_env env, napi_callback_info info)494 static napi_value Start(napi_env env, napi_callback_info info)
495 {
496 napi_value napiValue = nullptr;
497
498 // for js api , we always use hilog
499 g_hiperfClient->EnableHilog();
500
501 bool result = g_hiperfClient->Start();
502
503 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
504 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
505 return napiValue;
506 }
507
Setup(napi_env env, napi_callback_info info)508 static napi_value Setup(napi_env env, napi_callback_info info)
509 {
510 napi_value napiValue = nullptr;
511
512 std::string outputPath = GetJsStringFromOption(env, info);
513
514 // for js api , we always use hilog
515 g_hiperfClient->EnableHilog();
516 bool result = g_hiperfClient->Setup(outputPath);
517
518 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
519 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
520 return napiValue;
521 }
522
IsReady(napi_env env, napi_callback_info info)523 static napi_value IsReady(napi_env env, napi_callback_info info)
524 {
525 napi_value napiValue = nullptr;
526 bool result = g_hiperfClient->IsReady();
527
528 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
529
530 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
531 return napiValue;
532 }
533
Stop(napi_env env, napi_callback_info info)534 static napi_value Stop(napi_env env, napi_callback_info info)
535 {
536 napi_value napiValue = nullptr;
537 bool result = g_hiperfClient->Stop();
538
539 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
540
541 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
542 return napiValue;
543 }
544
Pause(napi_env env, napi_callback_info info)545 static napi_value Pause(napi_env env, napi_callback_info info)
546 {
547 napi_value napiValue = nullptr;
548 bool result = g_hiperfClient->Pause();
549
550 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
551
552 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
553 return napiValue;
554 }
555
Resume(napi_env env, napi_callback_info info)556 static napi_value Resume(napi_env env, napi_callback_info info)
557 {
558 napi_value napiValue = nullptr;
559 bool result = g_hiperfClient->Resume();
560
561 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
562
563 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
564 return napiValue;
565 }
566
GetOutputDir(napi_env env, napi_callback_info info)567 static napi_value GetOutputDir(napi_env env, napi_callback_info info)
568 {
569 napi_value napiValue = nullptr;
570 std::string result = g_hiperfClient->GetOutputDir();
571
572 NAPI_CALL(env, napi_create_string_utf8(env, result.c_str(), result.size(), &napiValue));
573
574 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}s", result.c_str());
575 return napiValue;
576 }
577
GetCommandPath(napi_env env, napi_callback_info info)578 static napi_value GetCommandPath(napi_env env, napi_callback_info info)
579 {
580 napi_value napiValue = nullptr;
581 std::string result = g_hiperfClient->GetCommandPath();
582
583 NAPI_CALL(env, napi_create_string_utf8(env, result.c_str(), result.size(), &napiValue));
584
585 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}s", result.c_str());
586 return napiValue;
587 }
588
GetOutputPerfDataPath(napi_env env, napi_callback_info info)589 static napi_value GetOutputPerfDataPath(napi_env env, napi_callback_info info)
590 {
591 napi_value napiValue = nullptr;
592 std::string result = g_hiperfClient->GetOutputPerfDataPath();
593
594 NAPI_CALL(env, napi_create_string_utf8(env, result.c_str(), result.size(), &napiValue));
595
596 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}s", result.c_str());
597 return napiValue;
598 }
599
SetDebugMode(napi_env env, napi_callback_info info)600 static napi_value SetDebugMode(napi_env env, napi_callback_info info)
601 {
602 napi_value napiValue = nullptr;
603 bool result = true;
604
605 g_hiperfClient->SetDebugMode();
606
607 NAPI_CALL(env, napi_create_int32(env, result, &napiValue));
608
609 HIPERF_HILOGD(MODULE_JS_NAPI, "%{public}d", result);
610 return napiValue;
611 }
612 } // namespace HiperfClient
613 } // namespace HiPerf
614 } // namespace Developtools
615 } // namespace OHOS
616
617 using namespace OHOS::Developtools::HiPerf::HiperfClient;
618
619 EXTERN_C_START
620 /*
621 * function for module exports
622 */
HiperfClientInit(napi_env env, napi_value exports)623 static napi_value HiperfClientInit(napi_env env, napi_value exports)
624 {
625 HIPERF_HILOGD(MODULE_JS_NAPI, "enter");
626
627 napi_property_descriptor desc[] = {
628 DECLARE_NAPI_FUNCTION("isReady", IsReady),
629 DECLARE_NAPI_FUNCTION("setup", Setup),
630 DECLARE_NAPI_FUNCTION("start", Start),
631 DECLARE_NAPI_FUNCTION("stop", Stop),
632 DECLARE_NAPI_FUNCTION("pause", Pause),
633 DECLARE_NAPI_FUNCTION("resume", Resume),
634 DECLARE_NAPI_FUNCTION("getOutputDir", GetOutputDir),
635 DECLARE_NAPI_FUNCTION("getOutputPerfDataPath", GetOutputPerfDataPath),
636 DECLARE_NAPI_FUNCTION("getCommandPath", GetCommandPath),
637 DECLARE_NAPI_FUNCTION("setDebugMode", SetDebugMode),
638 // Option:
639 DECLARE_NAPI_FUNCTION("startWithOption", StartWithOption),
640 DECLARE_NAPI_FUNCTION("resetOption", ResetOption),
641 DECLARE_NAPI_FUNCTION("setOutputFilename", SetOutputFilename),
642 DECLARE_NAPI_FUNCTION("getOutputFileName", GetOutputFileName),
643 DECLARE_NAPI_FUNCTION("setTargetSystemWide", SetTargetSystemWide),
644 DECLARE_NAPI_FUNCTION("setCompressData", SetCompressData),
645 DECLARE_NAPI_FUNCTION("setSelectCpus", SetSelectCpus),
646 DECLARE_NAPI_FUNCTION("setTimeStopSec", SetTimeStopSec),
647 DECLARE_NAPI_FUNCTION("setFrequency", SetFrequency),
648 DECLARE_NAPI_FUNCTION("setPeriod", SetPeriod),
649 DECLARE_NAPI_FUNCTION("setSelectEvents", SetSelectEvents),
650 DECLARE_NAPI_FUNCTION("setSelectGroups", SetSelectGroups),
651 DECLARE_NAPI_FUNCTION("setNoInherit", SetNoInherit),
652 DECLARE_NAPI_FUNCTION("setSelectPids", SetSelectPids),
653 DECLARE_NAPI_FUNCTION("setCallStackSamplingConfigs", SetCallStackSamplingConfigs),
654 DECLARE_NAPI_FUNCTION("setSelectTids", SetSelectTids),
655 DECLARE_NAPI_FUNCTION("setExcludePerf", SetExcludePerf),
656 DECLARE_NAPI_FUNCTION("setCpuPercent", SetCpuPercent),
657 DECLARE_NAPI_FUNCTION("setOffCPU", SetOffCPU),
658 DECLARE_NAPI_FUNCTION("setCallGraph", SetCallGraph),
659 DECLARE_NAPI_FUNCTION("setDelayUnwind", SetDelayUnwind),
660 DECLARE_NAPI_FUNCTION("setDisableUnwind", SetDisableUnwind),
661 DECLARE_NAPI_FUNCTION("setDisableCallstackMerge", SetDisableCallstackMerge),
662 DECLARE_NAPI_FUNCTION("setSymbolDir", SetSymbolDir),
663 DECLARE_NAPI_FUNCTION("setDataLimit", SetDataLimit),
664 DECLARE_NAPI_FUNCTION("setAppPackage", SetAppPackage),
665 DECLARE_NAPI_FUNCTION("setClockId", SetClockId),
666 DECLARE_NAPI_FUNCTION("setVecBranchSampleTypes", SetVecBranchSampleTypes),
667 DECLARE_NAPI_FUNCTION("setMmapPages", SetMmapPages),
668 DECLARE_NAPI_FUNCTION("getOptionVecString", GetOptionVecString),
669 };
670 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
671 HIPERF_HILOGD(MODULE_JS_NAPI, "exit");
672 return exports;
673 }
674 EXTERN_C_END
675
676 /*
677 * Module definition
678 */
679 static napi_module g_module = {
680 .nm_version = 1,
681 .nm_flags = 0,
682 .nm_filename = nullptr,
683 .nm_register_func = HiperfClientInit,
684 .nm_modname = "hiperf",
685 .nm_priv = ((void *)0),
686 .reserved = {0},
687 };
688
689 /*
690 * Module registration
691 */
RegisterModule(void)692 extern "C" __attribute__((constructor)) void RegisterModule(void)
693 {
694 napi_module_register(&g_module);
695 }
696