blob: 32d75db3d90385ab0eb0b47ff60e04c61b4449fc [file] [log] [blame]
//
// Copyright (c) 2010-2018 Antmicro
//
// This file is licensed under the MIT License.
// Full license text is available in 'licenses/MIT.txt'.
//
using System.Threading;
using Antmicro.Renode;
using Antmicro.Renode.UI;
using System.IO;
using System;
using Antmicro.Renode.Utilities;
using Antmicro.Renode.RobotFramework;
using Antmicro.Renode.Logging;
namespace Antmicro.Renode
{
public class Program
{
[STAThread]
public static void Main(string[] args)
{
AppDomain.CurrentDomain.ProcessExit += (_, __) => Emulator.Exit();
var options = new Options();
var optionsParser = new OptionsParser.OptionsParser();
var optionsParsed = optionsParser.Parse(options, args);
ConfigureEnvironment(options);
/*
We noticed that the static constructors' initialization chain breaks non-deterministically on some Mono versions crashing Renode with NullReferenceException.
In the current version, EmulationManager's static constructor calls TypeManager that in turn uses Logger; Logger however requires EmulationManager to be functional.
This circular dependency seems to be a problem.
Here we explicitly initialize EmulationManager as this seems to resolve the problem. This is just a workaround, until we refactor the code of the initialization phase.
*/
Core.EmulationManager.RebuildInstance();
var thread = new Thread(() =>
{
try
{
if(optionsParsed)
{
Antmicro.Renode.UI.CommandLineInterface.Run(options, (context) =>
{
if(options.RobotFrameworkRemoteServerPort >= 0)
{
var rf = new RobotFrameworkEngine();
context.RegisterSurrogate(typeof(RobotFrameworkEngine), rf);
rf.Start(options.RobotFrameworkRemoteServerPort);
}
});
}
}
finally
{
Emulator.FinishExecutionAsMainThread();
}
});
thread.Start();
Emulator.ExecuteAsMainThread();
}
private static void ConfigureEnvironment(Options options)
{
//Plain mode must be set before the window title
ConsoleBackend.Instance.PlainMode = options.Plain;
ConsoleBackend.Instance.WindowTitle = "Renode";
string configFile = null;
if(options.ConfigFile != null)
{
configFile = options.ConfigFile;
}
else if(Misc.TryGetRootDirectory(out var rootDir))
{
var localConfig = Path.Combine(rootDir, "renode.config");
if(File.Exists(localConfig))
{
configFile = localConfig;
}
}
ConfigurationManager.Initialize(configFile ?? Path.Combine(Emulator.UserDirectoryPath, "config"));
// set Termsharp as a default terminal if there is none already
ConfigurationManager.Instance.Get("general", "terminal", "Termsharp");
ConsoleBackend.Instance.ReportRepeatingLines = !ConfigurationManager.Instance.Get("general", "collapse-repeated-log-entries", true);
}
}
}