// FIBER THREAD void run() { // make local copy of m_function and m_params if (m_async) { try { s_fiber_data->m_fiberThread = true; ExecutionContext *context = g_context.getNoCheck(); if (context && m_context) { context->fiberInit(m_context, m_refMap); const VirtualHost *vhost = m_context->getVirtualHost(); if (vhost) { VirtualHost::SetCurrent((VirtualHost *)vhost); } m_context = context; // switching role } AutoloadHandler *handler = AutoloadHandler::s_instance.get(); if (handler && m_autoload_handler) { handler->fiberInit(m_autoload_handler, m_refMap); m_autoload_handler = handler; // switching role } (m_evalState = Eval::RequestEvalState::Get())-> fiberInit(m_unmarshaled_evalState, m_refMap); m_function = m_function.fiberMarshal(m_refMap); m_params = m_params.fiberMarshal(m_refMap); ThreadInfo::s_threadInfo->m_globals = m_global_variables = get_global_variables(); fiber_marshal_global_state(m_global_variables, m_unmarshaled_global_variables, m_refMap); } catch (const Exception &e) { m_fatal = String(e.getMessage()); } catch (...) { m_fatal = String("unknown exception was thrown"); } Lock lock(this); m_ready = true; notify(); } if (m_fatal.isNull()) { try { m_return = f_call_user_func_array(m_function, m_params); } catch (const ExitException &e) { m_exit = true; } catch (const Exception &e) { m_fatal = String(e.getMessage()); } catch (Object e) { m_exception = e; } catch (...) { m_fatal = String("unknown exception was thrown"); } } { Lock lock(this); m_done = true; notify(); } { Lock lock(m_thread); m_thread->notify(); } }