Blender  V3.3
BLI_allocator.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 #pragma once
3 
26 #include <algorithm>
27 #include <stdlib.h>
28 
29 #include "MEM_guardedalloc.h"
30 
31 #include "BLI_math_base.h"
32 #include "BLI_utildefines.h"
33 
34 namespace blender {
35 
41  public:
42  void *allocate(size_t size, size_t alignment, const char *name)
43  {
44  /* Should we use MEM_mallocN, when alignment is small? If yes, how small must alignment be? */
45  return MEM_mallocN_aligned(size, alignment, name);
46  }
47 
48  void deallocate(void *ptr)
49  {
50  MEM_freeN(ptr);
51  }
52 };
53 
59 class RawAllocator {
60  private:
61  struct MemHead {
62  int offset;
63  };
64 
65  public:
66  void *allocate(size_t size, size_t alignment, const char *UNUSED(name))
67  {
68  BLI_assert(is_power_of_2_i(static_cast<int>(alignment)));
69  void *ptr = malloc(size + alignment + sizeof(MemHead));
70  void *used_ptr = reinterpret_cast<void *>(
71  reinterpret_cast<uintptr_t>(POINTER_OFFSET(ptr, alignment + sizeof(MemHead))) &
72  ~(static_cast<uintptr_t>(alignment) - 1));
73  int offset = static_cast<int>((intptr_t)used_ptr - (intptr_t)ptr);
74  BLI_assert(offset >= static_cast<int>(sizeof(MemHead)));
75  (static_cast<MemHead *>(used_ptr) - 1)->offset = offset;
76  return used_ptr;
77  }
78 
79  void deallocate(void *ptr)
80  {
81  MemHead *head = static_cast<MemHead *>(ptr) - 1;
82  int offset = -head->offset;
83  void *actual_pointer = POINTER_OFFSET(ptr, offset);
84  free(actual_pointer);
85  }
86 };
87 
88 } // namespace blender
#define BLI_assert(a)
Definition: BLI_assert.h:46
void BLI_kdtree_nd_() free(KDTree *tree)
Definition: kdtree_impl.h:102
MINLINE int is_power_of_2_i(int n)
#define UNUSED(x)
#define POINTER_OFFSET(v, ofs)
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
void * allocate(size_t size, size_t alignment, const char *name)
void deallocate(void *ptr)
void deallocate(void *ptr)
void * allocate(size_t size, size_t alignment, const char *UNUSED(name))
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_mallocN_aligned)(size_t len, size_t alignment, const char *str)
Definition: mallocn.c:35
struct MemHead MemHead
_W64 unsigned int uintptr_t
Definition: stdint.h:119
_W64 int intptr_t
Definition: stdint.h:118
PointerRNA * ptr
Definition: wm_files.c:3480