diff --git a/headers/private/system/syscalls.h b/headers/private/system/syscalls.h index 6a66dd3b23..fb33636c1a 100644 --- a/headers/private/system/syscalls.h +++ b/headers/private/system/syscalls.h @@ -86,7 +86,7 @@ extern status_t _kern_mutex_lock(int32* mutex, const char* name, uint32 flags, bigtime_t timeout); extern status_t _kern_mutex_unblock(int32* mutex, uint32 flags); extern status_t _kern_mutex_switch_lock(int32* fromMutex, uint32 fromFlags, - int32* toMutex, const char* name, uint32 toflags, + int32* toMutex, const char* name, uint32 toFlags, bigtime_t timeout); extern status_t _kern_mutex_sem_acquire(int32* sem, const char* name, uint32 flags, bigtime_t timeout); diff --git a/src/bin/debug/strace/mutex.cpp b/src/bin/debug/strace/mutex.cpp index 519e80fec9..123b011542 100644 --- a/src/bin/debug/strace/mutex.cpp +++ b/src/bin/debug/strace/mutex.cpp @@ -18,41 +18,53 @@ { name, #name } static const FlagsTypeHandler::FlagInfo kMutexFlagsInfo[] = { - FLAG_INFO_ENTRY(B_USER_MUTEX_LOCKED), - FLAG_INFO_ENTRY(B_USER_MUTEX_WAITING), - FLAG_INFO_ENTRY(B_USER_MUTEX_DISABLED), + FLAG_INFO_ENTRY(B_USER_MUTEX_LOCKED), + FLAG_INFO_ENTRY(B_USER_MUTEX_WAITING), + FLAG_INFO_ENTRY(B_USER_MUTEX_DISABLED), + + { 0, NULL } +}; + +static const FlagsTypeHandler::FlagInfo kMutexOptionFlagsInfo[] = { + FLAG_INFO_ENTRY(B_RELATIVE_TIMEOUT), + FLAG_INFO_ENTRY(B_ABSOLUTE_TIMEOUT), + FLAG_INFO_ENTRY(B_TIMEOUT_REAL_TIME_BASE), + + FLAG_INFO_ENTRY(B_USER_MUTEX_SHARED), + FLAG_INFO_ENTRY(B_USER_MUTEX_UNBLOCK_ALL), { 0, NULL } }; static FlagsTypeHandler::FlagsList kMutexFlags; +static FlagsTypeHandler::FlagsList kMutexOptionFlags; class MutexTypeHandler : public FlagsTypeHandler { public: - MutexTypeHandler() - : - FlagsTypeHandler(kMutexFlags) - { - } + MutexTypeHandler() + : + FlagsTypeHandler(kMutexFlags) + { + } string GetParameterValue(Context &context, Parameter *param, const void *address) { - void *data = *(void **)address; + void *data = *(void **)address; if (context.GetContents(Context::POINTER_VALUES)) { - int32 value, bytesRead; - status_t err = context.Reader().Read(data, &value, sizeof(value), bytesRead); - if (err != B_OK) - return context.FormatPointer(data); + int32 value, bytesRead; + status_t err = context.Reader().Read(data, &value, sizeof(value), bytesRead); + if (err != B_OK) + return context.FormatPointer(data); - string r = context.FormatPointer(data); - r += " ["; - r += RenderValue(context, (unsigned int)value); - r += "]"; - return r; - } + string r = context.FormatPointer(data); + r += " ["; + r += RenderValue(context, (unsigned int)value); + r += "]"; + return r; + } return context.FormatPointer(data); } @@ -67,17 +79,30 @@ public: void patch_mutex() { - for (int i = 0; kMutexFlagsInfo[i].name != NULL; i++) { - kMutexFlags.push_back(kMutexFlagsInfo[i]); - } + for (int i = 0; kMutexFlagsInfo[i].name != NULL; i++) + kMutexFlags.push_back(kMutexFlagsInfo[i]); + for (int i = 0; kMutexOptionFlagsInfo[i].name != NULL; i++) + kMutexOptionFlags.push_back(kMutexOptionFlagsInfo[i]); - Syscall *mutex_lock = get_syscall("_kern_mutex_lock"); - mutex_lock->GetParameter("mutex")->SetHandler(new MutexTypeHandler()); + Syscall *mutex_lock = get_syscall("_kern_mutex_lock"); + mutex_lock->GetParameter("mutex")->SetHandler(new MutexTypeHandler()); + mutex_lock->GetParameter("flags")->SetHandler(new FlagsTypeHandler(kMutexOptionFlags)); - Syscall *mutex_unlock = get_syscall("_kern_mutex_unblock"); - mutex_unlock->GetParameter("mutex")->SetHandler(new MutexTypeHandler()); + Syscall *mutex_unlock = get_syscall("_kern_mutex_unblock"); + mutex_unlock->GetParameter("mutex")->SetHandler(new MutexTypeHandler()); + mutex_unlock->GetParameter("flags")->SetHandler(new FlagsTypeHandler(kMutexOptionFlags)); - Syscall *mutex_switch_lock = get_syscall("_kern_mutex_switch_lock"); - mutex_switch_lock->GetParameter("fromMutex")->SetHandler(new MutexTypeHandler()); - mutex_switch_lock->GetParameter("toMutex")->SetHandler(new MutexTypeHandler()); + Syscall *mutex_switch_lock = get_syscall("_kern_mutex_switch_lock"); + mutex_switch_lock->GetParameter("fromMutex")->SetHandler(new MutexTypeHandler()); + mutex_switch_lock->GetParameter("fromFlags")->SetHandler( + new FlagsTypeHandler(kMutexOptionFlags)); + mutex_switch_lock->GetParameter("toMutex")->SetHandler(new MutexTypeHandler()); + mutex_switch_lock->GetParameter("toFlags")->SetHandler( + new FlagsTypeHandler(kMutexOptionFlags)); + + Syscall *mutex_sem_acquire = get_syscall("_kern_mutex_sem_acquire"); + mutex_sem_acquire->GetParameter("flags")->SetHandler(new FlagsTypeHandler(kMutexOptionFlags)); + + Syscall *mutex_sem_release = get_syscall("_kern_mutex_sem_release"); + mutex_sem_release->GetParameter("flags")->SetHandler(new FlagsTypeHandler(kMutexOptionFlags)); }