From 557f0446b318c2a4a150c99c22f49f638fda4e96 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Wed, 26 Apr 2023 15:33:53 -0400 Subject: [PATCH] kernel: Introduce THREAD_BLOCK_TYPE_OTHER_OBJECT. THREAD_BLOCK_TYPE_OTHER implies the "object" pointer in the wait information is a string. But sometimes we want to pass through objects which are not strings, for inspection in KDL. --- headers/private/system/thread_defs.h | 1 + src/apps/debuganalyzer/gui/main_window/SchedulingPage.cpp | 1 + src/apps/debuganalyzer/model/Model.cpp | 1 + src/apps/debuganalyzer/model_loader/ModelLoader.cpp | 1 + src/bin/debug/time_stats/scheduling_analysis.cpp | 3 +++ src/system/kernel/debug/system_profiler.cpp | 1 + src/system/kernel/scheduler/scheduler_tracing.cpp | 3 +++ src/system/kernel/scheduler/scheduling_analysis.cpp | 1 + src/system/kernel/thread.cpp | 8 ++++++++ 9 files changed, 20 insertions(+) diff --git a/headers/private/system/thread_defs.h b/headers/private/system/thread_defs.h index e2ba2ee9fb..0f032c0f8e 100644 --- a/headers/private/system/thread_defs.h +++ b/headers/private/system/thread_defs.h @@ -30,6 +30,7 @@ enum { THREAD_BLOCK_TYPE_RW_LOCK = 5, THREAD_BLOCK_TYPE_USER = 6, + THREAD_BLOCK_TYPE_OTHER_OBJECT = 9998, THREAD_BLOCK_TYPE_OTHER = 9999, }; diff --git a/src/apps/debuganalyzer/gui/main_window/SchedulingPage.cpp b/src/apps/debuganalyzer/gui/main_window/SchedulingPage.cpp index 5def8141fa..d9da52e1c8 100644 --- a/src/apps/debuganalyzer/gui/main_window/SchedulingPage.cpp +++ b/src/apps/debuganalyzer/gui/main_window/SchedulingPage.cpp @@ -1492,6 +1492,7 @@ printf("failed to read event!\n"); case THREAD_BLOCK_TYPE_MUTEX: case THREAD_BLOCK_TYPE_RW_LOCK: case THREAD_BLOCK_TYPE_OTHER: + case THREAD_BLOCK_TYPE_OTHER_OBJECT: default: break; } diff --git a/src/apps/debuganalyzer/model/Model.cpp b/src/apps/debuganalyzer/model/Model.cpp index 0151d92055..90eb24567e 100644 --- a/src/apps/debuganalyzer/model/Model.cpp +++ b/src/apps/debuganalyzer/model/Model.cpp @@ -49,6 +49,7 @@ wait_object_type_name(uint32 type) case THREAD_BLOCK_TYPE_USER: return "user"; case THREAD_BLOCK_TYPE_OTHER: + case THREAD_BLOCK_TYPE_OTHER_OBJECT: return "other"; case THREAD_BLOCK_TYPE_SNOOZE: return "snooze"; diff --git a/src/apps/debuganalyzer/model_loader/ModelLoader.cpp b/src/apps/debuganalyzer/model_loader/ModelLoader.cpp index 09e34cadc9..5c284624e6 100644 --- a/src/apps/debuganalyzer/model_loader/ModelLoader.cpp +++ b/src/apps/debuganalyzer/model_loader/ModelLoader.cpp @@ -1004,6 +1004,7 @@ ModelLoader::_HandleThreadScheduled(uint32 cpu, case THREAD_BLOCK_TYPE_MUTEX: case THREAD_BLOCK_TYPE_RW_LOCK: case THREAD_BLOCK_TYPE_OTHER: + case THREAD_BLOCK_TYPE_OTHER_OBJECT: default: break; } diff --git a/src/bin/debug/time_stats/scheduling_analysis.cpp b/src/bin/debug/time_stats/scheduling_analysis.cpp index 1b66ed0a90..bd407732d9 100644 --- a/src/bin/debug/time_stats/scheduling_analysis.cpp +++ b/src/bin/debug/time_stats/scheduling_analysis.cpp @@ -115,6 +115,9 @@ wait_object_to_string(scheduling_analysis_wait_object* waitObject, char* buffer, case THREAD_BLOCK_TYPE_OTHER: sprintf(buffer, "other %p (%s)", object, waitObject->name); break; + case THREAD_BLOCK_TYPE_OTHER_OBJECT: + sprintf(buffer, "other object %p", object); + break; default: sprintf(buffer, "unknown %p", object); break; diff --git a/src/system/kernel/debug/system_profiler.cpp b/src/system/kernel/debug/system_profiler.cpp index 62a6a4749c..8a14549c19 100644 --- a/src/system/kernel/debug/system_profiler.cpp +++ b/src/system/kernel/debug/system_profiler.cpp @@ -1276,6 +1276,7 @@ SystemProfiler::_WaitObjectUsed(addr_t object, uint32 type) break; } + case THREAD_BLOCK_TYPE_OTHER_OBJECT: case THREAD_BLOCK_TYPE_SNOOZE: case THREAD_BLOCK_TYPE_SIGNAL: default: diff --git a/src/system/kernel/scheduler/scheduler_tracing.cpp b/src/system/kernel/scheduler/scheduler_tracing.cpp index d7313ee4be..2cae594c09 100644 --- a/src/system/kernel/scheduler/scheduler_tracing.cpp +++ b/src/system/kernel/scheduler/scheduler_tracing.cpp @@ -87,6 +87,9 @@ ScheduleThread::AddDump(TraceOutput& out) // We could print the string, but it might come from a // kernel module that has already been unloaded. break; + case THREAD_BLOCK_TYPE_OTHER_OBJECT: + out.Print("other object (%p)", fPreviousWaitObject); + break; default: out.Print("unknown (%p)", fPreviousWaitObject); break; diff --git a/src/system/kernel/scheduler/scheduling_analysis.cpp b/src/system/kernel/scheduler/scheduling_analysis.cpp index 68a3a44c5a..95041619fe 100644 --- a/src/system/kernel/scheduler/scheduling_analysis.cpp +++ b/src/system/kernel/scheduler/scheduling_analysis.cpp @@ -533,6 +533,7 @@ private: strlcpy(waitObject->name, name, sizeof(waitObject->name)); } + case THREAD_BLOCK_TYPE_OTHER_OBJECT: case THREAD_BLOCK_TYPE_SNOOZE: case THREAD_BLOCK_TYPE_SIGNAL: default: diff --git a/src/system/kernel/thread.cpp b/src/system/kernel/thread.cpp index db0adcc4ee..f90afcea6c 100644 --- a/src/system/kernel/thread.cpp +++ b/src/system/kernel/thread.cpp @@ -1728,6 +1728,10 @@ _dump_thread_info(Thread *thread, bool shortInfo) kprintf("other%*s", B_PRINTF_POINTER_WIDTH + 10, ""); break; + case THREAD_BLOCK_TYPE_OTHER_OBJECT: + kprintf("other %p ", thread->wait.object); + break; + default: kprintf("??? %p ", thread->wait.object); break; @@ -1815,6 +1819,10 @@ _dump_thread_info(Thread *thread, bool shortInfo) kprintf("other (%s)\n", (char*)thread->wait.object); break; + case THREAD_BLOCK_TYPE_OTHER_OBJECT: + kprintf("other (%p)\n", thread->wait.object); + break; + default: kprintf("unknown (%p)\n", thread->wait.object); break;