int sys_twakeup(void) { int tid; if(argint(0,&tid) < 0){ return -1; } twakeup(tid); return 0; }
/** * @fn void iodone(struct buf *bp) * Permet de signaler la fin d'une E/S sur un buffer et reveille les processus endormis * sur le buffer (à condition qu'il en existe). * * Mark I/O complete on a buffer, release it if I/O is asynchronous, * and wake up anyone waiting for it. * @param bp : pointeur vers un buffer */ void iodone(struct buf *bp) { /* if(bp->b_flags&B_MAP) */ /* mapfree(bp); */ bp->b_flags |= B_DONE; if (bp->b_flags&B_ASYNC) brelse(bp); else { bp->b_flags &= ~B_WANTED; twakeup((caddr_t)bp); } }
void sem_signal(struct Semaphore *s) { lock_acquire(&s->locksem); if(!empty_q(&s->t_q)) { twakeup(pop_q(&s->t_q)); } else { s->count++; } lock_release(&s->locksem); }
void sem_signal(struct Semaphore *s) { lock_acquire(&s->lock); if (s->count > 0) { s->count++; lock_release(&s->lock); } else { if (empty_q(&s->q) == 1) s->count++; else twakeup(pop_q(&s->q)); lock_release(&s->lock); } }
/** * @fn void brelse(struct buf *bp) * Libere le buffer sans générer de E/S. * * Release the buffer, with no I/O implied. * @param bp : pointeur vers un buffer */ void brelse(struct buf *bp) { struct buf **backp; int flags; int s; if (bp->b_flags & B_WANTED) { twakeup((caddr_t) bp); } if (bfreelist.b_flags & B_WANTED) { twakeup(&bfreelist); bfreelist.b_flags &= ~B_WANTED; } s = splbio(); spl(BDINHB); backp = &bfreelist.av_forw; (*backp)->av_forw = bp; bp->av_back = *backp; *backp = bp; bp->av_forw = &bfreelist; bp->b_flags &=~ (B_WANTED | B_BUSY | B_ASYNC); bfreelist.b_count++; spl(s); }
void DeposerFile(t_fmsg *f, void *d) { /* Code du TP à ajouter */ while(f->nb_msg >= MAXMSG) tsleep(GetElecProc(),f->file_pleine); lock(); f->nb_msg++; f->deposer++; f->deposer %= MAXMSG; f->file[f->deposer].data = d; f->file[f->deposer].exp = GetElecProc() ; unlock(); twakeup(f->file_vide); }
void *RetirerFile(t_fmsg *f, int *exp) { /* Code du TP à ajouter */ while(f->nb_msg <= 0) tsleep(GetElecProc(),f->file_vide); lock(); f->nb_msg--; f->retirer++; f->retirer %= MAXMSG; *exp = f->file[f->retirer].exp ; unlock(); twakeup(f->file_pleine); return f->file[f->retirer].data; }
void unlock() { vlock = 0; twakeup(&vlock); }