mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-11 19:36:28 +00:00
Plugins - Added timeout for plugin enable
Plugins - Delete lock file even on exception, only leave it in place on crash Plugins - Added --ignore-plugin-lock startup argument UI - Renamed -autorun argument to --autorun
This commit is contained in:
1 parent
c80e5e42aa
commit
58e07ae5bd
11 files changed
+56
-27
No files matched your search
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Artemis.Core.Plugins.Abstract.ViewModels;
|
||||
using Artemis.Core.Plugins.Exceptions;
|
||||
using Artemis.Core.Plugins.Models;
|
||||
@@ -11,7 +12,7 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
/// </summary>
|
||||
public abstract class Plugin : IDisposable
|
||||
{
|
||||
public PluginInfo PluginInfo { get; internal set; }
|
||||
public PluginInfo PluginInfo { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether the plugin is enabled
|
||||
@@ -60,7 +61,7 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
// Don't wrap existing lock exceptions, simply rethrow them
|
||||
if (PluginInfo.LoadException is ArtemisPluginLockException)
|
||||
throw PluginInfo.LoadException;
|
||||
|
||||
|
||||
throw new ArtemisPluginLockException(PluginInfo.LoadException);
|
||||
}
|
||||
|
||||
@@ -68,9 +69,15 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
PluginInfo.Enabled = true;
|
||||
PluginInfo.CreateLockFile();
|
||||
|
||||
InternalEnablePlugin();
|
||||
OnPluginEnabled();
|
||||
// Allow up to 15 seconds for plugins to activate.
|
||||
// This means plugins that need more time should do their long running tasks in a background thread, which is intentional
|
||||
// Little meh: Running this from a different thread could cause deadlocks
|
||||
var enableTask = Task.Run(InternalEnablePlugin);
|
||||
if (!enableTask.Wait(TimeSpan.FromSeconds(15)))
|
||||
throw new ArtemisPluginException(PluginInfo, "Plugin load timeout");
|
||||
|
||||
PluginInfo.LoadException = null;
|
||||
OnPluginEnabled();
|
||||
}
|
||||
// If enable failed, put it back in a disabled state
|
||||
catch (Exception e)
|
||||
@@ -80,8 +87,11 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
PluginInfo.LoadException = e;
|
||||
throw;
|
||||
}
|
||||
|
||||
PluginInfo.DeleteLockFile();
|
||||
finally
|
||||
{
|
||||
if (!(PluginInfo.LoadException is ArtemisPluginLockException))
|
||||
PluginInfo.DeleteLockFile();
|
||||
}
|
||||
}
|
||||
else if (!enable && Enabled)
|
||||
{
|
||||
|
||||
@@ -63,6 +63,7 @@ namespace Artemis.Core.Services
|
||||
public TimeSpan FrameTime { get; private set; }
|
||||
public bool PluginUpdatingDisabled { get; set; }
|
||||
public bool ModuleRenderingDisabled { get; set; }
|
||||
public List<string> StartupArguments { get; set; }
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
@@ -83,7 +84,7 @@ namespace Artemis.Core.Services
|
||||
|
||||
// Initialize the services
|
||||
_pluginService.CopyBuiltInPlugins();
|
||||
_pluginService.LoadPlugins();
|
||||
_pluginService.LoadPlugins(StartupArguments.Contains("--ignore-plugin-lock"));
|
||||
|
||||
var surfaceConfig = _surfaceService.ActiveSurface;
|
||||
if (surfaceConfig != null)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Artemis.Core.Events;
|
||||
|
||||
namespace Artemis.Core.Services.Interfaces
|
||||
@@ -25,6 +26,11 @@ namespace Artemis.Core.Services.Interfaces
|
||||
/// </summary>
|
||||
bool ModuleRenderingDisabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a list of startup arguments
|
||||
/// </summary>
|
||||
List<string> StartupArguments { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the core, only call once
|
||||
/// </summary>
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace Artemis.Core.Services.Interfaces
|
||||
/// <summary>
|
||||
/// Loads all installed plugins. If plugins already loaded this will reload them all
|
||||
/// </summary>
|
||||
void LoadPlugins();
|
||||
void LoadPlugins(bool ignorePluginLock);
|
||||
|
||||
/// <summary>
|
||||
/// Unloads all installed plugins.
|
||||
|
||||
@@ -107,8 +107,7 @@ namespace Artemis.Core.Services
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void LoadPlugins()
|
||||
public void LoadPlugins(bool ignorePluginLock)
|
||||
{
|
||||
if (LoadingPlugins)
|
||||
throw new ArtemisCoreException("Cannot load plugins while a previous load hasn't been completed yet.");
|
||||
@@ -150,7 +149,7 @@ namespace Artemis.Core.Services
|
||||
{
|
||||
try
|
||||
{
|
||||
EnablePlugin(pluginInfo.Instance, true);
|
||||
EnablePlugin(pluginInfo.Instance, !ignorePluginLock);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
@@ -305,13 +304,13 @@ namespace Artemis.Core.Services
|
||||
{
|
||||
// On an auto-enable, ensure PluginInfo.Enabled is true even if enable failed, that way a failure on auto-enable does
|
||||
// not affect the user's settings
|
||||
if (isAutoEnable)
|
||||
if (isAutoEnable)
|
||||
plugin.PluginInfo.Enabled = true;
|
||||
|
||||
plugin.PluginInfo.ApplyToEntity();
|
||||
_pluginRepository.SavePlugin(plugin.PluginInfo.PluginEntity);
|
||||
|
||||
if (plugin.PluginInfo.Enabled)
|
||||
if (plugin.PluginInfo.Enabled)
|
||||
_logger.Debug("Successfully enabled plugin {pluginInfo}", plugin.PluginInfo);
|
||||
}
|
||||
}
|
||||
@@ -351,10 +350,7 @@ namespace Artemis.Core.Services
|
||||
/// <inheritdoc />
|
||||
public PluginInfo GetPluginInfo(Plugin plugin)
|
||||
{
|
||||
lock (_plugins)
|
||||
{
|
||||
return _plugins.FirstOrDefault(p => p.Instance == plugin);
|
||||
}
|
||||
return _plugins.FirstOrDefault(p => p.Instance == plugin);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -366,10 +362,7 @@ namespace Artemis.Core.Services
|
||||
/// <inheritdoc />
|
||||
public List<T> GetPluginsOfType<T>() where T : Plugin
|
||||
{
|
||||
lock (_plugins)
|
||||
{
|
||||
return _plugins.Where(p => p.Enabled && p.Instance is T).Select(p => (T) p.Instance).ToList();
|
||||
}
|
||||
return _plugins.Where(p => p.Enabled && p.Instance is T).Select(p => (T) p.Instance).ToList();
|
||||
}
|
||||
|
||||
public Plugin GetDevicePlugin(IRGBDevice rgbDevice)
|
||||
@@ -393,7 +386,7 @@ namespace Artemis.Core.Services
|
||||
Directory.CreateDirectory(pluginDirectory.FullName);
|
||||
|
||||
builtInPluginDirectory.CopyFilesRecursively(pluginDirectory);
|
||||
if (createLockFile)
|
||||
if (createLockFile)
|
||||
File.Create(Path.Combine(pluginDirectory.FullName, "artemis.lock")).Close();
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user