From 9d15f620bb7009098c6b2270636cc3e74f7ed799 Mon Sep 17 00:00:00 2001 From: c00657214 Date: Sat, 2 Nov 2024 08:42:04 +0800 Subject: [PATCH 1/2] add pulseaudio dfx for daemon blocking Signed-off-by: c00657214 --- src/pulse/rtclock.h | 2 ++ src/pulsecore/asyncmsgq.c | 8 ++++++++ src/pulsecore/pdispatch.c | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/src/pulse/rtclock.h b/src/pulse/rtclock.h index da6507646..b481feea6 100644 --- a/src/pulse/rtclock.h +++ b/src/pulse/rtclock.h @@ -28,6 +28,8 @@ PA_C_DECL_BEGIN +#define OH_DAEMON_TIMEOUT_THRESHOLD_ON_US 20000 + /** Return the current monotonic system time in usec, if such a clock * is available. If it is not available this will return the * wallclock time instead. \since 0.9.16 */ diff --git a/src/pulsecore/asyncmsgq.c b/src/pulsecore/asyncmsgq.c index af9b65939..aa80e4c7b 100644 --- a/src/pulsecore/asyncmsgq.c +++ b/src/pulsecore/asyncmsgq.c @@ -25,6 +25,8 @@ #include #include +#include +#include #include #include @@ -151,6 +153,7 @@ int pa_asyncmsgq_send(pa_asyncmsgq *a, pa_msgobject *object, int code, const voi struct asyncmsgq_item i; pa_assert(PA_REFCNT_VALUE(a) > 0); + pa_usec_t startTime = pa_rtclock_now(); char t[PA_SNPRINTF_STR_LENGTH] = {0}; pa_snprintf(t, sizeof(t), "pa_asyncmsgq_send[%d] %u", code, PaAsyncqGetNumToRead(a->asyncq)); CallStart(t); @@ -179,6 +182,11 @@ int pa_asyncmsgq_send(pa_asyncmsgq *a, pa_msgobject *object, int code, const voi if (pa_flist_push(PA_STATIC_FLIST_GET(semaphores), i.semaphore) < 0) pa_semaphore_free(i.semaphore); CallEnd(); + pa_usec_t executionTime = pa_rtclock_now() - startTime; + if (executionTime > OH_DAEMON_TIMEOUT_THRESHOLD_ON_US) { // too long block of daemon thread, dangerous + AUDIO_WARNING_LOG("Execution time of this msg is too long: qLen[%{public}u], MSG[%{public}d] (%{public}ldms)", + PaAsyncqGetNumToRead(a->asyncq), code, executionTime / PA_USEC_PER_MSEC); + } return i.ret; } diff --git a/src/pulsecore/pdispatch.c b/src/pulsecore/pdispatch.c index 45970d1ca..ad6182abf 100644 --- a/src/pulsecore/pdispatch.c +++ b/src/pulsecore/pdispatch.c @@ -351,7 +351,13 @@ int pa_pdispatch_run(pa_pdispatch *pd, pa_packet *packet, pa_cmsg_ancil_data *an } else if (pd->callback_table && (command < pd->n_commands) && pd->callback_table[command]) { const pa_pdispatch_cb_t *cb = pd->callback_table+command; + pa_usec_t startTime = pa_rtclock_now(); (*cb)(pd, command, tag, ts, userdata); + pa_usec_t executionTime = pa_rtclock_now() - startTime; + if (executionTime > OH_DAEMON_TIMEOUT_THRESHOLD_ON_US) { // too long block of daemon thread, dangerous + AUDIO_WARNING_LOG("execution time of this command is too long: CMD[%{public}s] (%{public}ldms)", + p, executionTime / PA_USEC_PER_MSEC); + } } else { pa_log("Received unsupported command %u", command); CallEnd(); -- Gitee From 98245e9d056a8137fdd1c1988fad180d04d5a920 Mon Sep 17 00:00:00 2001 From: c00657214 Date: Sat, 2 Nov 2024 09:11:45 +0800 Subject: [PATCH 2/2] fix codecheck Signed-off-by: c00657214 --- src/pulsecore/asyncmsgq.c | 2 +- src/pulsecore/pdispatch.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pulsecore/asyncmsgq.c b/src/pulsecore/asyncmsgq.c index aa80e4c7b..0c855b9bd 100644 --- a/src/pulsecore/asyncmsgq.c +++ b/src/pulsecore/asyncmsgq.c @@ -184,7 +184,7 @@ int pa_asyncmsgq_send(pa_asyncmsgq *a, pa_msgobject *object, int code, const voi CallEnd(); pa_usec_t executionTime = pa_rtclock_now() - startTime; if (executionTime > OH_DAEMON_TIMEOUT_THRESHOLD_ON_US) { // too long block of daemon thread, dangerous - AUDIO_WARNING_LOG("Execution time of this msg is too long: qLen[%{public}u], MSG[%{public}d] (%{public}ldms)", + AUDIO_WARNING_LOG("Execution time of this msg is too long: qLen[%{public}u], MSG[%{public}d] (%{public}llums)", PaAsyncqGetNumToRead(a->asyncq), code, executionTime / PA_USEC_PER_MSEC); } return i.ret; diff --git a/src/pulsecore/pdispatch.c b/src/pulsecore/pdispatch.c index ad6182abf..1b2efd1c8 100644 --- a/src/pulsecore/pdispatch.c +++ b/src/pulsecore/pdispatch.c @@ -355,7 +355,7 @@ int pa_pdispatch_run(pa_pdispatch *pd, pa_packet *packet, pa_cmsg_ancil_data *an (*cb)(pd, command, tag, ts, userdata); pa_usec_t executionTime = pa_rtclock_now() - startTime; if (executionTime > OH_DAEMON_TIMEOUT_THRESHOLD_ON_US) { // too long block of daemon thread, dangerous - AUDIO_WARNING_LOG("execution time of this command is too long: CMD[%{public}s] (%{public}ldms)", + AUDIO_WARNING_LOG("Execution time of this command is too long: CMD[%{public}s] (%{public}llums)", p, executionTime / PA_USEC_PER_MSEC); } } else { -- Gitee