mirror of
https://github.com/TREX-CoE/qmckl.git
synced 2024-06-30 00:44:52 +02:00
3.2 KiB
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;
}