Refactor donate_priority to include comments explaining its purpose and logic w/ S
This commit is contained in:
@@ -194,16 +194,25 @@ lock_init (struct lock *lock)
|
|||||||
sema_init (&lock->semaphore, 1);
|
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
|
static void
|
||||||
donate_priority (struct thread *donor, struct thread *donee) {
|
donate_priority (struct thread *donor, struct thread *donee) {
|
||||||
list_push_back (&donee->donors_list, &donor->donor_elem);
|
list_push_back (&donee->donors_list, &donor->donor_elem);
|
||||||
|
|
||||||
while (donee != NULL)
|
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)
|
if (donor->priority <= donee->priority)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
donee->priority = donor->priority;
|
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)
|
if (donee->waiting_lock == NULL)
|
||||||
donee = NULL;
|
donee = NULL;
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user