diff --git a/BUILD.gn b/BUILD.gn index f0c8acccd7243bf90e174b5342cbd8e30b8adeab..a63f85a83b9ea3367a09d54867db6fd76f3a928a 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 += @@ -288,6 +292,7 @@ if (defined(ohos_lite)) { "src/unix/random-sysctl-linux.c", "src/unix/proctitle.c", ] + external_deps = [] if (use_ffrt) { external_deps += [ "ffrt:libffrt" ] } @@ -299,6 +304,7 @@ if (defined(ohos_lite)) { external_deps += [ "hilog:libhilog", "hitrace:hitrace_meter", + "hitrace:libhitracechain", ] } if (is_ohos && enable_async_stack) { diff --git a/src/threadpool.c b/src/threadpool.c index 25b9d19c0a7717d8beff835d25a9e90a975772e6..0f571a1466b02c323ecc1986a02f74749983a47f 100644 --- a/src/threadpool.c +++ b/src/threadpool.c @@ -36,6 +36,10 @@ #endif #include +#ifdef ENABLE_HITRACE +#include "hitrace/trace.h" +#endif + #define MAX_THREADPOOL_SIZE 1024 #define TASK_NUMBER_WARNING 50 #define UV_TRACE_NAME "UV_TRACE" @@ -724,7 +728,22 @@ 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(); + if (req->reserved[1] != NULL) { + HiTraceChainSaveAndSetId((HiTraceIdStruct*)(req->reserved[1])); + HiTraceChainTracepoint(HITRACE_TP_SR, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv__queue_work"); + } +#endif + req->work_cb(req); + +#ifdef ENABLE_HITRACE + if (req->reserved[1] != NULL) { + HiTraceChainTracepoint(HITRACE_TP_SS, (HiTraceIdStruct*)(req->reserved[1]), "libuv::uv__queue_work"); + HiTraceChainRestoreId(¤tId); + } +#endif } @@ -737,7 +756,20 @@ static void uv__queue_done(struct uv__work* w, int err) { if (req->after_work_cb == NULL) return; +#ifdef ENABLE_HITRACE + HiTraceIdStruct currentId = HiTraceChainGetId(); + if (req->reserved[1] != NULL) { + HiTraceChainSaveAndSetId((HiTraceIdStruct*)(req->reserved[1])); + } +#endif + req->after_work_cb(req, err); + +#ifdef ENABLE_HITRACE + if (req->reserved[1] != NULL) { + HiTraceChainRestoreId(¤tId); + } +#endif } @@ -884,6 +916,17 @@ 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 (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 +939,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 +981,17 @@ 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 (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 +1001,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);