]> Zhao Yanbai Git Server - kernel.git/commitdiff
...
authoracevest <zhaoyanbai@126.com>
Fri, 20 Oct 2023 12:43:31 +0000 (20:43 +0800)
committeracevest <zhaoyanbai@126.com>
Fri, 20 Oct 2023 12:43:31 +0000 (20:43 +0800)
fs/buffer.c
include/buffer.h
include/sched.h
include/semaphore.h
include/task.h
include/wait.h
kernel/irq.c

index a5f0777d745bca128e400d866f54ffbfde6f49e3..62cd0c19cc5bb167489685436f859ad5c4a0c57f 100644 (file)
@@ -127,9 +127,7 @@ again:
     // 因为可能有的进程调用了write、read后再直接调用brelse
     // 虽然此时ref_count为0,但io操作标记的b->locked并未结束
     // 所以需要在此等待其结束
-    while (b->locked == 1) {
-        // 此时是不用担心wake_up在这个sleep_on之前调用
-    }
+    wait_event(&b->waitq_lock, b->locked == 0);
 
     // 找到了
     b->block = block;
@@ -191,6 +189,7 @@ void init_buffer() {
             b->page = page;
             b->uptodate = 0;
             b->locked = 0;
+            init_wait_queue_head(&b->waitq_lock);
             list_init(&b->node);
 
             assert(NULL != b->data);
index 8f570cc5fa9519da3ff0029758be1646e1f5ee78..f58b695daace3fee813411d6b2c74230252b152b 100644 (file)
@@ -14,6 +14,7 @@
 #include <mm.h>
 #include <page.h>
 #include <system.h>
+#include <wait.h>
 
 typedef struct bbuffer {
     uint32_t block;  // block number
@@ -22,6 +23,7 @@ typedef struct bbuffer {
     dev_t dev;
     page_t *page;
     list_head_t node;
+    wait_queue_head_t waitq_lock;
     uint16_t block_size;  // block size
     uint16_t uptodate : 1;
     uint16_t locked : 1;
index ed00ce6dde3f99f2c511245fd665088b63e011d1..7bc55cc600d1df91db6d766d4fc0628e77f8a1f6 100644 (file)
@@ -25,8 +25,6 @@
 
 void schedule();
 
-void wake_up(wait_queue_head_t *wqh);
-
 extern task_union root_task;
 
 extern void load_cr3(task_union *tsk);
index 27eb0094f546bf0576346d4a20ba7cd55873650a..207341cb428e48770733035c4a9fa3ff125215d0 100644 (file)
@@ -28,8 +28,6 @@ void semaphore_init(semaphore_t *s, unsigned int v);
 // 如果s->cnt == 0 会重新调度进程
 volatile void down(semaphore_t *s);
 
-// volatile bool try_down(semaphore_t *s);
-
 // up
 // 只会唤醒进程,但不会立即重新调度进程
 volatile void up(semaphore_t *s);
index 18827237c264ae2b4f8edfc5b08f85d9e5597741..795b28e3b423e2b32104a664fc8478c57978d8bf 100644 (file)
@@ -22,7 +22,7 @@
 #include <processor.h>
 #include <system.h>
 #include <types.h>
-#include <wait.h>
+// #include <wait.h>
 
 enum {
     TASK_UNUSED,
index 8f29e935d4e75cda0b18fd9ccce0b478171ef54e..f1bf5ea0aec44592627355edcc97dac0e02e8ef5 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <irq.h>
 #include <list.h>
-
+#include <sched.h>
 union task_union;
 
 typedef struct wait_queue_head {
index ff2d26585b2b355e103cfb13b592955271e7c1c5..b6f6a5b45b1378d27c60cee74ec845b5969c213e 100644 (file)
@@ -75,6 +75,7 @@ void dump_irq_nr_stack() {
 #endif
 
 void irq_bh_handler();
+void schedule();
 
 __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
     unsigned int irq = regs->irq;