update lab6 :: deleting timer
This commit is contained in:
parent
9926671507
commit
5d8e661a1a
@ -98,79 +98,3 @@ schedule(void) {
|
||||
}
|
||||
local_intr_restore(intr_flag);
|
||||
}
|
||||
|
||||
// add timer to timer_list
|
||||
void
|
||||
add_timer(timer_t *timer) {
|
||||
bool intr_flag;
|
||||
local_intr_save(intr_flag);
|
||||
{
|
||||
assert(timer->expires > 0 && timer->proc != NULL);
|
||||
assert(list_empty(&(timer->timer_link)));
|
||||
list_entry_t *le = list_next(&timer_list);
|
||||
while (le != &timer_list) {
|
||||
timer_t *next = le2timer(le, timer_link);
|
||||
if (timer->expires < next->expires) {
|
||||
next->expires -= timer->expires;
|
||||
break;
|
||||
}
|
||||
timer->expires -= next->expires;
|
||||
le = list_next(le);
|
||||
}
|
||||
list_add_before(le, &(timer->timer_link));
|
||||
}
|
||||
local_intr_restore(intr_flag);
|
||||
}
|
||||
|
||||
// del timer from timer_list
|
||||
void
|
||||
del_timer(timer_t *timer) {
|
||||
bool intr_flag;
|
||||
local_intr_save(intr_flag);
|
||||
{
|
||||
if (!list_empty(&(timer->timer_link))) {
|
||||
if (timer->expires != 0) {
|
||||
list_entry_t *le = list_next(&(timer->timer_link));
|
||||
if (le != &timer_list) {
|
||||
timer_t *next = le2timer(le, timer_link);
|
||||
next->expires += timer->expires;
|
||||
}
|
||||
}
|
||||
list_del_init(&(timer->timer_link));
|
||||
}
|
||||
}
|
||||
local_intr_restore(intr_flag);
|
||||
}
|
||||
|
||||
// call scheduler to update tick related info, and check the timer is expired? If expired, then wakup proc
|
||||
void
|
||||
run_timer_list(void) {
|
||||
bool intr_flag;
|
||||
local_intr_save(intr_flag);
|
||||
{
|
||||
list_entry_t *le = list_next(&timer_list);
|
||||
if (le != &timer_list) {
|
||||
timer_t *timer = le2timer(le, timer_link);
|
||||
assert(timer->expires != 0);
|
||||
timer->expires --;
|
||||
while (timer->expires == 0) {
|
||||
le = list_next(le);
|
||||
struct proc_struct *proc = timer->proc;
|
||||
if (proc->wait_state != 0) {
|
||||
assert(proc->wait_state & WT_INTERRUPTED);
|
||||
}
|
||||
else {
|
||||
warn("process %d's wait_state == 0.\n", proc->pid);
|
||||
}
|
||||
wakeup_proc(proc);
|
||||
del_timer(timer);
|
||||
if (le == &timer_list) {
|
||||
break;
|
||||
}
|
||||
timer = le2timer(le, timer_link);
|
||||
}
|
||||
}
|
||||
sched_class_proc_tick(current);
|
||||
}
|
||||
local_intr_restore(intr_flag);
|
||||
}
|
||||
|
@ -9,24 +9,6 @@
|
||||
|
||||
struct proc_struct;
|
||||
|
||||
typedef struct {
|
||||
unsigned int expires; //the expire time
|
||||
struct proc_struct *proc; //the proc wait in this timer. If the expire time is end, then this proc will be scheduled
|
||||
list_entry_t timer_link; //the timer list
|
||||
} timer_t;
|
||||
|
||||
#define le2timer(le, member) \
|
||||
to_struct((le), timer_t, member)
|
||||
|
||||
// init a timer
|
||||
static inline timer_t *
|
||||
timer_init(timer_t *timer, struct proc_struct *proc, int expires) {
|
||||
timer->expires = expires;
|
||||
timer->proc = proc;
|
||||
list_init(&(timer->timer_link));
|
||||
return timer;
|
||||
}
|
||||
|
||||
struct run_queue;
|
||||
|
||||
// The introduction of scheduling classes is borrrowed from Linux, and makes the
|
||||
@ -65,9 +47,6 @@ struct run_queue {
|
||||
void sched_init(void);
|
||||
void wakeup_proc(struct proc_struct *proc);
|
||||
void schedule(void);
|
||||
void add_timer(timer_t *timer); // add timer to timer_list
|
||||
void del_timer(timer_t *timer); // del timer from timer_list
|
||||
void run_timer_list(void); // call scheduler to update tick related info, and check the timer is expired? If expired, then wakup proc
|
||||
|
||||
#endif /* !__KERN_SCHEDULE_SCHED_H__ */
|
||||
|
||||
|
@ -225,12 +225,9 @@ trap_dispatch(struct trapframe *tf) {
|
||||
* Every TICK_NUM cycle, you should set current process's current->need_resched = 1
|
||||
*/
|
||||
/* LAB6 YOUR CODE */
|
||||
/* IMPORTANT FUNCTIONS:
|
||||
* run_timer_list
|
||||
*----------------------
|
||||
* you should update your lab5 code (just add ONE or TWO lines of code):
|
||||
* Every tick, you should update the system time, iterate the timers, and trigger the timers which are end to call scheduler.
|
||||
* You can use one funcitons to finish all these things.
|
||||
/* you should upate you lab5 code
|
||||
* IMPORTANT FUNCTIONS:
|
||||
* sched_class_proc_tick
|
||||
*/
|
||||
break;
|
||||
case IRQ_OFFSET + IRQ_COM1:
|
||||
|
@ -225,12 +225,14 @@ trap_dispatch(struct trapframe *tf) {
|
||||
* Every TICK_NUM cycle, you should set current process's current->need_resched = 1
|
||||
*/
|
||||
/* LAB6 YOUR CODE */
|
||||
/* IMPORTANT FUNCTIONS:
|
||||
/* you should upate you lab5 code
|
||||
* IMPORTANT FUNCTIONS:
|
||||
* sched_class_proc_tick
|
||||
*/
|
||||
/* LAB7 YOUR CODE */
|
||||
/* you should upate you lab6 code
|
||||
* IMPORTANT FUNCTIONS:
|
||||
* run_timer_list
|
||||
*----------------------
|
||||
* you should update your lab5 code (just add ONE or TWO lines of code):
|
||||
* Every tick, you should update the system time, iterate the timers, and trigger the timers which are end to call scheduler.
|
||||
* You can use one funcitons to finish all these things.
|
||||
*/
|
||||
break;
|
||||
case IRQ_OFFSET + IRQ_COM1:
|
||||
|
@ -225,12 +225,14 @@ trap_dispatch(struct trapframe *tf) {
|
||||
* Every TICK_NUM cycle, you should set current process's current->need_resched = 1
|
||||
*/
|
||||
/* LAB6 YOUR CODE */
|
||||
/* IMPORTANT FUNCTIONS:
|
||||
/* you should upate you lab5 code
|
||||
* IMPORTANT FUNCTIONS:
|
||||
* sched_class_proc_tick
|
||||
*/
|
||||
/* LAB7 YOUR CODE */
|
||||
/* you should upate you lab6 code
|
||||
* IMPORTANT FUNCTIONS:
|
||||
* run_timer_list
|
||||
*----------------------
|
||||
* you should update your lab5 code (just add ONE or TWO lines of code):
|
||||
* Every tick, you should update the system time, iterate the timers, and trigger the timers which are end to call scheduler.
|
||||
* You can use one funcitons to finish all these things.
|
||||
*/
|
||||
break;
|
||||
case IRQ_OFFSET + IRQ_COM1:
|
||||
|
@ -99,78 +99,3 @@ schedule(void) {
|
||||
local_intr_restore(intr_flag);
|
||||
}
|
||||
|
||||
// add timer to timer_list
|
||||
void
|
||||
add_timer(timer_t *timer) {
|
||||
bool intr_flag;
|
||||
local_intr_save(intr_flag);
|
||||
{
|
||||
assert(timer->expires > 0 && timer->proc != NULL);
|
||||
assert(list_empty(&(timer->timer_link)));
|
||||
list_entry_t *le = list_next(&timer_list);
|
||||
while (le != &timer_list) {
|
||||
timer_t *next = le2timer(le, timer_link);
|
||||
if (timer->expires < next->expires) {
|
||||
next->expires -= timer->expires;
|
||||
break;
|
||||
}
|
||||
timer->expires -= next->expires;
|
||||
le = list_next(le);
|
||||
}
|
||||
list_add_before(le, &(timer->timer_link));
|
||||
}
|
||||
local_intr_restore(intr_flag);
|
||||
}
|
||||
|
||||
// del timer from timer_list
|
||||
void
|
||||
del_timer(timer_t *timer) {
|
||||
bool intr_flag;
|
||||
local_intr_save(intr_flag);
|
||||
{
|
||||
if (!list_empty(&(timer->timer_link))) {
|
||||
if (timer->expires != 0) {
|
||||
list_entry_t *le = list_next(&(timer->timer_link));
|
||||
if (le != &timer_list) {
|
||||
timer_t *next = le2timer(le, timer_link);
|
||||
next->expires += timer->expires;
|
||||
}
|
||||
}
|
||||
list_del_init(&(timer->timer_link));
|
||||
}
|
||||
}
|
||||
local_intr_restore(intr_flag);
|
||||
}
|
||||
|
||||
// call scheduler to update tick related info, and check the timer is expired? If expired, then wakup proc
|
||||
void
|
||||
run_timer_list(void) {
|
||||
bool intr_flag;
|
||||
local_intr_save(intr_flag);
|
||||
{
|
||||
list_entry_t *le = list_next(&timer_list);
|
||||
if (le != &timer_list) {
|
||||
timer_t *timer = le2timer(le, timer_link);
|
||||
assert(timer->expires != 0);
|
||||
timer->expires --;
|
||||
while (timer->expires == 0) {
|
||||
le = list_next(le);
|
||||
struct proc_struct *proc = timer->proc;
|
||||
if (proc->wait_state != 0) {
|
||||
assert(proc->wait_state & WT_INTERRUPTED);
|
||||
}
|
||||
else {
|
||||
warn("process %d's wait_state == 0.\n", proc->pid);
|
||||
}
|
||||
wakeup_proc(proc);
|
||||
del_timer(timer);
|
||||
if (le == &timer_list) {
|
||||
break;
|
||||
}
|
||||
timer = le2timer(le, timer_link);
|
||||
}
|
||||
}
|
||||
sched_class_proc_tick(current);
|
||||
}
|
||||
local_intr_restore(intr_flag);
|
||||
}
|
||||
|
@ -9,24 +9,6 @@
|
||||
|
||||
struct proc_struct;
|
||||
|
||||
typedef struct {
|
||||
unsigned int expires; //the expire time
|
||||
struct proc_struct *proc; //the proc wait in this timer. If the expire time is end, then this proc will be scheduled
|
||||
list_entry_t timer_link; //the timer list
|
||||
} timer_t;
|
||||
|
||||
#define le2timer(le, member) \
|
||||
to_struct((le), timer_t, member)
|
||||
|
||||
// init a timer
|
||||
static inline timer_t *
|
||||
timer_init(timer_t *timer, struct proc_struct *proc, int expires) {
|
||||
timer->expires = expires;
|
||||
timer->proc = proc;
|
||||
list_init(&(timer->timer_link));
|
||||
return timer;
|
||||
}
|
||||
|
||||
struct run_queue;
|
||||
|
||||
// The introduction of scheduling classes is borrrowed from Linux, and makes the
|
||||
@ -65,9 +47,6 @@ struct run_queue {
|
||||
void sched_init(void);
|
||||
void wakeup_proc(struct proc_struct *proc);
|
||||
void schedule(void);
|
||||
void add_timer(timer_t *timer); // add timer to timer_list
|
||||
void del_timer(timer_t *timer); // del timer from timer_list
|
||||
void run_timer_list(void); // call scheduler to update tick related info, and check the timer is expired? If expired, then wakup proc
|
||||
|
||||
#endif /* !__KERN_SCHEDULE_SCHED_H__ */
|
||||
|
||||
|
@ -233,7 +233,6 @@ trap_dispatch(struct trapframe *tf) {
|
||||
*/
|
||||
ticks ++;
|
||||
assert(current != NULL);
|
||||
run_timer_list();
|
||||
break;
|
||||
case IRQ_OFFSET + IRQ_COM1:
|
||||
c = cons_getc();
|
||||
|
Loading…
Reference in New Issue
Block a user