1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2024-06-30 00:44:52 +02:00
qmckl/src/qmckl_memory.org
2021-03-05 03:45:30 +01:00

3.2 KiB

Memory management

We override the allocation functions to enable the possibility of optimized libraries to fine-tune the memory allocation.

2 files are produced:

  • a source file : qmckl_memory.c
  • a test file : test_qmckl_memory.c

qmckl_malloc

Memory allocation function, letting the library choose how the memory will be allocated, and a pointer is returned to the user. The context is passed to let the library store data related to the allocation inside the context.

void* qmckl_malloc(const qmckl_context ctx, const size_t size);
interface
 type (c_ptr) function qmckl_malloc (context, size) bind(C)
   use, intrinsic :: iso_c_binding
   integer (c_int64_t), intent(in), value :: context
   integer (c_int64_t), intent(in), value :: size
 end function qmckl_malloc
end interface
Source
void* qmckl_malloc(const qmckl_context ctx, const size_t size) {
if (ctx == (qmckl_context) 0) {}; /* Avoid unused argument warning */
void * result = malloc( (size_t) size );
assert (result != NULL) ;
return result;
}

qmckl_free

The context is passed, in case some important information has been stored related to memory allocation and needs to be updated.

qmckl_exit_code qmckl_free(qmckl_context context, void *ptr);
interface
 integer (c_int32_t) function qmckl_free (context, ptr) bind(C)
   use, intrinsic :: iso_c_binding
   integer (c_int64_t), intent(in), value :: context
   type (c_ptr), intent(in), value :: ptr
 end function qmckl_free
end interface
Source
qmckl_exit_code qmckl_free(qmckl_context context, void *ptr) {
if (context == 0) return QMCKL_INVALID_ARG_1;
if (ptr == NULL)  return QMCKL_INVALID_ARG_2;
free(ptr);
return QMCKL_SUCCESS;
}