summaryrefslogtreecommitdiff
path: root/uring.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-21 21:39:15 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-21 21:39:15 +0200
commit0ba4f18ea6981b4d2b4eded11b2da4b2a2192d5b (patch)
treeb10104c574b719cf78f10945526a21a9fd385d64 /uring.c
parent003159e92bb4526845a8a1a1a4627824e939cd4b (diff)
Finish up the assert conversion
Diffstat (limited to 'uring.c')
-rw-r--r--uring.c158
1 files changed, 74 insertions, 84 deletions
diff --git a/uring.c b/uring.c
index c38c028..f08ba9e 100644
--- a/uring.c
+++ b/uring.c
@@ -32,8 +32,7 @@ get_sqe(struct cfg *cfg, struct uring_task *task)
{
struct io_uring_sqe *sqe;
- if (!cfg || !task)
- die("invalid parameters");
+ assert_die(cfg && task, "invalid arguments");
sqe = io_uring_get_sqe(&cfg->uev->uring);
if (!sqe) {
@@ -54,6 +53,8 @@ uring_task_refdump(struct uring_task *task)
char buf[4096];
struct uring_task *tmp;
+ assert_return(task);
+
buf[0] = '\0';
for (tmp = task; tmp; tmp = tmp->parent) {
size_t prefix;
@@ -87,14 +88,11 @@ uring_task_refdump(struct uring_task *task)
void
uring_task_destroy(struct cfg *cfg, struct uring_task *task)
{
+ assert_return(cfg && task);
+
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
- if (!task) {
- error("called with no task");
- return;
- }
-
if (task->fd >= 0) {
struct io_uring_sqe *sqe;
@@ -110,7 +108,9 @@ uring_task_destroy(struct cfg *cfg, struct uring_task *task)
void
uring_task_put(struct cfg *cfg, struct uring_task *task)
{
- struct uring_task *parent = task->parent;
+ struct uring_task *parent;
+
+ assert_return(cfg && task);
debug(DBG_REF, "task %s (%p), refcount %u",
task->name, task, task->refcount);
@@ -129,20 +129,21 @@ uring_task_put(struct cfg *cfg, struct uring_task *task)
return;
}
- if (parent)
- debug(DBG_REF, "putting parent %s (%p)",
- task->parent->name, task->parent);
-
+ parent = task->parent;
if (task->free)
task->free(task);
- if (parent)
+ if (parent) {
+ debug(DBG_REF, "putting parent %s (%p)", parent->name, parent);
uring_task_put(cfg, parent);
+ }
}
void
uring_task_get(struct cfg *cfg, struct uring_task *task)
{
+ assert_return(cfg && task);
+
debug(DBG_REF, "task %s (%p), refcount %u",
task->name, task, task->refcount);
@@ -155,25 +156,27 @@ uring_task_get(struct cfg *cfg, struct uring_task *task)
void
uring_task_set_buf(struct uring_task *task, struct uring_task_buf *tbuf)
{
+ assert_return(task && tbuf);
+
debug(DBG_UR, "task %s (%p), buf %p, refcount %u",
task->name, task, tbuf, task->refcount);
- if (tbuf) {
- /* iov_len and msg_namelen are set at send/receive time */
- tbuf->iov.iov_base = tbuf->buf;
- tbuf->msg.msg_name = &task->saddr.storage;
- tbuf->msg.msg_iov = &tbuf->iov;
- tbuf->msg.msg_iovlen = 1;
- tbuf->msg.msg_control = NULL;
- tbuf->msg.msg_controllen = 0;
- tbuf->msg.msg_flags = 0;
- }
+ /* iov_len and msg_namelen are set at send/receive time */
+ tbuf->iov.iov_base = tbuf->buf;
+ tbuf->msg.msg_name = &task->saddr.storage;
+ tbuf->msg.msg_iov = &tbuf->iov;
+ tbuf->msg.msg_iovlen = 1;
+ tbuf->msg.msg_control = NULL;
+ tbuf->msg.msg_controllen = 0;
+ tbuf->msg.msg_flags = 0;
task->tbuf = tbuf;
}
void
uring_task_set_fd(struct uring_task *task, int fd)
{
+ assert_return(task);
+
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, fd, task->refcount);
@@ -183,6 +186,8 @@ uring_task_set_fd(struct uring_task *task, int fd)
void
uring_task_close_fd(struct cfg *cfg, struct uring_task *task)
{
+ assert_return(cfg && task);
+
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -196,28 +201,23 @@ uring_task_close_fd(struct cfg *cfg, struct uring_task *task)
struct uring_task *
uring_parent(struct cfg *cfg)
{
- if (!cfg)
- die("called with null cfg");
-
- if (!cfg->uev)
- die("called with uninitialized uring");
+ assert_die(cfg && cfg->uev, "invalid arguments");
return &cfg->uev->task;
}
void
-uring_task_init(struct uring_task *task, const char *name,
+uring_task_init(struct cfg *cfg, struct uring_task *task, const char *name,
struct uring_task *parent, void (*free)(struct uring_task *))
{
static bool first = true;
+ assert_die(cfg && task && !empty_str(name) && free, "invalid arguments");
+
if (first)
first = false;
- else if (!parent)
- die("called without a parent");
-
- if (!free)
- die("called without destructor");
+ else
+ assert_die(parent, "called without a parent task");
task->refcount = 1;
task->fd = -1;
@@ -232,7 +232,7 @@ uring_task_init(struct uring_task *task, const char *name,
"getting parent %s (%p), refcount %u",
task->name, task, task->refcount,
task->parent->name, task->parent, task->parent->refcount);
- uring_task_get(NULL, task->parent);
+ uring_task_get(cfg, task->parent);
}
}
@@ -241,14 +241,11 @@ uring_close(struct cfg *cfg, struct uring_task *task, int fd)
{
struct io_uring_sqe *sqe;
+ assert_return(cfg && task && fd >= 0);
+
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
- if (!task || fd < 0) {
- error("invalid parameters (task: %p (%s), fd: %i)", task, task->name, fd);
- return;
- }
-
sqe = get_sqe(cfg, task);
io_uring_prep_close(sqe, fd);
io_uring_sqe_set_data(sqe, (void *)((uintptr_t)task | CQE_TYPE_CLOSE));
@@ -259,8 +256,7 @@ uring_tbuf_write_cb(struct cfg *cfg, struct uring_task *task, int res)
{
int r;
- if (!task || !task->tbuf || !task->final_cb)
- die("missing parameters");
+ assert_return(cfg && task && task->tbuf && task->final_cb);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -289,10 +285,7 @@ finished:
void
uring_tbuf_write(struct cfg *cfg, struct uring_task *task, utask_cb_t final_cb)
{
- if (!task || task->fd < 0 || !task->tbuf || task->tbuf->len < 0) {
- error("invalid parameters");
- return;
- }
+ assert_return(cfg && task && task->fd >= 0 && task->tbuf && task->tbuf->len > 0);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -307,10 +300,7 @@ uring_write(struct cfg *cfg, struct uring_task *task, void *buf, size_t len, uta
{
struct io_uring_sqe *sqe;
- if (task->fd < 0) {
- error("no fd set");
- return;
- }
+ assert_return(cfg && task && buf && len > 0 && cb && task->fd >= 0);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -326,10 +316,7 @@ uring_tbuf_read_until_cb(struct cfg *cfg, struct uring_task *task, int res)
{
int r;
- if (!task || !task->tbuf || !task->final_cb || !task->is_complete_cb) {
- error("invalid parameters");
- return;
- }
+ assert_return(cfg && task && task->tbuf && task->final_cb && task->is_complete_cb);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -368,10 +355,7 @@ void
uring_tbuf_read_until(struct cfg *cfg, struct uring_task *task,
rutask_cb_t is_complete_cb, utask_cb_t final_cb)
{
- if (!task || task->fd < 0 || !task->tbuf || !is_complete_cb || !final_cb) {
- error("%s: invalid parameters", __func__);
- return;
- }
+ assert_return(cfg && task && task->fd >= 0 && task->tbuf && is_complete_cb && final_cb);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -386,6 +370,7 @@ uring_tbuf_read_until(struct cfg *cfg, struct uring_task *task,
static int
uring_tbuf_eof(struct cfg *cfg, struct uring_task *task, int res)
{
+ assert_return(cfg && task && task->tbuf, -EINVAL);
assert_task_alive_or(DBG_UR, task, return -EINTR);
if (task->tbuf->len + 1 >= sizeof(task->tbuf->buf))
@@ -403,12 +388,16 @@ void
uring_tbuf_read_until_eof(struct cfg *cfg, struct uring_task *task,
utask_cb_t final_cb)
{
+ assert_return(cfg && task && task->tbuf && final_cb);
+
uring_tbuf_read_until(cfg, task, uring_tbuf_eof, final_cb);
}
static int
uring_tbuf_have_data(struct cfg *cfg, struct uring_task *task, int res)
{
+ assert_return(cfg && task, -EINVAL);
+
if (res < 0)
return res;
else
@@ -418,6 +407,8 @@ uring_tbuf_have_data(struct cfg *cfg, struct uring_task *task, int res)
void
uring_tbuf_read(struct cfg *cfg, struct uring_task *task, utask_cb_t final_cb)
{
+ assert_return(cfg && task && final_cb);
+
uring_tbuf_read_until(cfg, task, uring_tbuf_have_data, final_cb);
}
@@ -426,10 +417,7 @@ uring_read_offset(struct cfg *cfg, struct uring_task *task, void *buf, size_t le
{
struct io_uring_sqe *sqe;
- if (task->fd < 0) {
- error("uring_read called with no fd set");
- return;
- }
+ assert_return(cfg && task && buf && len > 0 && task->fd >= 0);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -445,6 +433,8 @@ uring_openat(struct cfg *cfg, struct uring_task *task, const char *path, utask_c
{
struct io_uring_sqe *sqe;
+ assert_return(cfg && task && !empty_str(path) && cb);
+
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -459,10 +449,7 @@ uring_tbuf_recvmsg(struct cfg *cfg, struct uring_task *task, utask_cb_t cb)
{
struct io_uring_sqe *sqe;
- if (!task->tbuf) {
- error("called with no tbuf set");
- return;
- }
+ assert_return(cfg && task && task->fd >= 0 && task->tbuf && cb);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -482,10 +469,7 @@ uring_tbuf_sendmsg(struct cfg *cfg, struct uring_task *task, utask_cb_t cb)
{
struct io_uring_sqe *sqe;
- if (!task->tbuf) {
- error("%s: called with no tbuf set", __func__);
- return;
- }
+ assert_return(cfg && task && task->fd >= 0 && task->tbuf && cb);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -504,10 +488,7 @@ uring_connect(struct cfg *cfg, struct uring_task *task, struct saddr *saddr, uta
{
struct io_uring_sqe *sqe;
- if (task->fd < 0) {
- error("no fd set");
- return;
- }
+ assert_return(cfg && task && task->fd >= 0 && saddr && cb);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -523,10 +504,7 @@ uring_accept(struct cfg *cfg, struct uring_task *task, struct saddr *saddr, utas
{
struct io_uring_sqe *sqe;
- if (task->fd < 0) {
- error("no fd set");
- return;
- }
+ assert_return(cfg && task && task->fd >= 0 && saddr && cb);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -543,10 +521,7 @@ uring_poll(struct cfg *cfg, struct uring_task *task, short poll_mask, utask_cb_t
{
struct io_uring_sqe *sqe;
- if (task->fd < 0) {
- error("uring_poll called with no fd set");
- return;
- }
+ assert_return(cfg && task && task->fd >= 0 && poll_mask && cb);
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -562,6 +537,8 @@ uring_poll_cancel(struct cfg *cfg, struct uring_task *task)
{
struct io_uring_sqe *sqe;
+ assert_return(cfg && task);
+
if (task->fd < 0) {
/* not an error, no need to print error msg */
return;
@@ -581,6 +558,8 @@ uring_free(struct uring_task *task)
{
struct uring_ev *uev = container_of(task, struct uring_ev, task);
+ assert_return(task);
+
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -592,14 +571,19 @@ uring_free(struct uring_task *task)
void
uring_refdump(struct uring_ev *uev)
{
+ assert_return(uev);
+
uring_task_refdump(&uev->task);
}
void
uring_delete(struct cfg *cfg)
{
- struct uring_task *task = &cfg->uev->task;
+ struct uring_task *task;
+
+ assert_return(cfg && cfg->uev);
+ task = &cfg->uev->task;
debug(DBG_UR, "task %s (%p), fd %i, refcount %u",
task->name, task, task->fd, task->refcount);
@@ -611,6 +595,8 @@ uring_init(struct cfg *cfg)
{
struct uring_ev *uev;
+ assert_return(cfg);
+
uev = zmalloc(sizeof(*uev));
if (!uev)
die("malloc: %m");
@@ -621,7 +607,7 @@ uring_init(struct cfg *cfg)
debug(DBG_UR, "uring initialized, features: 0x%08x",
uev->uring_params.features);
- uring_task_init(&uev->task, "uev", &cfg->task, uring_free);
+ uring_task_init(cfg, &uev->task, "uev", &cfg->task, uring_free);
cfg->uev = uev;
uev->cfg = cfg;
}
@@ -630,6 +616,8 @@ static inline void
uring_print_cqe(struct cfg *cfg, const char *type, struct uring_task *task,
struct io_uring_cqe *cqe)
{
+ assert_return(cfg && !empty_str(type) && task && cqe);
+
debug(DBG_UR, "got CQE "
"(type: %s, res: %i (%s), task: %s (%p), fd: %i, cb: %p)",
type,
@@ -644,6 +632,8 @@ uring_print_cqe(struct cfg *cfg, const char *type, struct uring_task *task,
void
uring_event_loop(struct cfg *cfg)
{
+ assert_return(cfg);
+
while (true) {
struct io_uring_cqe *cqe;
unsigned nr, head;