internal static void Finish(IndexingActivityBase activity) { lock (WaitingSetLock) { // activity is done in the ActivityQueue WaitingSet.Remove(activity); // terminate and release waiting threads if there is any. activity.Finish(); // register activity termination in the log. IndexingActivityHistory.Finish(activity.Id); // register activity termination if the activity was not skipped. if (activity.Executed) { TerminationHistory.FinishActivity(activity); } // execute all activities that are completely freed. foreach (var dependentItem in activity.WaitingForMe.ToArray()) { dependentItem.FinishWaiting(activity); if (dependentItem.WaitingFor.Count == 0) { System.Threading.Tasks.Task.Run(() => Executor.Execute(dependentItem)); } } } }
internal static void AttachOrFinish(IndexingActivityBase activity) { lock (WaitingSetLock) { var sameActivity = WaitingSet.FirstOrDefault(a => a.Id == activity.Id); if (sameActivity != null) { sameActivity.Attach(activity); SnTrace.IndexQueue.Write("IAQ: A{0} attached to another in the waiting set.", activity.Id); return; } } activity.Finish(); // release blocked thread IndexingActivityHistory.Finish(activity.Id); SnTrace.IndexQueue.Write("IAQ: A{0} ignored: finished but not executed.", activity.Id); }