void ioq_putint(struct ioqueue* ioq, int data) {
ASSERT(intr_get_status() == INTR_OFF);
while(ioq_full(ioq)) {
lock_acquire(&ioq->lock);
ioq_wait(&ioq->producer);
lock_release(&ioq->lock);
}
ioq->buf[ioq->head] = data;
ioq->head = next_pos(ioq->head);
struct task* pthread = main_thread;
//这里
if((pthread->status == BLOCKED) ||
(pthread->status == HANDING) ||
(pthread->status == WAITING))
thread_unblock(main_thread);
if(ioq->consumer != NULL) {
wakeup(&ioq->consumer);
}
}
仅当主线程处于非运行态和非就绪态的情况下,在缓冲区有数据的情况下才唤醒它。在这种情况下,移动鼠标、窗口,以及其他线程的运行速度都提升了不少。