|
|
|
#include <assert.h> |
|
#include <stddef.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
|
|
#ifdef __ANDROID__ |
|
#include <malloc.h> |
|
#endif |
|
|
|
|
|
#ifdef _WIN32 |
|
#include <malloc.h> |
|
#endif |
|
|
|
|
|
#include "threadpool-common.h" |
|
#include "threadpool-object.h" |
|
|
|
|
|
PTHREADPOOL_INTERNAL struct pthreadpool* pthreadpool_allocate( |
|
size_t threads_count) |
|
{ |
|
assert(threads_count >= 1); |
|
|
|
const size_t threadpool_size = sizeof(struct pthreadpool) + threads_count * sizeof(struct thread_info); |
|
struct pthreadpool* threadpool = NULL; |
|
#if defined(__ANDROID__) |
|
|
|
|
|
|
|
|
|
threadpool = memalign(PTHREADPOOL_CACHELINE_SIZE, threadpool_size); |
|
if (threadpool == NULL) { |
|
return NULL; |
|
} |
|
#elif defined(_WIN32) |
|
threadpool = _aligned_malloc(threadpool_size, PTHREADPOOL_CACHELINE_SIZE); |
|
if (threadpool == NULL) { |
|
return NULL; |
|
} |
|
#else |
|
if (posix_memalign((void**) &threadpool, PTHREADPOOL_CACHELINE_SIZE, threadpool_size) != 0) { |
|
return NULL; |
|
} |
|
#endif |
|
memset(threadpool, 0, threadpool_size); |
|
return threadpool; |
|
} |
|
|
|
|
|
PTHREADPOOL_INTERNAL void pthreadpool_deallocate( |
|
struct pthreadpool* threadpool) |
|
{ |
|
assert(threadpool != NULL); |
|
|
|
const size_t threadpool_size = sizeof(struct pthreadpool) + threadpool->threads_count.value * sizeof(struct thread_info); |
|
memset(threadpool, 0, threadpool_size); |
|
|
|
#ifdef _WIN32 |
|
_aligned_free(threadpool); |
|
#else |
|
free(threadpool); |
|
#endif |
|
} |
|
|