void cv_wait(struct cv *cv, struct lock *lock) { // Write this #if OPT_A1 KASSERT(cv != NULL); KASSERT(lock != NULL); KASSERT(lock_do_i_hold(lock)); spinlock_acquire(&cv->cv_spinlock); wchan_lock(cv->cv_wchan); lock_release(lock); spinlock_release(&cv->cv_spinlock); wchan_sleep(cv->cv_wchan); lock_acquire(lock); #else (void)cv; // suppress warning until code gets written (void)lock; // suppress warning until code gets written #endif }
void lock_acquire(struct lock *mylock) { // Write this if(curthread == mylock->owner_thread) { return; } spinlock_acquire(&mylock->lk_spinlock); while (mylock->owner_thread != NULL) { wchan_lock(mylock->lk_wchan); spinlock_release(&mylock->lk_spinlock); wchan_sleep(mylock->lk_wchan); spinlock_acquire(&mylock->lk_spinlock); } mylock->owner_thread = curthread; spinlock_release(&mylock->lk_spinlock); // end of added stuff // (void)mylock; // suppress warning until code gets written }
void lock_acquire(struct lock *lock) { // Write this #if OPT_A1 KASSERT(lock != NULL); KASSERT(curthread->t_in_interrupt == false); spinlock_acquire(&lock->lk_lock); while(lock->be_held){ wchan_lock(lock->lk_wchan); spinlock_release(&lock->lk_lock); wchan_sleep(lock->lk_wchan); spinlock_acquire(&lock->lk_lock); } KASSERT(!lock->be_held); lock->who_hold = curthread; lock->be_held = true; //kprintf("%s acquire sucessfully\n",lock->lk_name); spinlock_release(&lock->lk_lock); #else (void)lock; // suppress warning until code gets written #endif }
void lock_acquire(struct lock *lock) { // Write this #if OPT_A1 KASSERT(lock != NULL); KASSERT(curthread->t_in_interrupt == false); spinlock_acquire(&lock->lk_spinlock); while(lock->lk_holder != NULL) { wchan_lock(lock->lk_wchan); spinlock_release(&lock->lk_spinlock); wchan_sleep(lock->lk_wchan); spinlock_acquire(&lock->lk_spinlock); } KASSERT(lock->lk_holder == NULL); lock->lk_holder = curthread; spinlock_release(&lock->lk_spinlock); #else (void)lock; // suppress warning until code gets written #endif }
void lock_acquire(struct lock *lock) { // Write this KASSERT(lock != NULL); KASSERT(curthread->t_in_interrupt == false); spinlock_acquire(&lock->splk); //do i use curcpu? while(lock->currentplace != NULL ){ wchan_lock(lock->lock_wchan); spinlock_release(&lock->splk); wchan_sleep(lock->lock_wchan); spinlock_acquire(&lock->splk); } lock->currentplace = curthread; //lock->lock_hold = 1; spinlock_release(&lock->splk); }
void lock_acquire(struct lock *lock) { spinlock_acquire(&lock->lk_spinlock); if(lock_do_i_hold(lock)) { spinlock_release(&lock->lk_spinlock); return; } else { while(lock->lk_owner != NULL) { wchan_lock(lock->lk_wchan); spinlock_release(&lock->lk_spinlock); wchan_sleep(lock->lk_wchan); spinlock_acquire(&lock->lk_spinlock); } lock->lk_owner = curthread; } spinlock_release(&lock->lk_spinlock); }
void lock_acquire(struct lock *lock) { spinlock_acquire(&lock->lk_spinlock); if(lock_do_i_hold(lock))//we don't already have acquired it! { spinlock_release(&lock->lk_spinlock); return; } else { while(lock->lk_owner != NULL) { wchan_lock(lock->lk_wchan); spinlock_release(&lock->lk_spinlock); wchan_sleep(lock->lk_wchan); //returns from sleep here spinlock_acquire(&lock->lk_spinlock); } lock->lk_owner = curthread; } spinlock_release(&lock->lk_spinlock); }