Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Utilities/cmlibrhash/librhash/util.c
3150 views
1
/* util.c - memory functions.
2
*
3
* Copyright (c) 2020, Aleksey Kravchenko <[email protected]>
4
*
5
* Permission to use, copy, modify, and/or distribute this software for any
6
* purpose with or without fee is hereby granted.
7
*
8
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
* PERFORMANCE OF THIS SOFTWARE.
15
*/
16
#include "util.h"
17
18
#if defined(HAS_POSIX_ALIGNED_ALLOC)
19
20
#include <errno.h>
21
22
void* rhash_px_aalloc(size_t alignment, size_t size)
23
{
24
void* ptr;
25
if ((errno = posix_memalign(&ptr, alignment, size)) != 0)
26
return NULL;
27
return ptr;
28
}
29
30
#elif defined(HAS_GENERIC_ALIGNED_ALLOC)
31
32
#include <assert.h>
33
#include <stdlib.h>
34
35
void* rhash_aligned_alloc(size_t alignment, size_t size)
36
{
37
unsigned char* block = (unsigned char*)malloc(size + alignment);
38
assert((alignment & (alignment - 1)) == 0);
39
assert(alignment >= sizeof(void*));
40
if (block) {
41
const size_t alignment_mask = (alignment - 1);
42
unsigned char* basement = block + sizeof(void*);
43
size_t offset = ((unsigned char*)0 - basement) & alignment_mask;
44
void** result = (void**)(basement + offset);
45
assert((((unsigned char*)result - (unsigned char*)0) % alignment) == 0);
46
result[-1] = block; /* store original pointer */
47
return result;
48
}
49
return NULL;
50
}
51
52
void rhash_aligned_free(void* ptr)
53
{
54
void** pfree = (void**)ptr;
55
if (ptr)
56
free(pfree[-1]);
57
}
58
59
#else
60
typedef int dummy_declaration_required_by_strict_iso_c;
61
#endif /* HAS_POSIX_ALIGNED_ALLOC / HAS_GENERIC_ALIGNED_ALLOC */
62
63