]> Zhao Yanbai Git Server - kernel.git/commitdiff
删除semaphore __down里的enable_irq和disable_irq
authoracevest <zhaoyanbai@126.com>
Sat, 20 May 2023 06:26:13 +0000 (14:26 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 20 May 2023 06:26:13 +0000 (14:26 +0800)
include/system.h
kernel/semaphore.c
kernel/system.c
kernel/wait.c

index f30d7ccf8eeec53b41e95cd7a08a1535c6f5cfd6..3e56a3eb780ed494c15c5f4565a540fed6f3c908 100644 (file)
@@ -267,7 +267,7 @@ void init_task_entry();
 void disk_task_entry();
 void user_task_entry();
 
-extern int irq_reenter;
+extern volatile int irq_reenter;
 #endif
 
 #endif  //_SYSTEM_H
index 857dca1d53f148cb94aa6a380d63a096c060697a..55360e8a3d2112fcb8fd1c803eaa7414c740b7cc 100644 (file)
@@ -21,7 +21,7 @@ typedef struct semaphore_waiter {
 
 #define DECLARE_SEMAPHORE_WAITER(name, task) semaphore_waiter_t name = SEMAPHORE_WAITER_INITIALIZER(name, task)
 
-void __down(semaphore_t *s) {
+volatile void __down(semaphore_t *s) {
     task_union *task = current;
     DECLARE_SEMAPHORE_WAITER(waiter, task);
     list_add_tail(&waiter.list, &s->wait_list);
@@ -29,21 +29,18 @@ void __down(semaphore_t *s) {
     while (true) {
         task->state = TASK_WAIT;
 
-        enable_irq();
-
         schedule();
 
-        disable_irq();
-
         if (waiter.up) {
             break;
         }
     }
 }
 
-void down(semaphore_t *s) {
+volatile void down(semaphore_t *s) {
     unsigned long iflags;
     irq_save(iflags);
+
     if (likely(s->cnt > 0)) {
         s->cnt--;
     } else {
@@ -53,7 +50,7 @@ void down(semaphore_t *s) {
     irq_restore(iflags);
 }
 
-void __up(semaphore_t *s) {
+volatile void __up(semaphore_t *s) {
     semaphore_waiter_t *waiter = list_first_entry(&s->wait_list, semaphore_waiter_t, list);
     list_del(&waiter->list);
     waiter->up = 1;
@@ -61,7 +58,7 @@ void __up(semaphore_t *s) {
     waiter->task->state = TASK_READY;
 }
 
-void up(semaphore_t *s) {
+volatile void up(semaphore_t *s) {
     unsigned long iflags;
     irq_save(iflags);
 
index 48dded146ab7983aac43bfd4c67243304b4eccca..56183d92cea656f259aa86a81db2db992d455617 100644 (file)
@@ -192,4 +192,4 @@ Desc gdt[NGDT] __attribute__((__aligned__(8)));
 char gdtr[6] __attribute__((__aligned__(4)));
 char idtr[6] __attribute__((__aligned__(4)));
 
-int irq_reenter = 0x00;
\ No newline at end of file
+volatile int irq_reenter = 0x00;
\ No newline at end of file
index a94aca86fe3e12acadd75fdb7b0f08f6395925a3..a89f2f2667f3ee45f17b5331c816afb13cf16a20 100644 (file)
 #include <sched.h>
 #include <wait.h>
 
-void init_wait_queue_head(wait_queue_head_t *wqh) { INIT_LIST_HEAD(&wqh->task_list); }
+volatile void init_wait_queue_head(wait_queue_head_t *wqh) { INIT_LIST_HEAD(&wqh->task_list); }
 
-void add_wait_queue(wait_queue_head_t *head, wait_queue_t *wq) {
+volatile void add_wait_queue(wait_queue_head_t *head, wait_queue_t *wq) {
     unsigned long flags;
     irq_save(flags);
     list_add_tail(&wq->task_list, &head->task_list);
     irq_restore(flags);
 }
 
-void del_wait_queue(wait_queue_head_t *head, wait_queue_t *wq) {
+volatile void del_wait_queue(wait_queue_head_t *head, wait_queue_t *wq) {
     unsigned long flags;
     irq_save(flags);
     list_del(&wq->task_list);
     irq_restore(flags);
 }
 
-void prepare_to_wait(wait_queue_head_t *head, wait_queue_t *wq, unsigned int state) {
+volatile void prepare_to_wait(wait_queue_head_t *head, wait_queue_t *wq, unsigned int state) {
     unsigned long flags;
     irq_save(flags);
     if (list_empty(&wq->task_list)) {
@@ -38,7 +38,7 @@ void prepare_to_wait(wait_queue_head_t *head, wait_queue_t *wq, unsigned int sta
     irq_restore(flags);
 }
 
-void __end_wait(wait_queue_head_t *head, wait_queue_t *wq) {
+volatile void __end_wait(wait_queue_head_t *head, wait_queue_t *wq) {
     set_current_state(TASK_READY);
     unsigned long flags;
     irq_save(flags);
@@ -46,7 +46,7 @@ void __end_wait(wait_queue_head_t *head, wait_queue_t *wq) {
     irq_restore(flags);
 }
 
-void sleep_on(wait_queue_head_t *head) {
+volatile void sleep_on(wait_queue_head_t *head) {
     DECLARE_WAIT_QUEUE(wait, current);
 
     unsigned long flags;
@@ -59,9 +59,12 @@ void sleep_on(wait_queue_head_t *head) {
     irq_restore(flags);
 
     schedule();
+
+    // wake_up操作会把wait从heat链表上删除
+    // 所以这里就不用做什么了
 }
 
-void __wake_up(wait_queue_head_t *head, int nr) {
+volatile void __wake_up(wait_queue_head_t *head, int nr) {
     unsigned long flags;
     wait_queue_t *p, *tmp;
     irq_save(flags);
@@ -80,7 +83,7 @@ void __wake_up(wait_queue_head_t *head, int nr) {
     // no schedule() here.
 }
 
-void wake_up(wait_queue_head_t *head) { __wake_up(head, 1); }
+volatile void wake_up(wait_queue_head_t *head) { __wake_up(head, 1); }
 
 #include <irq.h>
 DECLARE_WAIT_QUEUE_HEAD(debug_wq);