in tools/lldbmacros/kcdata.py [0:0]
def formatWaitInfo(info):
s = 'thread %d: ' % info['waiter'];
type = info['wait_type']
context = info['context']
owner = info['owner']
if type == kThreadWaitKernelMutex:
s += 'kernel mutex %x' % context
if owner == STACKSHOT_WAITOWNER_MTXSPIN:
s += " in spin mode"
elif owner:
s += " owned by thread %u" % owner
else:
s += "with unknown owner"
elif type == kThreadWaitPortReceive:
s += "mach_msg receive on "
if owner == STACKSHOT_WAITOWNER_PORT_LOCKED:
s += "locked port %x" % context
elif owner == STACKSHOT_WAITOWNER_INTRANSIT:
s += "intransit port %x" % context
elif owner:
s += "port %x name %x" % (context, owner)
else:
s += "port %x" % context
elif type == kThreadWaitPortSetReceive:
if owner == STACKSHOT_WAITOWNER_PSET_LOCKED:
s += "mach_msg receive on locked port set %x" % context
else:
s += "mach_msg receive on port set %x" % context
elif type == kThreadWaitPortSend:
s += "mach_msg send on "
if owner == STACKSHOT_WAITOWNER_PORT_LOCKED:
s += "locked port %x" % context
elif owner == STACKSHOT_WAITOWNER_INTRANSIT:
s += "intransit port %x" % context
elif owner == STACKSHOT_WAITOWNER_KERNEL:
s += "port %x owned by kernel" % context
elif owner:
s += "port %x owned by pid %d" % (context, owner)
else:
s += "port %x with unknown owner" % context
elif type == kThreadWaitPortSendInTransit:
s += "mach_msg send on port %x in transit to " % context
if owner:
s += "port %x" % owner
else:
s += "unknown port"
elif type == kThreadWaitSemaphore:
s += "semaphore port %x " % context
if owner:
s += "owned by pid %d" % owner
else:
s += "with unknown owner"
elif type == kThreadWaitKernelRWLockRead:
s += "krwlock %x for reading" % context
elif type == kThreadWaitKernelRWLockWrite:
s += "krwlock %x for writing" % context
elif type == kThreadWaitKernelRWLockUpgrade:
s += "krwlock %x for upgrading" % context
elif type == kThreadWaitUserLock:
if owner:
s += "unfair lock %x owned by thread %d" % (context, owner)
else:
s += "spin lock %x" % context
elif type == kThreadWaitPThreadMutex:
s += "pthread mutex %x" % context
if owner:
s += " owned by thread %d" % owner
else:
s += " with unknown owner"
elif type == kThreadWaitPThreadRWLockRead:
s += "pthread rwlock %x for reading" % context
elif type == kThreadWaitPThreadRWLockWrite:
s += "pthread rwlock %x for writing" % context
elif type == kThreadWaitPThreadCondVar:
s += "pthread condvar %x" % context
elif type == kThreadWaitWorkloopSyncWait:
s += "workloop sync wait"
if owner == STACKSHOT_WAITOWNER_SUSPENDED:
s += ", suspended"
elif owner == STACKSHOT_WAITOWNER_THREQUESTED:
s += ", thread requested"
elif owner != 0:
s += ", owned by thread %u" % owner
else:
s += ", unknown owner"
s += ", workloop id %x" % context
elif type == kThreadWaitOnProcess:
if owner == 2**64-1:
s += "waitpid, for any children"
elif 2**32 <= owner and owner < 2**64-1:
s += "waitpid, for process group %d" % abs(owner - 2**64)
else:
s += "waitpid, for pid %d" % owner
elif type == kThreadWaitSleepWithInheritor:
if owner == 0:
s += "turnstile, held waitq"
else:
s += "turnstile, pushing thread %d" % owner
elif type == kThreadWaitEventlink:
if owner == 0:
s += "eventlink, held waitq"
else:
s += "eventlink, signaled by thread %d" % owner
elif type == kThreadWaitCompressor:
s += "in compressor segment %x, busy for thread %d" % (context, owner)
else:
s += "unknown type %d (owner %d, context %x)" % (type, owner, context)
return s