示例#1
0
        uint IEventsDriver.WaitForEvents(uint powerLevel, uint WakeupSystemEvents, uint Timeout_Milliseconds)
        {
            TimingServices timingServices = this.Emulator.TimingServices;
            int            timeout        = (int)Timeout_Milliseconds;
            ulong          end            = timingServices.CurrentTicks + (ulong)(timeout * TimeSpan.TicksPerMillisecond);
            uint           res;

            Debug.Assert(timeout >= 0 || WakeupSystemEvents != 0);

            while ((res = ((IEventsDriver)this).MaskedRead(WakeupSystemEvents)) == 0)
            {
                if (!timingServices.DequeueAndExecuteContinuation())
                {
                    if (timeout != Timeout.Infinite)
                    {
                        ulong now = timingServices.CurrentTicks;

                        if (now >= end)
                        {
                            break;
                        }
                        else
                        {
                            timeout = (int)((end - now) / TimeSpan.TicksPerMillisecond);
                            Debug.Assert(timeout >= 0);
                        }
                    }

                    if (WaitHandle.WaitAny(_waitHandles, timeout, false) == c_WaitHandleShutdown)
                    {
                        break;
                    }
                }
            }

            return(res);
        }
示例#2
0
        private void StartInternal()
        {
            Utility.SetCurrentThreadAffinity();

            // Set the verbose flag
            if (_cmdLn.verbose)
            {
                _verbose = true;
            }

            // 1) Create all the EmulatorComponents first and configure them properly based on the config file
            if (_cmdLn.useDefaultConfig)
            {
                LoadDefaultComponents();
            }

            for (int iConfig = 0; iConfig < _cmdLn.configFiles.Count; iConfig++)
            {
                string configFileName = _cmdLn.configFiles[iConfig];
                ApplyConfig(configFileName);
            }

            string defaultConfigFileName = Application.ExecutablePath + ".emulatorconfig";

            if (File.Exists(defaultConfigFileName))
            {
                ApplyConfig(defaultConfigFileName);
            }

            // 2) Calling Setup() on all EmulatorComponents to allow each component to check for the
            //    validity of each properties, allocate memory, ... etc.
            SetupComponent();

            CheckForRequiredComponents();

            // 3) Now that the components are in the correct state. Register each component with its collection,
            //    if there is one.
            RegisterComponentsWithCollection();

            try
            {
                //Initialization of EmulatorNative required before EmulatorComponents
                //TimingServices, for example, is dependent on EmulatorNative initialization
                _emulatorNative.Initialize(this.ManagedHal);

                // 4) Call InitializeComponent() on all EmulatorComponents to put each component into a
                //    working / running state.
                InitializeComponent();

                // 5) Load the assemblies
                LoadAssemblies();

                // 6) Get into the initial state
                if (_cmdLn.waitForDebuggerOnStartup)
                {
                    _emulatorNative.WaitForDebuggerOnStartup();
                }

                if (String.IsNullOrEmpty(_cmdLn.commandLineArguments) == false)
                {
                    _emulatorNative.SetCommandLineArguments(_cmdLn.commandLineArguments);
                }

                _emulatorState = EmulatorState.Running;

                //start time -- this allows components to hook into events before execution starts
                TimingServices.ResumeTime();

                // 7) We start the emulator.

                this.Run();
            }
            catch (EmulatorException e)
            {
                // if we are shutting down and received the unexpected shut down exception, we'll handle the exception
                if (e.ErrorCode == CLR_ERRORCODE.CLR_E_SHUTTING_DOWN)
                {
                    Debug.Assert(this.State >= EmulatorState.ShutDown);
                }
                else
                {
                    // otherwise, re-throw.
                    throw;
                }
            }
            finally
            {
                bool needUnintialization = (this.State >= EmulatorState.Initialize);

                Stop();

                if (needUnintialization)
                {
                    UninitializeComponent();
                }
            }
        }