#pragma once
+#include <completion.h>
#include <list.h>
#include <semaphore.h>
#include <types.h>
-#include <wait.h>
typedef enum {
DISK_REQ_IDENTIFY,
void *buf; // 到的缓冲区
disk_request_cmd_t command; // 命令
list_head_t list;
- wait_queue_head_t wait; // 等待队列
+ // wait_queue_head_t wait; // 等待队列
// 驱动器完全有可能在进程在进程睡眠到等待队列前返回数据并执行唤醒操作
// 这时等待队列上无进程,就相当于不执行任何操作
// 然后进程再睡眠到等待队列上,就会造成永远无法唤醒该进程
// 因此要添加一个字段,标志驱动器已经对该请求做过唤醒操作
// 进程在睡眠前需要检查该字段
- int done;
+ // int done;
+ completion_t completion;
} disk_request_t;
typedef struct {
* ------------------------------------------------------------------------
*/
+#include <completion.h>
#include <disk.h>
#include <sched.h>
panic("disk DMA read cross 64K");
}
- INIT_LIST_HEAD(&r->wait.task_list);
- r->done = 0;
+ // INIT_LIST_HEAD(&r->wait.task_list);
+ // r->done = 0;
+
+ init_completion(&r->completion);
+
// r.pos = pos;
// r.count = count;
// r.buf = kmalloc(512, 0);
// 等待task_dist结束
// printk("wait event\n");
- wait_event(&r->wait, r->done != 0);
+ // wait_event(&r->wait, r->done != 0);
+ wait_completion(&r->completion);
// printk("wait finished\n");
}
}
// 唤醒等待该请求的进程
- r->done = 1;
- wake_up(&r->wait);
+ // r->done = 1;
+ // wake_up(&r->wait);
+ complete(&r->completion);
}
}