mempool: init_func can return an error
[librseq.git] / src / rseq-mempool.c
index d0ed49290ce996b58036cee37ad13185b69a0821..5823ae59be9e2cccff60c77ef00566c95b9c7b36 100644 (file)
@@ -20,7 +20,7 @@
 #endif
 
 #include "rseq-utils.h"
-#include "smp.h"
+#include <rseq/rseq.h>
 
 /*
  * rseq-mempool.c: rseq CPU-Local Storage (CLS) memory allocator.
@@ -76,7 +76,7 @@ struct rseq_mempool_attr {
        void *mmap_priv;
 
        bool init_set;
-       void (*init_func)(void *priv, void *addr, size_t len, int cpu);
+       int (*init_func)(void *priv, void *addr, size_t len, int cpu);
        void *init_priv;
 
        bool robust_set;
@@ -372,7 +372,7 @@ void *aligned_mmap_anonymous(struct rseq_mempool *pool,
        void *ptr;
 
        if (len < page_size || alignment < page_size ||
-                       !is_pow2(len) || !is_pow2(alignment)) {
+                       !is_pow2(alignment) || (len & (alignment - 1))) {
                errno = EINVAL;
                return NULL;
        }
@@ -468,9 +468,11 @@ struct rseq_mempool_range *rseq_mempool_range_create(struct rseq_mempool *pool)
                int cpu;
 
                for (cpu = 0; cpu < pool->attr.max_nr_cpus; cpu++) {
-                       pool->attr.init_func(pool->attr.init_priv,
-                               base + (pool->attr.stride * cpu),
-                               pool->attr.stride, cpu);
+                       if (pool->attr.init_func(pool->attr.init_priv,
+                                       base + (pool->attr.stride * cpu),
+                                       pool->attr.stride, cpu)) {
+                               goto error_alloc;
+                       }
                }
        }
        return range;
@@ -537,7 +539,7 @@ struct rseq_mempool *rseq_mempool_create(const char *pool_name,
                }
                if (attr.max_nr_cpus == 0) {
                        /* Auto-detect */
-                       attr.max_nr_cpus = get_possible_cpus_array_len();
+                       attr.max_nr_cpus = rseq_get_max_nr_cpus();
                        if (attr.max_nr_cpus == 0) {
                                errno = EINVAL;
                                return NULL;
@@ -824,7 +826,7 @@ int rseq_mempool_attr_set_mmap(struct rseq_mempool_attr *attr,
 }
 
 int rseq_mempool_attr_set_init(struct rseq_mempool_attr *attr,
-               void (*init_func)(void *priv, void *addr, size_t len, int cpu),
+               int (*init_func)(void *priv, void *addr, size_t len, int cpu),
                void *init_priv)
 {
        if (!attr) {
This page took 0.023341 seconds and 4 git commands to generate.