summaryrefslogtreecommitdiffstats
path: root/src/ioq.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ioq.h')
-rw-r--r--src/ioq.h118
1 files changed, 89 insertions, 29 deletions
diff --git a/src/ioq.h b/src/ioq.h
index 99c18c2..5eaa066 100644
--- a/src/ioq.h
+++ b/src/ioq.h
@@ -8,6 +8,10 @@
#ifndef BFS_IOQ_H
#define BFS_IOQ_H
+#include "bfs.h"
+#include "dir.h"
+#include "stat.h"
+
#include <stddef.h>
/**
@@ -19,12 +23,26 @@ struct ioq;
* I/O queue operations.
*/
enum ioq_op {
+ /** ioq_nop(). */
+ IOQ_NOP,
/** ioq_close(). */
IOQ_CLOSE,
/** ioq_opendir(). */
IOQ_OPENDIR,
/** ioq_closedir(). */
IOQ_CLOSEDIR,
+ /** ioq_stat(). */
+ IOQ_STAT,
+};
+
+/**
+ * ioq_nop() types.
+ */
+enum ioq_nop_type {
+ /** A lightweight nop that avoids syscalls. */
+ IOQ_NOP_LIGHT,
+ /** A heavyweight nop that involves a syscall. */
+ IOQ_NOP_HEAVY,
};
/**
@@ -32,18 +50,20 @@ enum ioq_op {
*/
struct ioq_ent {
/** The I/O operation. */
- enum ioq_op op;
+ cache_align enum ioq_op op;
- /** The return value of the operation. */
- int ret;
- /** The error code, if the operation failed. */
- int error;
+ /** The return value (on success) or negative error code (on failure). */
+ int result;
/** Arbitrary user data. */
void *ptr;
/** Operation-specific arguments. */
union {
+ /** ioq_nop() args. */
+ struct ioq_nop {
+ enum ioq_nop_type type;
+ } nop;
/** ioq_close() args. */
struct ioq_close {
int fd;
@@ -51,22 +71,31 @@ struct ioq_ent {
/** ioq_opendir() args. */
struct ioq_opendir {
struct bfs_dir *dir;
- int dfd;
const char *path;
+ int dfd;
+ enum bfs_dir_flags flags;
} opendir;
/** ioq_closedir() args. */
struct ioq_closedir {
struct bfs_dir *dir;
} closedir;
+ /** ioq_stat() args. */
+ struct ioq_stat {
+ const char *path;
+ struct bfs_stat *buf;
+ void *xbuf;
+ int dfd;
+ enum bfs_stat_flags flags;
+ } stat;
};
};
/**
* Create an I/O queue.
*
- * @param depth
+ * @depth
* The maximum depth of the queue.
- * @param nthreads
+ * @nthreads
* The maximum number of background threads.
* @return
* The new I/O queue, or NULL on failure.
@@ -79,13 +108,27 @@ struct ioq *ioq_create(size_t depth, size_t nthreads);
size_t ioq_capacity(const struct ioq *ioq);
/**
+ * A no-op, for benchmarking.
+ *
+ * @ioq
+ * The I/O queue.
+ * @type
+ * The type of operation to perform.
+ * @ptr
+ * An arbitrary pointer to associate with the request.
+ * @return
+ * 0 on success, or -1 on failure.
+ */
+int ioq_nop(struct ioq *ioq, enum ioq_nop_type type, void *ptr);
+
+/**
* Asynchronous close().
*
- * @param ioq
+ * @ioq
* The I/O queue.
- * @param fd
+ * @fd
* The fd to close.
- * @param ptr
+ * @ptr
* An arbitrary pointer to associate with the request.
* @return
* 0 on success, or -1 on failure.
@@ -95,29 +138,31 @@ int ioq_close(struct ioq *ioq, int fd, void *ptr);
/**
* Asynchronous bfs_opendir().
*
- * @param ioq
+ * @ioq
* The I/O queue.
- * @param dir
+ * @dir
* The allocated directory.
- * @param dfd
+ * @dfd
* The base file descriptor.
- * @param path
+ * @path
* The path to open, relative to dfd.
- * @param ptr
+ * @flags
+ * Flags that control which directory entries are listed.
+ * @ptr
* An arbitrary pointer to associate with the request.
* @return
* 0 on success, or -1 on failure.
*/
-int ioq_opendir(struct ioq *ioq, struct bfs_dir *dir, int dfd, const char *path, void *ptr);
+int ioq_opendir(struct ioq *ioq, struct bfs_dir *dir, int dfd, const char *path, enum bfs_dir_flags flags, void *ptr);
/**
* Asynchronous bfs_closedir().
*
- * @param ioq
+ * @ioq
* The I/O queue.
- * @param dir
+ * @dir
* The directory to close.
- * @param ptr
+ * @ptr
* An arbitrary pointer to associate with the request.
* @return
* 0 on success, or -1 on failure.
@@ -125,31 +170,46 @@ int ioq_opendir(struct ioq *ioq, struct bfs_dir *dir, int dfd, const char *path,
int ioq_closedir(struct ioq *ioq, struct bfs_dir *dir, void *ptr);
/**
- * Pop a response from the queue.
+ * Asynchronous bfs_stat().
*
- * @param ioq
+ * @ioq
* The I/O queue.
+ * @dfd
+ * The base file descriptor.
+ * @path
+ * The path to stat, relative to dfd.
+ * @flags
+ * Flags that affect the lookup.
+ * @buf
+ * A place to store the stat buffer, if successful.
+ * @ptr
+ * An arbitrary pointer to associate with the request.
* @return
- * The next response, or NULL.
+ * 0 on success, or -1 on failure.
+ */
+int ioq_stat(struct ioq *ioq, int dfd, const char *path, enum bfs_stat_flags flags, struct bfs_stat *buf, void *ptr);
+
+/**
+ * Submit any buffered requests.
*/
-struct ioq_ent *ioq_pop(struct ioq *ioq);
+void ioq_submit(struct ioq *ioq);
/**
- * Pop a response from the queue, without blocking.
+ * Pop a response from the queue.
*
- * @param ioq
+ * @ioq
* The I/O queue.
* @return
* The next response, or NULL.
*/
-struct ioq_ent *ioq_trypop(struct ioq *ioq);
+struct ioq_ent *ioq_pop(struct ioq *ioq, bool block);
/**
* Free a queue entry.
*
- * @param ioq
+ * @ioq
* The I/O queue.
- * @param ent
+ * @ent
* The entry to free.
*/
void ioq_free(struct ioq *ioq, struct ioq_ent *ent);