// MAIN THREAD Variant getResults(FiberAsyncFunc::Strategy default_strategy, vector<pair<string, char> > &resolver) { if (!m_async) return syncGetResults(); { Lock lock(this); while (!m_done) wait(); } Variant unmarshaled_return; try { ExecutionContext *context = g_context.getNoCheck(); if (context && m_context) { context->fiberExit(m_context, m_refMap); m_context = NULL; } AutoloadHandler *handler = AutoloadHandler::s_instance.get(); if (handler && m_autoload_handler) { handler->fiberExit(m_autoload_handler, m_refMap, default_strategy); m_autoload_handler = NULL; } if (m_evalState) { Eval::RequestEvalState::Get()->fiberExit(m_evalState, m_refMap, default_strategy); } if (m_global_variables) { fiber_unmarshal_global_state(get_global_variables(), m_global_variables, m_refMap, default_strategy, resolver); } // these are needed in case they have references or objects if (!m_refMap.empty()) { m_function.fiberUnmarshal(m_refMap); m_params.fiberUnmarshal(m_refMap); } Object unmarshaled_exception = m_exception.fiberUnmarshal(m_refMap); unmarshaled_return = m_return.fiberUnmarshal(m_refMap); if (m_exit) { throw ExitException(0); } if (!m_fatal.isNull()) { throw FatalErrorException(m_fatal.data()); } if (!m_exception.isNull()) { throw unmarshaled_exception; } } catch (...) { cleanup(); Lock lock(this); m_delete = true; notify(); throw; } cleanup(); Lock lock(this); m_delete = true; notify(); return unmarshaled_return; }