internal RecurrentJob Steal() { RecurrentJob job = null; _jobsQueue.TryDequeue(out job); return job; }
public void Reset() { PauseAll(); while (_jobsQueue.Count > 0) { RecurrentJob job = null; while (!_jobsQueue.TryDequeue(out job)) { // Just wait for the job to finally dequeue } } StartAll(); }
public void Schedule(RecurrentJob job) { // If the job was already scheduled somewhere, dont't schedule if (job.Status != JobStatus.NotScheduled) { return; } // If the job has any unfinished dependencies, make it wait for them var dependencies = job.GetDependencies(); var someNotFinished = dependencies.Any(d => d.Status != JobStatus.Done); if (someNotFinished) { foreach (var dependencyJob in dependencies.Where(d => d.Status != JobStatus.Done)) { dependencyJob.AddDependant(job); } return; } // If the job is free to schedule, do it job.Status = JobStatus.Scheduled; _jobsQueue.Enqueue(job); }