status_t DebugReportGenerator::_ResolveValueIfNeeded(ValueNode* node, StackFrame* frame, int32 maxDepth) { status_t result = B_OK; if (node->LocationAndValueResolutionState() == VALUE_NODE_UNRESOLVED) { fWaitingNode = node; fListener->ValueNodeValueRequested(frame->GetCpuState(), fNodeManager->GetContainer(), node); do { result = acquire_sem(fTeamDataSem); } while (result == B_INTERRUPTED); } if (node->LocationAndValueResolutionState() == B_OK && maxDepth > 0) { AutoLocker<ValueNodeContainer> containerLocker( fNodeManager->GetContainer()); for (int32 i = 0; i < node->CountChildren(); i++) { ValueNodeChild* child = node->ChildAt(i); containerLocker.Unlock(); result = fNodeManager->AddChildNodes(child); if (result != B_OK) continue; // since in the case of a pointer to a compound we hide // the intervening compound, don't consider the hidden node // a level for the purposes of depth traversal if (node->GetType()->ResolveRawType(false)->Kind() == TYPE_ADDRESS && child->GetType()->ResolveRawType(false)->Kind() == TYPE_COMPOUND) { _ResolveValueIfNeeded(child->Node(), frame, maxDepth); } else _ResolveValueIfNeeded(child->Node(), frame, maxDepth - 1); containerLocker.Lock(); } } return result; }