#include <stdio.h>
|
|
#include <monitor.h>
|
|
#include <kmalloc.h>
|
|
#include <assert.h>
|
|
|
|
|
|
// Initialize monitor.
|
|
void
|
|
monitor_init (monitor_t * mtp, size_t num_cv) {
|
|
int i;
|
|
assert(num_cv>0);
|
|
mtp->next_count = 0;
|
|
mtp->cv = NULL;
|
|
sem_init(&(mtp->mutex), 1); //unlocked
|
|
sem_init(&(mtp->next), 0);
|
|
mtp->cv =(condvar_t *) kmalloc(sizeof(condvar_t)*num_cv);
|
|
assert(mtp->cv!=NULL);
|
|
for(i=0; i<num_cv; i++){
|
|
mtp->cv[i].count=0;
|
|
sem_init(&(mtp->cv[i].sem),0);
|
|
mtp->cv[i].owner=mtp;
|
|
}
|
|
}
|
|
|
|
// Unlock one of threads waiting on the condition variable.
|
|
void
|
|
cond_signal (condvar_t *cvp) {
|
|
//LAB7 EXERCISE1: YOUR CODE
|
|
cprintf("cond_signal begin: cvp %x, cvp->count %d, cvp->owner->next_count %d\n", cvp, cvp->count, cvp->owner->next_count);
|
|
/*
|
|
* cond_signal(cv) {
|
|
* if(cv.count>0) {
|
|
* mt.next_count ++;
|
|
* signal(cv.sem);
|
|
* wait(mt.next);
|
|
* mt.next_count--;
|
|
* }
|
|
* }
|
|
*/
|
|
cprintf("cond_signal end: cvp %x, cvp->count %d, cvp->owner->next_count %d\n", cvp, cvp->count, cvp->owner->next_count);
|
|
}
|
|
|
|
// Suspend calling thread on a condition variable waiting for condition Atomically unlocks
|
|
// mutex and suspends calling thread on conditional variable after waking up locks mutex. Notice: mp is mutex semaphore for monitor's procedures
|
|
void
|
|
cond_wait (condvar_t *cvp) {
|
|
//LAB7 EXERCISE1: YOUR CODE
|
|
cprintf("cond_wait begin: cvp %x, cvp->count %d, cvp->owner->next_count %d\n", cvp, cvp->count, cvp->owner->next_count);
|
|
/*
|
|
* cv.count ++;
|
|
* if(mt.next_count>0)
|
|
* signal(mt.next)
|
|
* else
|
|
* signal(mt.mutex);
|
|
* wait(cv.sem);
|
|
* cv.count --;
|
|
*/
|
|
cprintf("cond_wait end: cvp %x, cvp->count %d, cvp->owner->next_count %d\n", cvp, cvp->count, cvp->owner->next_count);
|
|
}
|