1/* Standard C headers */
2#include <assert.h>
3#include <stddef.h>
4#include <stdlib.h>
5#include <string.h>
6
7/* POSIX headers */
8#ifdef __ANDROID__
9 #include <malloc.h>
10#endif
11
12/* Windows headers */
13#ifdef _WIN32
14 #include <malloc.h>
15#endif
16
17/* Internal library headers */
18#include "threadpool-common.h"
19#include "threadpool-object.h"
20
21
22PTHREADPOOL_INTERNAL struct pthreadpool* pthreadpool_allocate(
23 size_t threads_count)
24{
25 assert(threads_count >= 1);
26
27 const size_t threadpool_size = sizeof(struct pthreadpool) + threads_count * sizeof(struct thread_info);
28 struct pthreadpool* threadpool = NULL;
29 #if defined(__ANDROID__)
30 /*
31 * Android didn't get posix_memalign until API level 17 (Android 4.2).
32 * Use (otherwise obsolete) memalign function on Android platform.
33 */
34 threadpool = memalign(PTHREADPOOL_CACHELINE_SIZE, threadpool_size);
35 if (threadpool == NULL) {
36 return NULL;
37 }
38 #elif defined(_WIN32)
39 threadpool = _aligned_malloc(threadpool_size, PTHREADPOOL_CACHELINE_SIZE);
40 if (threadpool == NULL) {
41 return NULL;
42 }
43 #else
44 if (posix_memalign((void**) &threadpool, PTHREADPOOL_CACHELINE_SIZE, threadpool_size) != 0) {
45 return NULL;
46 }
47 #endif
48 memset(threadpool, 0, threadpool_size);
49 return threadpool;
50}
51
52
53PTHREADPOOL_INTERNAL void pthreadpool_deallocate(
54 struct pthreadpool* threadpool)
55{
56 assert(threadpool != NULL);
57
58 const size_t threadpool_size = sizeof(struct pthreadpool) + threadpool->threads_count.value * sizeof(struct thread_info);
59 memset(threadpool, 0, threadpool_size);
60
61 #ifdef _WIN32
62 _aligned_free(threadpool);
63 #else
64 free(threadpool);
65 #endif
66}
67