public void OnApplicationQuit()
        {
            // just to be sure...
            m_runThread = false;
            m_workerThread?.Join();
            m_workerThread = null;
            m_client       = null;

            MajorDomoClient.Terminate();
        }
        public void Awake()
        {
            configuration.LoadConfiguration();

            // force instantiation
            m_client = new MajorDomoClient();

            m_entitiesToPublish = new List <EntityData>();
            m_entitiesToRevoke  = new List <EntityData>();
            m_entitiesToControl = new List <EntityData>();
            m_entitiesToRelease = new List <EntityData>();

            m_registeredClients   = new List <ClientData>();
            m_unregisteredClients = new List <ClientData>();
            m_processingClients   = new List <ClientData>();

            m_publishedEntities  = new List <EntityData>();
            m_revokedEntities    = new List <EntityData>();
            m_controlledEntities = new List <EntityData>();
            m_processingEntities = new List <EntityData>();

            m_broadcasts           = new List <Broadcast>();
            m_processingBroadcasts = new List <Broadcast>();

            m_serverShutdown = new List <bool>();

            m_state               = ManagerState.Preparing;
            m_prevState           = m_state;
            m_connectionRequested = false;

            m_runThread    = true;
            m_workerThread = new Thread(WorkerThread);
            m_workerThread.Start();

            ReplaceSpecialApplicationNameParts();

            if (configuration.AutoConnectDelay > 0)
            {
                StartCoroutine(AutoConnectAsync());
            }

            // auto-register objects that use MajorDomo
            IAutoRegister[] autoRegisterObjects = Resources.FindObjectsOfTypeAll <SynchronisedGameObject>();
            foreach (var obj in autoRegisterObjects)
            {
                obj.RegisterWithMajorDomoManager();
            }
        }