Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/10/08 12:19:05 (16 years ago)
Author:
gkronber
Message:

worked on #189

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.CEDMA.Server/RunScheduler.cs

    r377 r378  
    3636    private JobManager jobManager;
    3737    private const int RELEASE_INTERVAL = 5;
     38    private object remoteCommLock = new object();
     39
    3840    public RunScheduler(Database database, JobManager jobManager) {
    3941      this.database = database;
     
    4749    }
    4850    private void ReleaseWaitingRuns() {
    49       ICollection<RunEntry> runs = database.GetRuns(ProcessStatus.Waiting);
    50       jobManager.Reset();
     51      ICollection<RunEntry> runs;
     52      lock(remoteCommLock) {
     53        runs = database.GetRuns(ProcessStatus.Waiting);
     54      }
    5155      foreach(RunEntry entry in runs) {
    5256        IOperatorGraph opGraph = (IOperatorGraph)DbPersistenceManager.Restore(entry.RawData);
    53 
    5457        Scope scope = new Scope();
    5558        AtomicOperation op = new AtomicOperation(opGraph.InitialOperator, scope);
    56         WaitHandle wHandle = jobManager.BeginExecuteOperation(scope, op);
     59        WaitHandle wHandle;
     60        lock(remoteCommLock) {
     61          wHandle = jobManager.BeginExecuteOperation(scope, op);
     62          database.UpdateRunStatus(entry.Id, ProcessStatus.Active);
     63          database.UpdateRunStart(entry.Id, DateTime.Now);
     64        }
    5765
    58         ThreadPool.QueueUserWorkItem(delegate(object state) {
    59           wHandle.WaitOne();
    60           jobManager.EndExecuteOperation(op);
    61           entry.Status = ProcessStatus.Finished;
    62           database.UpdateRunStatus(entry.Id, entry.Status);
    63           database.UpdateRunFinished(entry.Id, DateTime.Now);
    64         });
     66        ThreadPool.QueueUserWorkItem(WaitForFinishedRun, new object[] {wHandle, op, entry});
     67      }
     68    }
    6569
    66         entry.Status = ProcessStatus.Active;
    67         database.UpdateRunStatus(entry.Id, entry.Status);
    68         database.UpdateRunStart(entry.Id, DateTime.Now);
     70    private void WaitForFinishedRun(object state) {
     71      object[] param = (object[])state;
     72      WaitHandle wHandle = (WaitHandle)param[0];
     73      AtomicOperation op = (AtomicOperation)param[1];
     74      RunEntry entry = (RunEntry)param[2];
     75      wHandle.WaitOne();
     76      wHandle.Close();
     77      lock(remoteCommLock) {
     78        jobManager.EndExecuteOperation(op);
     79        database.UpdateRunStatus(entry.Id, ProcessStatus.Finished);
     80        database.UpdateRunFinished(entry.Id, DateTime.Now);
    6981      }
    7082    }
Note: See TracChangeset for help on using the changeset viewer.