Merge 'task1/priority-donation' into 'master' #14

Merged
sb3923 merged 66 commits from task1/priority-donation into master 2024-10-23 16:15:45 +00:00
4 changed files with 254 additions and 16 deletions
Showing only changes of commit 7aec2e6862 - Show all commits

View File

@@ -194,16 +194,25 @@ lock_init (struct lock *lock)
sema_init (&lock->semaphore, 1);
}
/* Allows for the donor to donate its priority to donee, iteratively
propagating the donation in the case of chains in the wait-for graph.
Also keeps track of the donation by updating the donors list. */
static void
donate_priority (struct thread *donor, struct thread *donee) {
list_push_back (&donee->donors_list, &donor->donor_elem);
while (donee != NULL)
{
/* Stop propagation of donation once a donee is reached that has
a higher effective priority (as its donees can't have less
priority than that being donated). */
if (donor->priority <= donee->priority)
break;
donee->priority = donor->priority;
/* Also stop propagation of donation once a donee is reached with
no donees of its own (sink node in WFG). */
if (donee->waiting_lock == NULL)
donee = NULL;
else