Ignore:
Timestamp:
Oct 14, 2010, 11:05:31 PM (11 years ago)
Author:
kopal
Message:
  • the executionEngine now stops its threads without exception
  • a plugin chain can only be started now if an "old" run of the executionEngine has been already terminated (that means all of its threads are terminated)
  • stopping of executionEngine threads is done in an own thread so that the rest of ct2 (and its gui) doesnt block (stopping threads waits for all threads to stop and logs this event to the log window)
  • the stop button now can be clicked several time without an error (also in an executing "stopping" run)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/WorkspaceManager/Execution/ExecutionEngine.cs

    r1929 r1977  
    4646        private WorkspaceModel workspaceModel;
    4747        private volatile bool isRunning = false;
    48         private BenchmarkProtocol BenchmarkProtocol;
     48        private BenchmarkProtocol BenchmarkProtocol = null;
    4949
    5050        public volatile int ExecutedPluginsCounter = 0;
     
    145145        public void Stop()
    146146        {
    147             try
    148             {
    149                 //First stop alle plugins
    150                 foreach (PluginModel pluginModel in workspaceModel.AllPluginModels)
    151                 {
    152                     pluginModel.Plugin.Stop();
    153                     pluginModel.Plugin.PostExecution();
    154                 }
    155 
    156                 IsRunning = false;
    157                 //Secondly stop all Gears4Net Schedulers
    158                 scheduler.Shutdown();
    159 
    160                 foreach (PluginModel pluginModel in workspaceModel.AllPluginModels)
    161                 {
    162                     pluginModel.PluginProtocol = null;
    163                 }
    164 
    165 
    166 
    167                 this.WorkspaceManagerEditor = null;
    168                 this.workspaceModel = null;
    169             }
    170             finally
    171             {
    172                 BenchmarkProtocol.CloseWriters();
    173             }
     147           
     148            //First stop alle plugins
     149            foreach (PluginModel pluginModel in workspaceModel.AllPluginModels)
     150            {
     151                pluginModel.Plugin.Stop();                   
     152            }
     153
     154            IsRunning = false;
     155            //Secondly stop all Gears4Net Schedulers
     156            scheduler.Shutdown();
     157
     158            //call all PostExecution methods of all plugins
     159            foreach (PluginModel pluginModel in workspaceModel.AllPluginModels)
     160            {
     161                pluginModel.Plugin.PostExecution();
     162            }
     163
     164            //remove the plugin protocol of each plugin model
     165            foreach (PluginModel pluginModel in workspaceModel.AllPluginModels)
     166            {
     167                pluginModel.PluginProtocol = null;
     168            }
     169
     170            this.WorkspaceManagerEditor = null;
     171            this.workspaceModel = null;
     172         
    174173        }
    175174
     
    281280        private WorkspaceModel workspaceModel;
    282281        private ExecutionEngine executionEngine;
    283         private StreamWriter PerformanceWriter;
    284         private StreamWriter MemoryPerformanceWriter;
    285 
     282     
    286283        /// <summary>
    287284        /// Create a new protocol. Each protocol requires a scheduler which provides
     
    293290        {
    294291            this.workspaceModel = workspaceModel;
    295             this.executionEngine = executionEngine;
    296             string sFilename = "benchmark_" + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second + ".txt";
    297             PerformanceWriter = new StreamWriter("plugins_" + sFilename);
    298             MemoryPerformanceWriter = new StreamWriter("memory_" + sFilename);
     292            this.executionEngine = executionEngine;         
    299293        }
    300294
     
    321315            sb.Append(" Plugins/s");
    322316
    323             this.workspaceModel.WorkspaceManagerEditor.GuiLogMessage(sb.ToString(), NotificationLevel.Debug);
    324             PerformanceWriter.WriteLine(this.executionEngine.ExecutedPluginsCounter);
    325             PerformanceWriter.Flush();
    326             MemoryPerformanceWriter.WriteLine(Process.GetCurrentProcess().WorkingSet64);
    327             MemoryPerformanceWriter.Flush();
     317            this.workspaceModel.WorkspaceManagerEditor.GuiLogMessage(sb.ToString(), NotificationLevel.Debug);         
    328318            this.executionEngine.ExecutedPluginsCounter = 0;
    329         }
    330 
    331         public void CloseWriters()
    332         {
    333             PerformanceWriter.Close();
    334             MemoryPerformanceWriter.Close();
    335         }
     319        }       
    336320    }
    337321
     
    520504        private bool shutdown = false;
    521505        private Thread[] threads;
     506        private volatile int runningThreads = 0;
     507
    522508        public ExecutionEngine executionEngine = null;         
    523509
     
    561547            {
    562548                thread.Start();
     549                lock (this)
     550                {
     551                    runningThreads++;
     552                }
    563553            }
    564554        }
     
    569559            this.executionEngine.GuiLogMessage(Thread.CurrentThread.Name + " up and running", NotificationLevel.Debug);
    570560            Queue<ProtocolBase> waitingProtocols = this.waitingProtocols;
    571             int i = 0;
    572 
     561           
    573562            // Loop forever
    574563            while (true)
     
    581570                    // Should the scheduler stop?
    582571                    if (this.shutdown)
    583                     {
    584                         this.waitingProtocols.Clear();
    585                         this.protocols.Clear();
     572                    {                       
    586573                        this.executionEngine.GuiLogMessage(Thread.CurrentThread.Name + " terminated", NotificationLevel.Debug);
     574                        lock (this)
     575                        {
     576                            runningThreads--;
     577                        }                                           
    587578                        return;
    588579                    }
     
    621612                    catch (Exception ex)
    622613                    {
    623                         System.Diagnostics.Debug.Fail("Error during scheduling: " + ex.Message + " - " + ex.InnerException);
     614                        this.executionEngine.GuiLogMessage("Error during scheduling: " + ex.Message + " - " + ex.InnerException,NotificationLevel.Error);
    624615                    }
    625616                }
     
    673664            this.shutdown = true;
    674665            this.wakeup.Set();
    675         }       
     666
     667            this.executionEngine.GuiLogMessage("Waiting for all scheduler threads to stop", NotificationLevel.Debug);
     668            while (runningThreads > 0)
     669            {
     670                Thread.Sleep(50);
     671                this.wakeup.Set();
     672            }
     673            this.executionEngine.GuiLogMessage("All scheduler threads stopped", NotificationLevel.Debug);
     674
     675            this.waitingProtocols.Clear();
     676            this.protocols.Clear();           
     677        }
    676678    }
    677679}
Note: See TracChangeset for help on using the changeset viewer.