update name of code to labcodes
This commit is contained in:
122
labcodes/lab8/kern/sync/wait.c
Normal file
122
labcodes/lab8/kern/sync/wait.c
Normal file
@@ -0,0 +1,122 @@
|
||||
#include <defs.h>
|
||||
#include <list.h>
|
||||
#include <sync.h>
|
||||
#include <wait.h>
|
||||
#include <proc.h>
|
||||
|
||||
void
|
||||
wait_init(wait_t *wait, struct proc_struct *proc) {
|
||||
wait->proc = proc;
|
||||
wait->wakeup_flags = WT_INTERRUPTED;
|
||||
list_init(&(wait->wait_link));
|
||||
}
|
||||
|
||||
void
|
||||
wait_queue_init(wait_queue_t *queue) {
|
||||
list_init(&(queue->wait_head));
|
||||
}
|
||||
|
||||
void
|
||||
wait_queue_add(wait_queue_t *queue, wait_t *wait) {
|
||||
assert(list_empty(&(wait->wait_link)) && wait->proc != NULL);
|
||||
wait->wait_queue = queue;
|
||||
list_add_before(&(queue->wait_head), &(wait->wait_link));
|
||||
}
|
||||
|
||||
void
|
||||
wait_queue_del(wait_queue_t *queue, wait_t *wait) {
|
||||
assert(!list_empty(&(wait->wait_link)) && wait->wait_queue == queue);
|
||||
list_del_init(&(wait->wait_link));
|
||||
}
|
||||
|
||||
wait_t *
|
||||
wait_queue_next(wait_queue_t *queue, wait_t *wait) {
|
||||
assert(!list_empty(&(wait->wait_link)) && wait->wait_queue == queue);
|
||||
list_entry_t *le = list_next(&(wait->wait_link));
|
||||
if (le != &(queue->wait_head)) {
|
||||
return le2wait(le, wait_link);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
wait_t *
|
||||
wait_queue_prev(wait_queue_t *queue, wait_t *wait) {
|
||||
assert(!list_empty(&(wait->wait_link)) && wait->wait_queue == queue);
|
||||
list_entry_t *le = list_prev(&(wait->wait_link));
|
||||
if (le != &(queue->wait_head)) {
|
||||
return le2wait(le, wait_link);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
wait_t *
|
||||
wait_queue_first(wait_queue_t *queue) {
|
||||
list_entry_t *le = list_next(&(queue->wait_head));
|
||||
if (le != &(queue->wait_head)) {
|
||||
return le2wait(le, wait_link);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
wait_t *
|
||||
wait_queue_last(wait_queue_t *queue) {
|
||||
list_entry_t *le = list_prev(&(queue->wait_head));
|
||||
if (le != &(queue->wait_head)) {
|
||||
return le2wait(le, wait_link);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool
|
||||
wait_queue_empty(wait_queue_t *queue) {
|
||||
return list_empty(&(queue->wait_head));
|
||||
}
|
||||
|
||||
bool
|
||||
wait_in_queue(wait_t *wait) {
|
||||
return !list_empty(&(wait->wait_link));
|
||||
}
|
||||
|
||||
void
|
||||
wakeup_wait(wait_queue_t *queue, wait_t *wait, uint32_t wakeup_flags, bool del) {
|
||||
if (del) {
|
||||
wait_queue_del(queue, wait);
|
||||
}
|
||||
wait->wakeup_flags = wakeup_flags;
|
||||
wakeup_proc(wait->proc);
|
||||
}
|
||||
|
||||
void
|
||||
wakeup_first(wait_queue_t *queue, uint32_t wakeup_flags, bool del) {
|
||||
wait_t *wait;
|
||||
if ((wait = wait_queue_first(queue)) != NULL) {
|
||||
wakeup_wait(queue, wait, wakeup_flags, del);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
wakeup_queue(wait_queue_t *queue, uint32_t wakeup_flags, bool del) {
|
||||
wait_t *wait;
|
||||
if ((wait = wait_queue_first(queue)) != NULL) {
|
||||
if (del) {
|
||||
do {
|
||||
wakeup_wait(queue, wait, wakeup_flags, 1);
|
||||
} while ((wait = wait_queue_first(queue)) != NULL);
|
||||
}
|
||||
else {
|
||||
do {
|
||||
wakeup_wait(queue, wait, wakeup_flags, 0);
|
||||
} while ((wait = wait_queue_next(queue, wait)) != NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
wait_current_set(wait_queue_t *queue, wait_t *wait, uint32_t wait_state) {
|
||||
assert(current != NULL);
|
||||
wait_init(wait, current);
|
||||
current->state = PROC_SLEEPING;
|
||||
current->wait_state = wait_state;
|
||||
wait_queue_add(queue, wait);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user