aboutsummaryrefslogtreecommitdiffstats
path: root/libar2simplified_init_context.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2022-03-20 08:30:40 +0100
committerMattias Andrée <maandree@kth.se>2022-03-20 08:30:40 +0100
commitf3a7696b190f58379c81bcf8683b86373eedfc63 (patch)
treea9ac6b5aba89551f62cfcac15ca83247d95a61d7 /libar2simplified_init_context.c
parentFix linking for Mac OS (diff)
downloadlibar2simplified-1.1.1.tar.gz
libar2simplified-1.1.1.tar.bz2
libar2simplified-1.1.1.tar.xz
Fix allocation success check and deallocation order1.1.1
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'libar2simplified_init_context.c')
-rw-r--r--libar2simplified_init_context.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/libar2simplified_init_context.c b/libar2simplified_init_context.c
index c7f8b69..9dcbfb0 100644
--- a/libar2simplified_init_context.c
+++ b/libar2simplified_init_context.c
@@ -155,9 +155,9 @@ destroy_thread_pool(struct libar2_context *ctx)
if (data->threads[i].error)
ret = data->threads[i].error;
}
- free(data->threads);
sem_destroy(&data->semaphore);
pthread_mutex_destroy(&data->mutex);
+ free(data->threads);
free(data);
return ret;
}
@@ -216,6 +216,10 @@ init_thread_pool(size_t desired, size_t *createdp, struct libar2_context *ctx)
size = (desired + 63) / 64;
size *= sizeof(uint_least64_t) * 2;
data = alignedalloc(1, offsetof(struct user_data, resting), size, ALIGNOF(struct user_data));
+ if (!data) {
+ errno = ENOMEM;
+ return -1;
+ }
memset(data, 0, offsetof(struct user_data, resting) + size);
data->joined = &data->resting[(desired + 63) / 64];
ctx->user_data = data;