strace: Add FlagsTypeHandler for the mutex option flags.
So that MUTEX_SHARED etc. are displayed in strace output. Also fix indentation, and the name of the "toFlags" parameter in syscall definitions.
This commit is contained in:
@@ -86,7 +86,7 @@ extern status_t _kern_mutex_lock(int32* mutex, const char* name,
|
|||||||
uint32 flags, bigtime_t timeout);
|
uint32 flags, bigtime_t timeout);
|
||||||
extern status_t _kern_mutex_unblock(int32* mutex, uint32 flags);
|
extern status_t _kern_mutex_unblock(int32* mutex, uint32 flags);
|
||||||
extern status_t _kern_mutex_switch_lock(int32* fromMutex, uint32 fromFlags,
|
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);
|
bigtime_t timeout);
|
||||||
extern status_t _kern_mutex_sem_acquire(int32* sem, const char* name,
|
extern status_t _kern_mutex_sem_acquire(int32* sem, const char* name,
|
||||||
uint32 flags, bigtime_t timeout);
|
uint32 flags, bigtime_t timeout);
|
||||||
|
|||||||
@@ -18,41 +18,53 @@
|
|||||||
{ name, #name }
|
{ name, #name }
|
||||||
|
|
||||||
static const FlagsTypeHandler::FlagInfo kMutexFlagsInfo[] = {
|
static const FlagsTypeHandler::FlagInfo kMutexFlagsInfo[] = {
|
||||||
FLAG_INFO_ENTRY(B_USER_MUTEX_LOCKED),
|
FLAG_INFO_ENTRY(B_USER_MUTEX_LOCKED),
|
||||||
FLAG_INFO_ENTRY(B_USER_MUTEX_WAITING),
|
FLAG_INFO_ENTRY(B_USER_MUTEX_WAITING),
|
||||||
FLAG_INFO_ENTRY(B_USER_MUTEX_DISABLED),
|
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 }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static FlagsTypeHandler::FlagsList kMutexFlags;
|
static FlagsTypeHandler::FlagsList kMutexFlags;
|
||||||
|
static FlagsTypeHandler::FlagsList kMutexOptionFlags;
|
||||||
|
|
||||||
|
|
||||||
class MutexTypeHandler : public FlagsTypeHandler {
|
class MutexTypeHandler : public FlagsTypeHandler {
|
||||||
public:
|
public:
|
||||||
MutexTypeHandler()
|
MutexTypeHandler()
|
||||||
:
|
:
|
||||||
FlagsTypeHandler(kMutexFlags)
|
FlagsTypeHandler(kMutexFlags)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
string GetParameterValue(Context &context, Parameter *param,
|
string GetParameterValue(Context &context, Parameter *param,
|
||||||
const void *address)
|
const void *address)
|
||||||
{
|
{
|
||||||
void *data = *(void **)address;
|
void *data = *(void **)address;
|
||||||
|
|
||||||
if (context.GetContents(Context::POINTER_VALUES)) {
|
if (context.GetContents(Context::POINTER_VALUES)) {
|
||||||
int32 value, bytesRead;
|
int32 value, bytesRead;
|
||||||
status_t err = context.Reader().Read(data, &value, sizeof(value), bytesRead);
|
status_t err = context.Reader().Read(data, &value, sizeof(value), bytesRead);
|
||||||
if (err != B_OK)
|
if (err != B_OK)
|
||||||
return context.FormatPointer(data);
|
return context.FormatPointer(data);
|
||||||
|
|
||||||
string r = context.FormatPointer(data);
|
string r = context.FormatPointer(data);
|
||||||
r += " [";
|
r += " [";
|
||||||
r += RenderValue(context, (unsigned int)value);
|
r += RenderValue(context, (unsigned int)value);
|
||||||
r += "]";
|
r += "]";
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.FormatPointer(data);
|
return context.FormatPointer(data);
|
||||||
}
|
}
|
||||||
@@ -67,17 +79,30 @@ public:
|
|||||||
void
|
void
|
||||||
patch_mutex()
|
patch_mutex()
|
||||||
{
|
{
|
||||||
for (int i = 0; kMutexFlagsInfo[i].name != NULL; i++) {
|
for (int i = 0; kMutexFlagsInfo[i].name != NULL; i++)
|
||||||
kMutexFlags.push_back(kMutexFlagsInfo[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");
|
Syscall *mutex_lock = get_syscall("_kern_mutex_lock");
|
||||||
mutex_lock->GetParameter("mutex")->SetHandler(new MutexTypeHandler());
|
mutex_lock->GetParameter("mutex")->SetHandler(new MutexTypeHandler());
|
||||||
|
mutex_lock->GetParameter("flags")->SetHandler(new FlagsTypeHandler(kMutexOptionFlags));
|
||||||
|
|
||||||
Syscall *mutex_unlock = get_syscall("_kern_mutex_unblock");
|
Syscall *mutex_unlock = get_syscall("_kern_mutex_unblock");
|
||||||
mutex_unlock->GetParameter("mutex")->SetHandler(new MutexTypeHandler());
|
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");
|
Syscall *mutex_switch_lock = get_syscall("_kern_mutex_switch_lock");
|
||||||
mutex_switch_lock->GetParameter("fromMutex")->SetHandler(new MutexTypeHandler());
|
mutex_switch_lock->GetParameter("fromMutex")->SetHandler(new MutexTypeHandler());
|
||||||
mutex_switch_lock->GetParameter("toMutex")->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));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user