mirror of
https://github.com/fadden/6502bench.git
synced 2025-08-09 05:24:58 +00:00
Fix proxy object timeout in visualization editor
The visualization editor was retaining an IPlugin reference for the visualization generator selection combo box. After 5 minutes the proxy object timed out, so if you left the editor open and inactive for that long you'd start getting weird errors. We now keep the script identifier string and use that to get a fresh IPlugin proxy object.
This commit is contained in:
@@ -132,14 +132,16 @@ namespace PluginCommon {
|
|||||||
/// Generates a list of references to instances of active plugins.
|
/// Generates a list of references to instances of active plugins.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Newly-created list of plugin references.</returns>
|
/// <returns>Newly-created list of plugin references.</returns>
|
||||||
public List<IPlugin> GetActivePlugins() {
|
public Dictionary<string, IPlugin> GetActivePlugins() {
|
||||||
List<IPlugin> list = new List<IPlugin>(mActivePlugins.Count);
|
Dictionary<string, IPlugin> dict =
|
||||||
|
new Dictionary<string, IPlugin>(mActivePlugins.Count);
|
||||||
foreach (KeyValuePair<string, IPlugin> kvp in mActivePlugins) {
|
foreach (KeyValuePair<string, IPlugin> kvp in mActivePlugins) {
|
||||||
list.Add(kvp.Value);
|
// copy the contents; probably not necessary across AppDomain
|
||||||
|
dict.Add(kvp.Key, kvp.Value);
|
||||||
}
|
}
|
||||||
Debug.WriteLine("PluginManager: returning " + list.Count + " plugins (id=" +
|
Debug.WriteLine("PluginManager: returning " + dict.Count + " plugins (id=" +
|
||||||
AppDomain.CurrentDomain.Id + ")");
|
AppDomain.CurrentDomain.Id + ")");
|
||||||
return list;
|
return dict;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -2496,9 +2496,12 @@ namespace SourceGen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Punch-through functions; trying to avoid exposing ScriptManager for now.
|
// Punch-through functions; trying to avoid exposing ScriptManager for now.
|
||||||
public List<PluginCommon.IPlugin> GetActivePlugins() {
|
public Dictionary<string, PluginCommon.IPlugin> GetActivePlugins() {
|
||||||
return mScriptManager.GetActivePlugins();
|
return mScriptManager.GetActivePlugins();
|
||||||
}
|
}
|
||||||
|
public PluginCommon.IPlugin GetPlugin(string scriptIdent) {
|
||||||
|
return mScriptManager.GetInstance(scriptIdent);
|
||||||
|
}
|
||||||
public void PrepareScripts(PluginCommon.IApplication appRef) {
|
public void PrepareScripts(PluginCommon.IApplication appRef) {
|
||||||
mScriptManager.PrepareScripts(appRef);
|
mScriptManager.PrepareScripts(appRef);
|
||||||
}
|
}
|
||||||
|
@@ -140,15 +140,17 @@ namespace SourceGen.Sandbox {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Newly-created list of plugin references.</returns>
|
/// <returns>Newly-created list of plugin references.</returns>
|
||||||
public List<IPlugin> GetAllInstances() {
|
public List<IPlugin> GetAllInstances() {
|
||||||
|
Dictionary<string, IPlugin> dict;
|
||||||
if (DomainMgr == null) {
|
if (DomainMgr == null) {
|
||||||
List<IPlugin> list = new List<IPlugin>(mActivePlugins.Count);
|
dict = mActivePlugins;
|
||||||
foreach (KeyValuePair<string, IPlugin> kvp in mActivePlugins) {
|
|
||||||
list.Add(kvp.Value);
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
} else {
|
} else {
|
||||||
return DomainMgr.PluginMgr.GetActivePlugins();
|
dict = DomainMgr.PluginMgr.GetActivePlugins();
|
||||||
}
|
}
|
||||||
|
List<IPlugin> list = new List<IPlugin>(dict.Count);
|
||||||
|
foreach (KeyValuePair<string, IPlugin> kvp in dict) {
|
||||||
|
list.Add(kvp.Value);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -272,36 +274,36 @@ namespace SourceGen.Sandbox {
|
|||||||
return plSymbols;
|
return plSymbols;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if false
|
||||||
public delegate bool CheckMatch(IPlugin plugin);
|
public delegate bool CheckMatch(IPlugin plugin);
|
||||||
public IPlugin GetMatchingScript(CheckMatch check) {
|
public IPlugin GetMatchingScript(CheckMatch check) {
|
||||||
|
Dictionary<string, IPlugin> plugins;
|
||||||
if (DomainMgr == null) {
|
if (DomainMgr == null) {
|
||||||
foreach (KeyValuePair<string, IPlugin> kvp in mActivePlugins) {
|
plugins = mActivePlugins;
|
||||||
if (check(kvp.Value)) {
|
|
||||||
return kvp.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
List<IPlugin> plugins = DomainMgr.PluginMgr.GetActivePlugins();
|
plugins = DomainMgr.PluginMgr.GetActivePlugins();
|
||||||
foreach (IPlugin plugin in plugins) {
|
}
|
||||||
if (check(plugin)) {
|
foreach (IPlugin plugin in plugins.Values) {
|
||||||
return plugin;
|
if (check(plugin)) {
|
||||||
}
|
return plugin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a list of loaded plugins. Callers should not retain this list, as the
|
/// Returns a list of loaded plugins. Callers should not retain this list, as the
|
||||||
/// set can change due to user activity.
|
/// set can change due to user activity.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<IPlugin> GetActivePlugins() {
|
public Dictionary<string, IPlugin> GetActivePlugins() {
|
||||||
if (DomainMgr == null) {
|
if (DomainMgr == null) {
|
||||||
List<IPlugin> plist = new List<IPlugin>();
|
// copy the contents
|
||||||
|
Dictionary<string, IPlugin> pdict = new Dictionary<string, IPlugin>();
|
||||||
foreach (KeyValuePair<string, IPlugin> kvp in mActivePlugins) {
|
foreach (KeyValuePair<string, IPlugin> kvp in mActivePlugins) {
|
||||||
plist.Add(kvp.Value);
|
pdict.Add(kvp.Key, kvp.Value);
|
||||||
}
|
}
|
||||||
return plist;
|
return pdict;
|
||||||
} else {
|
} else {
|
||||||
return DomainMgr.PluginMgr.GetActivePlugins();
|
return DomainMgr.PluginMgr.GetActivePlugins();
|
||||||
}
|
}
|
||||||
@@ -322,8 +324,8 @@ namespace SourceGen.Sandbox {
|
|||||||
DebugGetScriptInfo(kvp.Value, sb);
|
DebugGetScriptInfo(kvp.Value, sb);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
List<IPlugin> plugins = DomainMgr.PluginMgr.GetActivePlugins();
|
Dictionary<string, IPlugin> plugins = DomainMgr.PluginMgr.GetActivePlugins();
|
||||||
foreach (IPlugin plugin in plugins) {
|
foreach (IPlugin plugin in plugins.Values) {
|
||||||
string loc = DomainMgr.PluginMgr.GetPluginAssemblyLocation(plugin);
|
string loc = DomainMgr.PluginMgr.GetPluginAssemblyLocation(plugin);
|
||||||
sb.AppendFormat("[sub {0}] ", DomainMgr.Id);
|
sb.AppendFormat("[sub {0}] ", DomainMgr.Id);
|
||||||
sb.Append(loc);
|
sb.Append(loc);
|
||||||
|
@@ -174,7 +174,7 @@ namespace SourceGen {
|
|||||||
/// <param name="project">Project reference.</param>
|
/// <param name="project">Project reference.</param>
|
||||||
public static void RefreshAllThumbnails(DisasmProject project) {
|
public static void RefreshAllThumbnails(DisasmProject project) {
|
||||||
ScriptSupport iapp = null;
|
ScriptSupport iapp = null;
|
||||||
List<IPlugin> plugins = null;
|
Dictionary<string, IPlugin> plugins = null;
|
||||||
|
|
||||||
SortedList<int, VisualizationSet> visSets = project.VisualizationSets;
|
SortedList<int, VisualizationSet> visSets = project.VisualizationSets;
|
||||||
|
|
||||||
@@ -248,9 +248,9 @@ namespace SourceGen {
|
|||||||
/// <param name="plugins">List of plugins, from project ScriptManager.</param>
|
/// <param name="plugins">List of plugins, from project ScriptManager.</param>
|
||||||
/// <param name="visGenIdent">Visualization generator identifier.</param>
|
/// <param name="visGenIdent">Visualization generator identifier.</param>
|
||||||
/// <returns>A plugin that matches, or null if none found.</returns>
|
/// <returns>A plugin that matches, or null if none found.</returns>
|
||||||
private static IPlugin_Visualizer FindPluginByVisGenIdent(List<IPlugin> plugins,
|
private static IPlugin_Visualizer FindPluginByVisGenIdent(
|
||||||
string visGenIdent, out VisDescr visDescr) {
|
Dictionary<string, IPlugin> plugins, string visGenIdent, out VisDescr visDescr) {
|
||||||
foreach (IPlugin chkPlug in plugins) {
|
foreach (IPlugin chkPlug in plugins.Values) {
|
||||||
if (!(chkPlug is IPlugin_Visualizer)) {
|
if (!(chkPlug is IPlugin_Visualizer)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@@ -84,13 +84,15 @@ namespace SourceGen.WpfGui {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Strictly speaking we could just create an ItemsSource from VisDescr objects, but
|
/// Strictly speaking we could just create an ItemsSource from VisDescr objects, but
|
||||||
/// the plugin reference saves a lookup later.
|
/// the plugin reference saves a lookup later. We store the script ident rather than
|
||||||
|
/// an IPlugin reference because our reference would be a proxy object that expires,
|
||||||
|
/// and there's no value in creating a Sponsor<> or playing keep-alive.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public class VisualizationItem {
|
public class VisualizationItem {
|
||||||
public IPlugin_Visualizer Plugin { get; private set; }
|
public string ScriptIdent { get; private set; }
|
||||||
public VisDescr VisDescriptor { get; private set; }
|
public VisDescr VisDescriptor { get; private set; }
|
||||||
public VisualizationItem(IPlugin_Visualizer plugin, VisDescr descr) {
|
public VisualizationItem(string scriptIdent, VisDescr descr) {
|
||||||
Plugin = plugin;
|
ScriptIdent = scriptIdent;
|
||||||
VisDescriptor = descr;
|
VisDescriptor = descr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -198,12 +200,12 @@ namespace SourceGen.WpfGui {
|
|||||||
|
|
||||||
int visSelection = -1;
|
int visSelection = -1;
|
||||||
VisualizationList = new List<VisualizationItem>();
|
VisualizationList = new List<VisualizationItem>();
|
||||||
List<IPlugin> plugins = proj.GetActivePlugins();
|
Dictionary<string, IPlugin> plugins = proj.GetActivePlugins();
|
||||||
foreach (IPlugin chkPlug in plugins) {
|
foreach (KeyValuePair<string, IPlugin> kvp in plugins) {
|
||||||
if (!(chkPlug is IPlugin_Visualizer)) {
|
if (!(kvp.Value is IPlugin_Visualizer)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
IPlugin_Visualizer vplug = (IPlugin_Visualizer)chkPlug;
|
IPlugin_Visualizer vplug = (IPlugin_Visualizer)kvp.Value;
|
||||||
foreach (VisDescr descr in vplug.GetVisGenDescrs()) {
|
foreach (VisDescr descr in vplug.GetVisGenDescrs()) {
|
||||||
if (vis != null && vis.VisGenIdent == descr.Ident) {
|
if (vis != null && vis.VisGenIdent == descr.Ident) {
|
||||||
// found matching descriptor, set selection to this
|
// found matching descriptor, set selection to this
|
||||||
@@ -212,7 +214,7 @@ namespace SourceGen.WpfGui {
|
|||||||
// we used this one last time, use it if nothing better comes along
|
// we used this one last time, use it if nothing better comes along
|
||||||
visSelection = VisualizationList.Count;
|
visSelection = VisualizationList.Count;
|
||||||
}
|
}
|
||||||
VisualizationList.Add(new VisualizationItem(vplug, descr));
|
VisualizationList.Add(new VisualizationItem(kvp.Key, descr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,8 +439,9 @@ namespace SourceGen.WpfGui {
|
|||||||
|
|
||||||
IVisualization2d vis2d;
|
IVisualization2d vis2d;
|
||||||
try {
|
try {
|
||||||
vis2d = item.Plugin.Generate2d(item.VisDescriptor,
|
IPlugin_Visualizer plugin =
|
||||||
CreateVisGenParams());
|
(IPlugin_Visualizer)mProject.GetPlugin(item.ScriptIdent);
|
||||||
|
vis2d = plugin.Generate2d(item.VisDescriptor, CreateVisGenParams());
|
||||||
if (vis2d == null) {
|
if (vis2d == null) {
|
||||||
Debug.WriteLine("Vis generator returned null");
|
Debug.WriteLine("Vis generator returned null");
|
||||||
}
|
}
|
||||||
|
@@ -125,8 +125,8 @@ namespace SourceGen.WpfGui {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if we have any relevant plugins. If not, disable New/Edit.
|
// Check to see if we have any relevant plugins. If not, disable New/Edit.
|
||||||
List<IPlugin> plugins = project.GetActivePlugins();
|
Dictionary<string, IPlugin> plugins = project.GetActivePlugins();
|
||||||
foreach (IPlugin chkPlug in plugins) {
|
foreach (IPlugin chkPlug in plugins.Values) {
|
||||||
if (chkPlug is IPlugin_Visualizer) {
|
if (chkPlug is IPlugin_Visualizer) {
|
||||||
HasVisPlugins = true;
|
HasVisPlugins = true;
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user