commit c07f674f77a21bed3c1ed4a8569b82cd92f8af28
parent b20f5583df6f044656eee78beea4bb4f6165ef7b
Author: Louis Burda <quent.burda@gmail.com>
Date: Mon, 13 Mar 2023 20:59:26 +0100
Return errno directly for thread-safety
Diffstat:
5 files changed, 37 insertions(+), 52 deletions(-)
diff --git a/include/vec.h b/include/vec.h
@@ -13,7 +13,7 @@ struct vec {
int vec_init(struct vec *vec, size_t dsize, size_t cap);
void vec_deinit(struct vec *vec);
-struct vec *vec_alloc(size_t dsize, size_t cap);
+int vec_alloc(struct vec **vec, size_t dsize, size_t cap);
void vec_free(struct vec *vec);
void vec_clear(struct vec *vec);
@@ -27,8 +27,6 @@ void vec_replace(struct vec *vec, size_t index, const void *data, size_t count);
bool vec_iter_fwd(struct vec *vec, void **p);
bool vec_iter_bwd(struct vec *vec, void **p);
-extern int libvec_errno;
-
static inline void *
vec_at(struct vec *vec, size_t index)
{
@@ -53,17 +51,23 @@ vec_empty(struct vec *vec)
return !vec->len;
}
-static inline void *
-vec_alloc_slots(struct vec *vec, size_t count)
+static inline int
+vec_alloc_slots(struct vec *vec, void **out, size_t count)
{
- vec_reserve(vec, vec->len, count);
- return vec->data + (vec->len - count) * vec->dsize;
+ int ret;
+
+ ret = vec_reserve(vec, vec->len, count);
+ if (ret) return ret;
+
+ *out = vec->data + (vec->len - count) * vec->dsize;
+
+ return 0;
}
-static inline void *
-vec_alloc_slot(struct vec *vec)
+static inline int
+vec_alloc_slot(struct vec *vec, void **out)
{
- return vec_alloc_slots(vec, 1);
+ return vec_alloc_slots(vec, out, 1);
}
static inline void
diff --git a/libvec.api b/libvec.api
@@ -1,5 +1,3 @@
-libvec_errno
-
vec_init
vec_deinit
diff --git a/libvec.lds b/libvec.lds
@@ -1,7 +1,5 @@
-LIBVEC_1.2 {
+LIBVEC_1.3 {
global:
- libvec_errno;
-
vec_init;
vec_deinit;
diff --git a/src/test.c b/src/test.c
@@ -5,21 +5,21 @@
#include <string.h>
#include <stdlib.h>
-#define LIBVEC_ERR() errx(1, "test: libvec: %s", strerror(libvec_errno))
+#define LIBVEC_ERR(rc) errx(1, "libvec: %s", strerror(rc))
int
main(int argc, const char **argv)
{
struct vec vec;
- int i, ret;
+ int i, rc;
int *val;
- ret = vec_init(&vec, sizeof(int), 10);
- if (ret) LIBVEC_ERR();
+ rc = vec_init(&vec, sizeof(int), 10);
+ if (rc) LIBVEC_ERR(rc);
for (i = 1; i < argc; i++) {
- val = vec_alloc_slot(&vec);
- if (!val) LIBVEC_ERR();
+ rc = vec_alloc_slot(&vec, (void **)&val);
+ if (rc) LIBVEC_ERR(rc);
*val = atoi(argv[i]);
}
diff --git a/src/vec.c b/src/vec.c
@@ -11,8 +11,6 @@
#define LIBVEC_CHECK(x)
#endif
-int libvec_errno = 0;
-
static inline void
libvec_assert(int cond, const char *file, int line, const char *condstr)
{
@@ -35,10 +33,7 @@ vec_init(struct vec *vec, size_t dsize, size_t cap)
vec->data = NULL;
if (vec->cap) {
vec->data = calloc(cap, dsize);
- if (!vec->data) {
- libvec_errno = errno;
- return libvec_errno;
- }
+ if (!vec->data) return errno;
}
return 0;
@@ -52,25 +47,23 @@ vec_deinit(struct vec *vec)
free(vec->data);
}
-struct vec *
-vec_alloc(size_t dsize, size_t cap)
+int
+vec_alloc(struct vec **vec, size_t dsize, size_t cap)
{
- struct vec *vec;
+ int rc;
- LIBVEC_CHECK(dsize > 0 && cap > 0);
+ LIBVEC_CHECK(vec != NULL && dsize > 0 && cap > 0);
- vec = malloc(sizeof(struct vec));
- if (!vec) {
- libvec_errno = errno;
- return NULL;
- }
+ *vec = malloc(sizeof(struct vec));
+ if (!*vec) return errno;
- if (!vec_init(vec, dsize, cap)) {
+ rc = vec_init(*vec, dsize, cap);
+ if (rc) {
free(vec);
- return NULL;
+ return rc;
}
- return vec;
+ return 0;
}
void
@@ -82,6 +75,7 @@ vec_free(struct vec *vec)
free(vec);
}
+
void
vec_clear(struct vec *vec)
{
@@ -99,10 +93,7 @@ vec_resize(struct vec *vec, size_t cap)
vec->cap = cap;
alloc = realloc(vec->data, vec->cap * vec->dsize);
- if (!alloc) {
- libvec_errno = errno;
- return libvec_errno;
- }
+ if (!alloc) return errno;
vec->data = alloc;
return 0;
@@ -122,10 +113,7 @@ vec_shrink(struct vec *vec)
}
alloc = realloc(vec->data, vec->cap * vec->dsize);
- if (!alloc) {
- libvec_errno = errno;
- return libvec_errno;
- }
+ if (!alloc) return errno;
vec->data = alloc;
return 0;
@@ -143,10 +131,7 @@ vec_reserve(struct vec *vec, size_t index, size_t len)
if (vec->len + len > vec->cap)
vec->cap = vec->len + len;
alloc = realloc(vec->data, vec->cap * vec->dsize);
- if (!alloc) {
- libvec_errno = errno;
- return errno;
- }
+ if (!alloc) return errno;
vec->data = alloc;
}
@@ -158,7 +143,7 @@ vec_reserve(struct vec *vec, size_t index, size_t len)
vec->len += len;
- return true;
+ return 0;
}
void