1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
|
//------------------------------------------------------------------------------
// GB_memory.h: memory allocation
//------------------------------------------------------------------------------
// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2022, All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//------------------------------------------------------------------------------
#ifndef GB_MEMORY_H
#define GB_MEMORY_H
//------------------------------------------------------------------------------
// memory management
//------------------------------------------------------------------------------
void GB_memoryUsage // count # allocated blocks and their sizes
(
int64_t *nallocs, // # of allocated memory blocks
size_t *mem_deep, // # of bytes in blocks owned by this matrix
size_t *mem_shallow, // # of bytes in blocks owned by another matrix
const GrB_Matrix A // matrix to query
) ;
GB_PUBLIC
void *GB_calloc_memory // pointer to allocated block of memory
(
size_t nitems, // number of items to allocate
size_t size_of_item, // sizeof each item
// output
size_t *size_allocated, // # of bytes actually allocated
GB_Context Context
) ;
GB_PUBLIC
void *GB_malloc_memory // pointer to allocated block of memory
(
size_t nitems, // number of items to allocate
size_t size_of_item, // sizeof each item
// output
size_t *size_allocated // # of bytes actually allocated
) ;
GB_PUBLIC
void *GB_realloc_memory // pointer to reallocated block of memory, or
// to original block if the realloc failed.
(
size_t nitems_new, // new number of items in the object
size_t size_of_item, // sizeof each item
// input/output
void *p, // old object to reallocate
// output
size_t *size_allocated, // # of bytes actually allocated
bool *ok, // true if successful, false otherwise
GB_Context Context
) ;
GB_PUBLIC
void GB_free_memory // free memory, bypassing the free_pool
(
// input/output
void **p, // pointer to allocated block of memory to free
// input
size_t size_allocated // # of bytes actually allocated
) ;
GB_PUBLIC
void GB_dealloc_memory // free memory, return to free_pool or free it
(
// input/output
void **p, // pointer to allocated block of memory to free
// input
size_t size_allocated // # of bytes actually allocated
) ;
GB_PUBLIC
void GB_free_pool_finalize (void) ;
void *GB_xalloc_memory // return the newly-allocated space
(
// input
bool use_calloc, // if true, use calloc
bool iso, // if true, only allocate a single entry
int64_t n, // # of entries to allocate if non iso
size_t type_size, // size of each entry
// output
size_t *size, // resulting size
GB_Context Context
) ;
//------------------------------------------------------------------------------
// parallel memcpy and memset
//------------------------------------------------------------------------------
void GB_memcpy // parallel memcpy
(
void *dest, // destination
const void *src, // source
size_t n, // # of bytes to copy
int nthreads // # of threads to use
) ;
void GB_memset // parallel memset
(
void *dest, // destination
const int c, // value to to set
size_t n, // # of bytes to set
int nthreads // # of threads to use
) ;
//------------------------------------------------------------------------------
// malloc/calloc/realloc/free: for permanent contents of GraphBLAS objects
//------------------------------------------------------------------------------
#ifdef GB_MEMDUMP
#define GB_FREE(p,s) \
{ \
if (p != NULL && (*(p)) != NULL) \
{ \
printf ("dealloc (%s, line %d): %p size %lu\n", \
__FILE__, __LINE__, (*p), s) ; \
} \
GB_dealloc_memory ((void **) p, s) ; \
}
#define GB_CALLOC(n,type,s) \
(type *) GB_calloc_memory (n, sizeof (type), s, Context) ; \
; printf ("calloc (%s, line %d): size %lu\n", \
__FILE__, __LINE__, *(s)) ; \
#define GB_MALLOC(n,type,s) \
(type *) GB_malloc_memory (n, sizeof (type), s) ; \
; printf ("malloc (%s, line %d): size %lu\n", \
__FILE__, __LINE__, *(s)) ; \
#define GB_REALLOC(p,nnew,type,s,ok,Context) \
p = (type *) GB_realloc_memory (nnew, sizeof (type), \
(void *) p, s, ok, Context) ; \
; printf ("realloc (%s, line %d): size %lu\n", \
__FILE__, __LINE__, *(s)) ; \
#define GB_XALLOC(use_calloc,iso,n,type_size,s) \
GB_xalloc_memory (use_calloc, iso, n, type_size, s, Context) ; \
; printf ("xalloc (%s, line %d): size %lu\n", \
__FILE__, __LINE__, *(s)) ; \
#else
#define GB_FREE(p,s) \
GB_dealloc_memory ((void **) p, s)
#define GB_CALLOC(n,type,s) \
(type *) GB_calloc_memory (n, sizeof (type), s, Context)
#define GB_MALLOC(n,type,s) \
(type *) GB_malloc_memory (n, sizeof (type), s)
#define GB_REALLOC(p,nnew,type,s,ok,Context) \
p = (type *) GB_realloc_memory (nnew, sizeof (type), \
(void *) p, s, ok, Context)
#define GB_XALLOC(use_calloc,iso,n,type_size,s) \
GB_xalloc_memory (use_calloc, iso, n, type_size, s, Context)
#endif
//------------------------------------------------------------------------------
// malloc/calloc/realloc/free: for workspace
//------------------------------------------------------------------------------
// These macros currently do the same thing as the 4 macros above, but that may
// change in the future. Even if they always do the same thing, it's useful to
// tag the source code for the allocation of workspace differently from the
// allocation of permament space for a GraphBLAS object, such as a GrB_Matrix.
#define GB_CALLOC_WORK(n,type,s) GB_CALLOC(n,type,s)
#define GB_MALLOC_WORK(n,type,s) GB_MALLOC(n,type,s)
#define GB_REALLOC_WORK(p,nnew,type,s,ok,Context) \
GB_REALLOC(p,nnew,type,s,ok,Context)
#define GB_FREE_WORK(p,s) GB_FREE(p,s)
#endif
|