mirror of
https://gitee.com/openharmony/hiviewdfx_hitrace
synced 2024-11-27 10:00:32 +00:00
Description:【基础能力】HiTraceMeter Rust接口 Signed-off-by: wangqiankun <wangqiankun@huawei.com>
This commit is contained in:
parent
e0caefbb15
commit
37fa8dc97e
@ -37,7 +37,8 @@
|
|||||||
"//base/hiviewdfx/hitrace/interfaces/native/innerkits:hitrace_meter",
|
"//base/hiviewdfx/hitrace/interfaces/native/innerkits:hitrace_meter",
|
||||||
"//base/hiviewdfx/hitrace/interfaces/native/innerkits:libhitracechain",
|
"//base/hiviewdfx/hitrace/interfaces/native/innerkits:libhitracechain",
|
||||||
"//base/hiviewdfx/hitrace/interfaces/js/kits:hitrace_napi",
|
"//base/hiviewdfx/hitrace/interfaces/js/kits:hitrace_napi",
|
||||||
"//base/hiviewdfx/hitrace/interfaces/rust/innerkits/hitracechain:hitracechain_rust"
|
"//base/hiviewdfx/hitrace/interfaces/rust/innerkits/hitracechain:hitracechain_rust",
|
||||||
|
"//base/hiviewdfx/hitrace/interfaces/rust/innerkits/hitrace_meter:hitrace_meter_rust"
|
||||||
],
|
],
|
||||||
"inner_kits": [
|
"inner_kits": [
|
||||||
{
|
{
|
||||||
|
@ -66,6 +66,15 @@ ohos_executable("hitrace_example") {
|
|||||||
part_name = "hitrace_native"
|
part_name = "hitrace_native"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ohos_rust_executable("hitrace_example_rust") {
|
||||||
|
sources = [ "example/rust/main.rs" ]
|
||||||
|
|
||||||
|
external_deps = [ "../interfaces/rust/innerkits/hitrace_meter:hitrace_meter_rust" ]
|
||||||
|
install_enable = false
|
||||||
|
subsystem_name = "hiviewdfx"
|
||||||
|
part_name = "hitrace_native"
|
||||||
|
}
|
||||||
|
|
||||||
group("hitrace_target") {
|
group("hitrace_target") {
|
||||||
deps = [
|
deps = [
|
||||||
":hitrace",
|
":hitrace",
|
||||||
|
43
cmd/example/rust/main.rs
Normal file
43
cmd/example/rust/main.rs
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//! hitrace_meter example_create for rust.
|
||||||
|
extern create hitrace_meter_rust;
|
||||||
|
use hitrace_meter_rust::{start_trace, finish_trace, start_trace_async, finish_trace_async, count_trace};
|
||||||
|
const HITRACE_TAG_OHOS : u64 = 1 << 30;
|
||||||
|
const HITRACE_TASK_ID : i32 = 666;
|
||||||
|
|
||||||
|
/// example function A
|
||||||
|
fn func_a() {
|
||||||
|
println!("funcA!!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// example function B
|
||||||
|
fn func_b() {
|
||||||
|
println!("funcB!!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// trace example for rust
|
||||||
|
fn main() {
|
||||||
|
start_trace(HITRACE_TAG_OHOS, "rust test start trace funcA!!!!!!");
|
||||||
|
func_a();
|
||||||
|
count_trace(HITRACE_TAG_OHOS, "rust test count trace funcA!!!!!!", 0);
|
||||||
|
finish_trace(HITRACE_TAG_OHOS);
|
||||||
|
|
||||||
|
start_trace_async(HITRACE_TAG_OHOS, "rust test start trace async funcB!!!!!!", HITRACE_TASK_ID);
|
||||||
|
func_b();
|
||||||
|
count_trace(HITRACE_TAG_OHOS, "rust test count trace funcB!!!!!!", 1);
|
||||||
|
finish_trace_async(HITRACE_TAG_OHOS, "rust finish trace async funcB!!!!!!", HITRACE_TASK_ID);
|
||||||
|
}
|
@ -108,6 +108,7 @@ void StartTrace(uint64_t label, const std::string& value, float limit = -1);
|
|||||||
void StartTraceDebug(bool isDebug, uint64_t label, const std::string& value, float limit = -1);
|
void StartTraceDebug(bool isDebug, uint64_t label, const std::string& value, float limit = -1);
|
||||||
void StartTraceArgs(uint64_t label, const char *fmt, ...);
|
void StartTraceArgs(uint64_t label, const char *fmt, ...);
|
||||||
void StartTraceArgsDebug(bool isDebug, uint64_t label, const char *fmt, ...);
|
void StartTraceArgsDebug(bool isDebug, uint64_t label, const char *fmt, ...);
|
||||||
|
void StartTraceWrapper(uint64_t label, const char *value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Track the end of a context.
|
* Track the end of a context.
|
||||||
@ -122,6 +123,7 @@ void StartAsyncTrace(uint64_t label, const std::string& value, int32_t taskId, f
|
|||||||
void StartAsyncTraceDebug(bool isDebug, uint64_t label, const std::string& value, int32_t taskId, float limit = -1);
|
void StartAsyncTraceDebug(bool isDebug, uint64_t label, const std::string& value, int32_t taskId, float limit = -1);
|
||||||
void StartAsyncTraceArgs(uint64_t label, int32_t taskId, const char *fmt, ...);
|
void StartAsyncTraceArgs(uint64_t label, int32_t taskId, const char *fmt, ...);
|
||||||
void StartAsyncTraceArgsDebug(bool isDebug, uint64_t label, int32_t taskId, const char *fmt, ...);
|
void StartAsyncTraceArgsDebug(bool isDebug, uint64_t label, int32_t taskId, const char *fmt, ...);
|
||||||
|
void StartAsyncTraceWrapper(uint64_t label, const char *value, int32_t taskId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Track the end of an asynchronous event.
|
* Track the end of an asynchronous event.
|
||||||
@ -130,6 +132,7 @@ void FinishAsyncTrace(uint64_t label, const std::string& value, int32_t taskId);
|
|||||||
void FinishAsyncTraceDebug(bool isDebug, uint64_t label, const std::string& value, int32_t taskId);
|
void FinishAsyncTraceDebug(bool isDebug, uint64_t label, const std::string& value, int32_t taskId);
|
||||||
void FinishAsyncTraceArgs(uint64_t label, int32_t taskId, const char *fmt, ...);
|
void FinishAsyncTraceArgs(uint64_t label, int32_t taskId, const char *fmt, ...);
|
||||||
void FinishAsyncTraceArgsDebug(bool isDebug, uint64_t label, int32_t taskId, const char *fmt, ...);
|
void FinishAsyncTraceArgsDebug(bool isDebug, uint64_t label, int32_t taskId, const char *fmt, ...);
|
||||||
|
void FinishAsyncTraceWrapper(uint64_t label, const char *value, int32_t taskId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Track the middle of a context. Match the previous function of StartTrace before it.
|
* Track the middle of a context. Match the previous function of StartTrace before it.
|
||||||
@ -142,6 +145,7 @@ void MiddleTraceDebug(bool isDebug, uint64_t label, const std::string& beforeVal
|
|||||||
*/
|
*/
|
||||||
void CountTrace(uint64_t label, const std::string& name, int64_t count);
|
void CountTrace(uint64_t label, const std::string& name, int64_t count);
|
||||||
void CountTraceDebug(bool isDebug, uint64_t label, const std::string& name, int64_t count);
|
void CountTraceDebug(bool isDebug, uint64_t label, const std::string& name, int64_t count);
|
||||||
|
void CountTraceWrapper(uint64_t label, const char *name, int64_t count);
|
||||||
|
|
||||||
class HitraceScoped {
|
class HitraceScoped {
|
||||||
public:
|
public:
|
||||||
|
@ -242,6 +242,12 @@ void SetTraceDisabled(bool disable)
|
|||||||
g_isHitraceMeterDisabled = disable;
|
g_isHitraceMeterDisabled = disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StartTraceWrapper(uint64_t label, const char *value)
|
||||||
|
{
|
||||||
|
std::string traceValue = value;
|
||||||
|
StartTrace(label, traceValue);
|
||||||
|
}
|
||||||
|
|
||||||
void StartTrace(uint64_t label, const string& value, float limit UNUSED_PARAM)
|
void StartTrace(uint64_t label, const string& value, float limit UNUSED_PARAM)
|
||||||
{
|
{
|
||||||
AddHitraceMeterMarker(MARKER_BEGIN, label, value, 0);
|
AddHitraceMeterMarker(MARKER_BEGIN, label, value, 0);
|
||||||
@ -305,6 +311,12 @@ void StartAsyncTrace(uint64_t label, const string& value, int32_t taskId, float
|
|||||||
AddHitraceMeterMarker(MARKER_ASYNC_BEGIN, label, value, taskId);
|
AddHitraceMeterMarker(MARKER_ASYNC_BEGIN, label, value, taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StartAsyncTraceWrapper(uint64_t label, const char *value, int32_t taskId)
|
||||||
|
{
|
||||||
|
std::string traceValue = value;
|
||||||
|
StartAsyncTrace(label, traceValue, taskId);
|
||||||
|
}
|
||||||
|
|
||||||
void StartAsyncTraceDebug(bool isDebug, uint64_t label, const string& value, int32_t taskId, float limit UNUSED_PARAM)
|
void StartAsyncTraceDebug(bool isDebug, uint64_t label, const string& value, int32_t taskId, float limit UNUSED_PARAM)
|
||||||
{
|
{
|
||||||
if (!isDebug) {
|
if (!isDebug) {
|
||||||
@ -351,6 +363,12 @@ void FinishAsyncTrace(uint64_t label, const string& value, int32_t taskId)
|
|||||||
AddHitraceMeterMarker(MARKER_ASYNC_END, label, value, taskId);
|
AddHitraceMeterMarker(MARKER_ASYNC_END, label, value, taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FinishAsyncTraceWrapper(uint64_t label, const char *value, int32_t taskId)
|
||||||
|
{
|
||||||
|
std::string traceValue = value;
|
||||||
|
FinishAsyncTrace(label, traceValue, taskId);
|
||||||
|
}
|
||||||
|
|
||||||
void FinishAsyncTraceDebug(bool isDebug, uint64_t label, const string& value, int32_t taskId)
|
void FinishAsyncTraceDebug(bool isDebug, uint64_t label, const string& value, int32_t taskId)
|
||||||
{
|
{
|
||||||
if (!isDebug) {
|
if (!isDebug) {
|
||||||
@ -421,6 +439,12 @@ void CountTraceDebug(bool isDebug, uint64_t label, const string& name, int64_t c
|
|||||||
AddHitraceMeterMarker(MARKER_INT, label, name, count);
|
AddHitraceMeterMarker(MARKER_INT, label, name, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CountTraceWrapper(uint64_t label, const char *name, int64_t count)
|
||||||
|
{
|
||||||
|
std::string traceName = name;
|
||||||
|
CountTrace(label, traceName, count);
|
||||||
|
}
|
||||||
|
|
||||||
HitraceMeterFmtScoped::HitraceMeterFmtScoped(uint64_t label, const char *fmt, ...) : mTag(label)
|
HitraceMeterFmtScoped::HitraceMeterFmtScoped(uint64_t label, const char *fmt, ...) : mTag(label)
|
||||||
{
|
{
|
||||||
char name[VAR_NAME_MAX_SIZE] = { 0 };
|
char name[VAR_NAME_MAX_SIZE] = { 0 };
|
||||||
|
26
interfaces/rust/innerkits/hitrace_meter/BUILD.gn
Normal file
26
interfaces/rust/innerkits/hitrace_meter/BUILD.gn
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
import("//build/ohos.gni")
|
||||||
|
|
||||||
|
ohos_rust_shared_library("hitrace_meter_rust") {
|
||||||
|
sources = [ "src/lib.rs" ]
|
||||||
|
|
||||||
|
external_deps = [ "hitrace_native:hitrace_meter" ]
|
||||||
|
|
||||||
|
crate_name = "hitrace_meter_rust"
|
||||||
|
crate_type = "dylib"
|
||||||
|
|
||||||
|
subsystem_name = "hiviewdfx"
|
||||||
|
part_name = "hitrace_native"
|
||||||
|
}
|
73
interfaces/rust/innerkits/hitrace_meter/src/lib.rs
Normal file
73
interfaces/rust/innerkits/hitrace_meter/src/lib.rs
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//! hitrace_meter dylib_create for rust.
|
||||||
|
use std::ffi::{CString, c_char, c_int, c_longlong, c_ulonglong};
|
||||||
|
|
||||||
|
/// Track the beginning of a context
|
||||||
|
pub fn start_trace(label: u64, value: &str) {
|
||||||
|
let value_raw_ptr = CString::new(value).unwrap();
|
||||||
|
unsafe {
|
||||||
|
StartTraceWrapper(label, value_raw_ptr.as_ptr() as *const c_char);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Track the end of a context
|
||||||
|
pub fn finish_trace(label: u64) {
|
||||||
|
unsafe {
|
||||||
|
FinishTrace(label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Track the beginning of an asynchronous event
|
||||||
|
pub fn start_trace_async(label: u64, value: &str, task_id: i32) {
|
||||||
|
let value_raw_ptr = CString::new(value).unwrap();
|
||||||
|
unsafe {
|
||||||
|
StartAsyncTraceWrapper(label, value_raw_ptr.as_ptr() as *const c_char, task_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Track the end of an asynchronous event
|
||||||
|
pub fn finish_trace_async(label: u64, value: &str, task_id: i32) {
|
||||||
|
let value_raw_ptr = CString::new(value).unwrap();
|
||||||
|
unsafe {
|
||||||
|
FinishAsyncTraceWrapper(label, value_raw_ptr.as_ptr() as *const c_char, task_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Track the 64-bit integer counter value
|
||||||
|
pub fn count_trace(label: u64, value: &str, count: i64) {
|
||||||
|
let value_raw_ptr = CString::new(value).unwrap();
|
||||||
|
unsafe {
|
||||||
|
CountTraceWrapper(label, value_raw_ptr.as_ptr() as *const c_char, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
/// ffi border function -> start trace
|
||||||
|
pub(create) fn StartTraceWrapper(label: c_ulonglong, value: *const c_char);
|
||||||
|
|
||||||
|
/// ffi border function -> finish trace
|
||||||
|
pub(create) fn FinishTrace(label: c_ulonglong);
|
||||||
|
|
||||||
|
/// ffi border function -> start async trace
|
||||||
|
pub(create) fn StartAsyncTraceWrapper(label: c_ulonglong, value: *const c_char, taskId: c_int);
|
||||||
|
|
||||||
|
/// ffi border function -> finish async trace
|
||||||
|
pub(create) fn FinishAsyncTraceWrapper(label: c_ulonglong, value: *const c_char, taskId: c_int);
|
||||||
|
|
||||||
|
/// ffi border function -> count trace
|
||||||
|
pub(create) fn CounttTraceWrapper(label: c_ulonglong, value: *const c_char, count: c_longlong);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user