/// <summary> /// If a task uses no shared resources, deadlock will be avoided. Otherwise, /// call is delegated to a manager that uses Banker's algorithm and decides whether deadlock can be avoided <see cref="IBankerAlgorithm"/>. /// </summary> private bool CanAvoidDeadlock(PrioritizedLimitedTask task) { lock (schedulingLocker) { RequestApproval approved = RequestApproval.Approved; if (task.UsesSharedResources()) { approved = sharedResourceManager.AllocateResources(task.PrioritizedLimitedTaskIdentifier , task.SharedResources); } return(approved == RequestApproval.Approved); } }
/// <summary> /// Starts (creates and schedules) task that is used to cooperatively cancels (and optionally pauses) user's task. /// Is user's task used resources, resources are released. /// This task is scheduled using default .NET scheduler. /// </summary> /// <param name="task">Corresponding user's task</param> /// <param name="controlNumberOfExecutionTasksAction">Responsible for decrementing number of currently running tasks</param> /// <param name="enablePauseAction">Responsible for pausing this callback for specific amount of time (optional)</param> protected void StartCallback(PrioritizedLimitedTask task, Action controlNumberOfExecutionTasksAction, Action enablePauseAction = null) => Task.Factory.StartNew(() => { Task.Delay(task.DurationInMiliseconds).Wait(); enablePauseAction?.Invoke(); task.CooperationMechanism.Cancel(); // Free shared resources if (task.UsesSharedResources()) { sharedResourceManager.FreeResources(task.PrioritizedLimitedTaskIdentifier, task.SharedResources); } controlNumberOfExecutionTasksAction.Invoke(); RunScheduling(); }, CancellationToken.None, TaskCreationOptions.None, Default);