Array c_WaitableWaitHandle::t_getdependencystack() { Array result = Array::Create(); if (isFinished()) return result; hphp_hash_set<int64_t> visited; auto wait_handle = this; auto session = AsioSession::Get(); while (wait_handle != nullptr) { result.append(wait_handle); visited.insert(wait_handle->t_getid()); auto context_idx = wait_handle->getContextIdx(); // 1. find parent in the same context auto p = wait_handle->getParentChain().firstInContext(context_idx); if (p && visited.find(p->t_getid()) == visited.end()) { wait_handle = p; continue; } // 2. cross the context boundary auto context = session->getContext(context_idx); if (!context) { break; } wait_handle = c_ResumableWaitHandle::getRunning(context->getSavedFP()); auto target_context_idx = wait_handle ? wait_handle->getContextIdx() : 0; while (context_idx > target_context_idx) { --context_idx; result.append(null_object); } } return result; }
Array c_WaitableWaitHandle::getDependencyStack() { if (isFinished()) return empty_array(); Array result = Array::Create(); hphp_hash_set<c_WaitableWaitHandle*> visited; auto current_handle = this; auto session = AsioSession::Get(); while (current_handle != nullptr) { result.append(Variant{current_handle}); visited.insert(current_handle); auto context_idx = current_handle->getContextIdx(); // 1. find parent in the same context auto p = current_handle->getParentChain().firstInContext(context_idx); if (p && visited.find(p) == visited.end()) { current_handle = p; continue; } // 2. cross the context boundary auto context = session->getContext(context_idx); if (!context) { break; } current_handle = c_ResumableWaitHandle::getRunning(context->getSavedFP()); auto target_context_idx = current_handle ? current_handle->getContextIdx() : 0; while (context_idx > target_context_idx) { --context_idx; result.append(null_object); } } return result; }