// 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;
  }