summaryrefslogtreecommitdiff
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/queue.h37
-rw-r--r--src/kernel/vfs/request.c20
2 files changed, 41 insertions, 16 deletions
diff --git a/src/kernel/queue.h b/src/kernel/queue.h
new file mode 100644
index 0000000..896824f
--- /dev/null
+++ b/src/kernel/queue.h
@@ -0,0 +1,37 @@
+/* documented in queue(9) */
+#include <kernel/panic.h>
+
+/* struct QueueNode {
+ * ...
+ * struct QueueNode *name_next;
+ * ...
+ * }
+ * struct QueueHead {
+ * struct QueueNode *head, **slot;
+ * }
+ */
+
+#define QUEUE_INIT(q) do { \
+ (q)->head = NULL; \
+ (q)->slot = &(q)->head; \
+} while(0)
+
+#define QUEUE_APPEND(q, name, el) do { \
+ assert((el)->name##_next == NULL); \
+ assert((q)->slot != NULL); \
+ assert(*(q)->slot == NULL); \
+ *(q)->slot = (el); \
+ (q)->slot = &(el)->name##_next; \
+} while(0)
+
+#define QUEUE_POP(q, name) ({ \
+ typeof((q)->head) __q_el = (q)->head; \
+ if (__q_el) { \
+ (q)->head = __q_el->name##_next; \
+ __q_el->name##_next = NULL; \
+ if ((q)->slot == &__q_el->name##_next) { \
+ (q)->slot = &(q)->head; \
+ } \
+ } \
+ __q_el; \
+})
diff --git a/src/kernel/vfs/request.c b/src/kernel/vfs/request.c
index 8a80f04..8e6f14a 100644
--- a/src/kernel/vfs/request.c
+++ b/src/kernel/vfs/request.c
@@ -3,6 +3,7 @@
#include <kernel/malloc.h>
#include <kernel/panic.h>
#include <kernel/proc.h>
+#include <kernel/queue.h>
#include <kernel/vfs/request.h>
#include <shared/mem.h>
@@ -236,32 +237,19 @@ vfsback_provdown(VfsBackend *b)
void
reqqueue_init(ReqQueue *q)
{
- q->head = NULL;
- q->slot = &q->head;
+ QUEUE_INIT(q);
}
void
reqqueue_join(ReqQueue *q, VfsReq *req)
{
- assert(req->reqqueue_next == NULL);
- assert(q->slot != NULL);
- assert(*q->slot == NULL);
- *q->slot = req;
- q->slot = &req->reqqueue_next;
+ QUEUE_APPEND(q, reqqueue, req);
}
VfsReq *
reqqueue_pop(ReqQueue *q)
{
- VfsReq *req = q->head;
- if (req) {
- q->head = req->reqqueue_next;
- req->reqqueue_next = NULL;
- if (q->slot == &req->reqqueue_next) {
- q->slot = &q->head;
- }
- }
- return req;
+ return QUEUE_POP(q, reqqueue);
}
void