////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    public CLangDebuggeeThread GetThread (uint threadId)
    {
      LoggingUtils.PrintFunction ();

      DebuggeeThread thread = null;

      lock (m_debugThreads)
      {
        m_debugThreads.TryGetValue (threadId, out thread);
      }

      return (CLangDebuggeeThread) thread;
    }
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public DebuggeeStackFrame(DebugEngine engine, DebuggeeThread thread, string frameName)
        {
            m_debugEngine = engine;

            m_thread = thread;

            m_codeContext = null;

            m_documentContext = null;

            m_property = new DebuggeeProperty(engine, this, frameName, string.Empty);

            m_stackRegisters = new ConcurrentDictionary <string, DebuggeeProperty> ();

            m_stackArguments = new ConcurrentDictionary <string, DebuggeeProperty> ();

            m_stackLocals = new ConcurrentDictionary <string, DebuggeeProperty> ();

            m_customExpressions = new ConcurrentDictionary <string, DebuggeeProperty> ();
        }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    public bool RemoveThread (uint threadId, uint exitCode)
    {
      LoggingUtils.PrintFunction ();

      DebuggeeThread thread = null;

      lock (m_debugThreads)
      {
        if (m_debugThreads.TryGetValue (threadId, out thread))
        {
          m_debugThreads.Remove (threadId);
        }
      }

      if (thread != null)
      {
        m_debugger.Engine.Broadcast (new DebugEngineEvent.ThreadDestroy (exitCode), DebugProgram, thread);
      }

      return (thread != null);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    public CLangDebuggeeThread AddThread (uint threadId)
    {
      LoggingUtils.PrintFunction ();

      DebuggeeThread thread = null;

      lock (m_debugThreads)
      {
        if (!m_debugThreads.TryGetValue (threadId, out thread))
        {
          thread = new CLangDebuggeeThread (m_debugger, this, threadId);

          m_debugThreads.Add (threadId, thread);
        }
      }

      if (thread != null)
      {
        m_debugger.Engine.Broadcast (new DebugEngineEvent.ThreadCreate (), DebugProgram, thread);
      }

      return (CLangDebuggeeThread) thread;
    }