From 1c2027203395c41207716b412af3c7d590e9280c Mon Sep 17 00:00:00 2001 From: lixing0101 Date: Mon, 6 May 2024 14:10:26 +0800 Subject: [PATCH 1/2] add hitracechain point Signed-off-by: lixing0101 --- BUILD.gn | 6 +++ bundle.json | 3 +- src/threadpool.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 112 insertions(+), 2 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index f0c8acc..6ccc393 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -187,6 +187,10 @@ if (defined(ohos_lite)) { defines += [ "PRINT_ERRNO_ABORT" ] } + if (is_ohos) { + defines += [ "ENABLE_HITRACE" ] + } + if (enable_uv_statisic && is_ohos) { defines += [ "UV_STATISTIC" ] cflags += @@ -299,6 +303,8 @@ if (defined(ohos_lite)) { external_deps += [ "hilog:libhilog", "hitrace:hitrace_meter", + "hitrace:libhitracechain", + "init:libbegetutil", ] } if (is_ohos && enable_async_stack) { diff --git a/bundle.json b/bundle.json index 060fb74..15097f9 100644 --- a/bundle.json +++ b/bundle.json @@ -26,7 +26,8 @@ "ffrt", "hilog", "hitrace", - "faultloggerd" + "faultloggerd", + "init" ], "third_party": [] }, diff --git a/src/threadpool.c b/src/threadpool.c index 25b9d19..44a42fd 100644 --- a/src/threadpool.c +++ b/src/threadpool.c @@ -36,6 +36,14 @@ #endif #include +#ifdef ENABLE_HITRACE +#include "hitrace/trace.h" +#include "parameter.h" +static int napi_traceId_enabled = 0; +static int param_updated = 0; +#define TRACEID_PARAM_SIZE 10 +#endif + #define MAX_THREADPOOL_SIZE 1024 #define TASK_NUMBER_WARNING 50 #define UV_TRACE_NAME "UV_TRACE" @@ -724,7 +732,28 @@ void uv__work_done(uv_async_t* handle) { static void uv__queue_work(struct uv__work* w) { uv_work_t* req = container_of(w, uv_work_t, work_req); +#ifdef ENABLE_HITRACE + HiTraceIdStruct currentId = HiTraceChainGetId(); + HiTraceIdStruct newId; + newId.valid = HITRACE_ID_INVALID; + + if (req->reserved[1] != NULL) { + HiTraceChainSaveAndSetId((HiTraceIdStruct*)(req->reserved[1])); + HiTraceChainTracepoint(HITRACE_TP_SR, (HiTraceIdStruct *)(req->reserved[1]), "libuv::uv__queue_work"); + newId = *(HiTraceIdStruct *)(req->reserved[1]); + } + if (req->reserved[1] != NULL && req->after_work_cb == NULL) { + free(req->reserved[1]); + req->reserved[1] = NULL; + } +#endif + req->work_cb(req); + +#ifdef ENABLE_HITRACE + HiTraceChainTracepoint(HITRACE_TP_SS, &newId, "libuv::uv__queue_work"); + HiTraceChainRestoreId(¤tId); +#endif } @@ -734,10 +763,31 @@ static void uv__queue_done(struct uv__work* w, int err) { req = container_of(w, uv_work_t, work_req); uv__req_unregister(req->loop, req); - if (req->after_work_cb == NULL) + if (req->after_work_cb == NULL) { + if (req->reserved[1] != NULL) { + free(req->reserved[1]); + req->reserved[1] = NULL; + } return; + } + +#ifdef ENABLE_HITRACE + HiTraceIdStruct currentId = HiTraceChainGetId(); + HiTraceIdStruct newId; + newId.valid = HITRACE_ID_INVALID; + if (req->reserved[1] != NULL) { + HiTraceChainSaveAndSetId((HiTraceIdStruct *)(req->reserved[1])); + newId = *(HiTraceIdStruct *)(req->reserved[1]); + free(req->reserved[1]); + req->reserved[1] = NULL; + } +#endif req->after_work_cb(req, err); + +#ifdef ENABLE_HITRACE + HiTraceChainRestoreId(¤tId); +#endif } @@ -884,6 +934,26 @@ int uv_queue_work(uv_loop_t* loop, #ifdef ASYNC_STACKTRACE req->reserved[3] = (void*)CollectAsyncStack(); #endif + +#ifdef ENABLE_HITRACE + HiTraceIdStruct traceId = HiTraceChainGetId(); + req->reserved[1] = NULL; + if (!param_updated) { + char napiTraceIdEnabled[TRACEID_PARAM_SIZE] = {0}; + int ret = GetParameter("persist.hiviewdfx.napitraceid.enabled", "false", + napiTraceIdEnabled, sizeof(napiTraceIdEnabled)); + if (ret > 0 && strcmp(napiTraceIdEnabled, "true") == 0) { + napi_traceId_enabled = 1; + } + param_updated = 1; + } + if (napi_traceId_enabled && traceId.valid == HITRACE_ID_VALID) { + req->reserved[1] = (HiTraceIdStruct*)malloc(sizeof(HiTraceIdStruct)); + *((HiTraceIdStruct*)(req->reserved[1])) = HiTraceChainCreateSpan(); + HiTraceChainTracepoint(HITRACE_TP_CS, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv_queue_work"); + } +#endif + uv__work_submit(loop, #ifdef USE_FFRT (uv_req_t*)req, @@ -896,6 +966,12 @@ int uv_queue_work(uv_loop_t* loop, #ifdef UV_STATISTIC uv_queue_statics(info); #endif + +#ifdef ENABLE_HITRACE + if (traceId.valid == HITRACE_ID_VALID && req->reserved[1] != NULL) { + HiTraceChainTracepoint(HITRACE_TP_CR, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv_queue_work"); + } +#endif return 0; } @@ -932,6 +1008,26 @@ int uv_queue_work_with_qos(uv_loop_t* loop, info->builtin_return_address[2] = __builtin_return_address(2); (req->work_req).info = info; #endif + +#ifdef ENABLE_HITRACE + HiTraceIdStruct traceId = HiTraceChainGetId(); + req->reserved[1] = NULL; + if (!param_updated) { + char napiTraceIdEnabled[TRACEID_PARAM_SIZE] = {0}; + int ret = GetParameter("persist.hiviewdfx.napitraceid.enabled", "false", + napiTraceIdEnabled, sizeof(napiTraceIdEnabled)); + if (ret > 0 && strcmp(napiTraceIdEnabled, "true") == 0) { + napi_traceId_enabled = 1; + } + param_updated = 1; + } + if (napi_traceId_enabled && traceId.valid == HITRACE_ID_VALID) { + req->reserved[1] = (HiTraceIdStruct*)malloc(sizeof(HiTraceIdStruct)); + *((HiTraceIdStruct*)(req->reserved[1])) = HiTraceChainCreateSpan(); + HiTraceChainTracepoint(HITRACE_TP_CS, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv_queue_work_with_qos"); + } +#endif + uv__work_submit_with_qos(loop, (uv_req_t*)req, &req->work_req, @@ -941,6 +1037,13 @@ int uv_queue_work_with_qos(uv_loop_t* loop, #ifdef UV_STATISTIC uv_queue_statics(info); #endif + +#ifdef ENABLE_HITRACE + if (traceId.valid == HITRACE_ID_VALID && req->reserved[1] != NULL) { + HiTraceChainTracepoint(HITRACE_TP_CR, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv_queue_work_with_qos"); + } +#endif + return 0; #else return uv_queue_work(loop, req, work_cb, after_work_cb); -- Gitee From 6befdf297c7773c25939cdaa36474ae94d9a6674 Mon Sep 17 00:00:00 2001 From: lixing0101 Date: Mon, 6 May 2024 14:10:26 +0800 Subject: [PATCH 2/2] add hitracechain point Signed-off-by: lixing0101 --- BUILD.gn | 7 +++ bundle.json | 4 +- src/threadpool.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 117 insertions(+), 2 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index f0c8acc..dc3948e 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -187,6 +187,10 @@ if (defined(ohos_lite)) { defines += [ "PRINT_ERRNO_ABORT" ] } + if (is_ohos) { + defines += [ "ENABLE_HITRACE" ] + } + if (enable_uv_statisic && is_ohos) { defines += [ "UV_STATISTIC" ] cflags += @@ -297,8 +301,11 @@ if (defined(ohos_lite)) { "src/unix/ohos/trace_ohos.c", ] external_deps += [ + "bounds_checking_function:libsec_shared", "hilog:libhilog", "hitrace:hitrace_meter", + "hitrace:libhitracechain", + "init:export_headers_lib", ] } if (is_ohos && enable_async_stack) { diff --git a/bundle.json b/bundle.json index 060fb74..58e06ea 100644 --- a/bundle.json +++ b/bundle.json @@ -23,10 +23,12 @@ "ram": "0", "deps": { "components": [ + "bounds_checking_function", "ffrt", "hilog", "hitrace", - "faultloggerd" + "faultloggerd", + "init" ], "third_party": [] }, diff --git a/src/threadpool.c b/src/threadpool.c index 25b9d19..1aa4fa3 100644 --- a/src/threadpool.c +++ b/src/threadpool.c @@ -36,6 +36,15 @@ #endif #include +#ifdef ENABLE_HITRACE +#include "hitrace/trace.h" +#include "sys_param.h" +static int napi_traceId_enabled = 0; +static int param_updated = 0; +#define TRACEID_PARAM_SIZE 10 +#define UNEXPECTANTLY(exp) (__builtin_expect(!!(exp), 0)) +#endif + #define MAX_THREADPOOL_SIZE 1024 #define TASK_NUMBER_WARNING 50 #define UV_TRACE_NAME "UV_TRACE" @@ -724,7 +733,28 @@ void uv__work_done(uv_async_t* handle) { static void uv__queue_work(struct uv__work* w) { uv_work_t* req = container_of(w, uv_work_t, work_req); +#ifdef ENABLE_HITRACE + HiTraceIdStruct currentId = HiTraceChainGetId(); + HiTraceIdStruct newId; + newId.valid = HITRACE_ID_INVALID; + + if (req->reserved[1] != NULL) { + HiTraceChainSaveAndSetId((HiTraceIdStruct*)(req->reserved[1])); + HiTraceChainTracepoint(HITRACE_TP_SR, (HiTraceIdStruct *)(req->reserved[1]), "libuv::uv__queue_work"); + newId = *(HiTraceIdStruct *)(req->reserved[1]); + } + if (req->reserved[1] != NULL && req->after_work_cb == NULL) { + free(req->reserved[1]); + req->reserved[1] = NULL; + } +#endif + req->work_cb(req); + +#ifdef ENABLE_HITRACE + HiTraceChainTracepoint(HITRACE_TP_SS, &newId, "libuv::uv__queue_work"); + HiTraceChainRestoreId(¤tId); +#endif } @@ -734,10 +764,31 @@ static void uv__queue_done(struct uv__work* w, int err) { req = container_of(w, uv_work_t, work_req); uv__req_unregister(req->loop, req); - if (req->after_work_cb == NULL) + if (req->after_work_cb == NULL) { + if (req->reserved[1] != NULL) { + free(req->reserved[1]); + req->reserved[1] = NULL; + } return; + } + +#ifdef ENABLE_HITRACE + HiTraceIdStruct currentId = HiTraceChainGetId(); + HiTraceIdStruct newId; + newId.valid = HITRACE_ID_INVALID; + if (req->reserved[1] != NULL) { + HiTraceChainSaveAndSetId((HiTraceIdStruct *)(req->reserved[1])); + newId = *(HiTraceIdStruct *)(req->reserved[1]); + free(req->reserved[1]); + req->reserved[1] = NULL; + } +#endif req->after_work_cb(req, err); + +#ifdef ENABLE_HITRACE + HiTraceChainRestoreId(¤tId); +#endif } @@ -857,6 +908,18 @@ void uv__work_submit_with_qos(uv_loop_t* loop, } #endif +void UpdateTraceEnable() { + CachedHandle cached_handle = CachedParameterCreate("persist.hiviewdfx.napitraceid.enabled", "false"); + if (UNEXPECTANTLY(cached_handle == NULL)) { + UV_LOGE("cached_handle is NULL"); + return; + } + int changed = 0; + const char *param = CachedParameterGetChanged(cached_handle, &changed); + if (UNEXPECTANTLY(changed == 1) && param != NULL && strcmp(param, "true") == 0) { + napi_traceId_enabled = 1; + } +} int uv_queue_work(uv_loop_t* loop, uv_work_t* req, @@ -884,6 +947,21 @@ int uv_queue_work(uv_loop_t* loop, #ifdef ASYNC_STACKTRACE req->reserved[3] = (void*)CollectAsyncStack(); #endif + +#ifdef ENABLE_HITRACE + HiTraceIdStruct traceId = HiTraceChainGetId(); + req->reserved[1] = NULL; + if (!param_updated) { + UpdateTraceEnable(); + param_updated = 1; + } + if (napi_traceId_enabled && traceId.valid == HITRACE_ID_VALID) { + req->reserved[1] = (HiTraceIdStruct*)malloc(sizeof(HiTraceIdStruct)); + *((HiTraceIdStruct*)(req->reserved[1])) = HiTraceChainCreateSpan(); + HiTraceChainTracepoint(HITRACE_TP_CS, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv_queue_work"); + } +#endif + uv__work_submit(loop, #ifdef USE_FFRT (uv_req_t*)req, @@ -896,6 +974,12 @@ int uv_queue_work(uv_loop_t* loop, #ifdef UV_STATISTIC uv_queue_statics(info); #endif + +#ifdef ENABLE_HITRACE + if (traceId.valid == HITRACE_ID_VALID && req->reserved[1] != NULL) { + HiTraceChainTracepoint(HITRACE_TP_CR, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv_queue_work"); + } +#endif return 0; } @@ -932,6 +1016,21 @@ int uv_queue_work_with_qos(uv_loop_t* loop, info->builtin_return_address[2] = __builtin_return_address(2); (req->work_req).info = info; #endif + +#ifdef ENABLE_HITRACE + HiTraceIdStruct traceId = HiTraceChainGetId(); + req->reserved[1] = NULL; + if (!param_updated) { + UpdateTraceEnable(); + param_updated = 1; + } + if (napi_traceId_enabled && traceId.valid == HITRACE_ID_VALID) { + req->reserved[1] = (HiTraceIdStruct*)malloc(sizeof(HiTraceIdStruct)); + *((HiTraceIdStruct*)(req->reserved[1])) = HiTraceChainCreateSpan(); + HiTraceChainTracepoint(HITRACE_TP_CS, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv_queue_work_with_qos"); + } +#endif + uv__work_submit_with_qos(loop, (uv_req_t*)req, &req->work_req, @@ -941,6 +1040,13 @@ int uv_queue_work_with_qos(uv_loop_t* loop, #ifdef UV_STATISTIC uv_queue_statics(info); #endif + +#ifdef ENABLE_HITRACE + if (traceId.valid == HITRACE_ID_VALID && req->reserved[1] != NULL) { + HiTraceChainTracepoint(HITRACE_TP_CR, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv_queue_work_with_qos"); + } +#endif + return 0; #else return uv_queue_work(loop, req, work_cb, after_work_cb); -- Gitee