1 #ifndef _melder_alloc_h_
2 #define _melder_alloc_h_
3 /* melder_alloc.h
4  *
5  * Copyright (C) 1992-2020 Paul Boersma
6  *
7  * This code is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or (at
10  * your option) any later version.
11  *
12  * This code is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  * See the GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this work. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 /* These functions call malloc, free, realloc, and calloc. */
22 /* If out of memory, the non-f versions throw an error message (like "Out of memory"); */
23 /* the f versions open up a rainy day fund or crash Praat. */
24 /* These functions also maintain a count of the total number of blocks allocated. */
25 
26 void Melder_alloc_init ();   // to be called around program start-up
27 void * _Melder_malloc (int64 size);
28 #define Melder_malloc(type,numberOfElements)  (type *) _Melder_malloc ((numberOfElements) * (int64) sizeof (type))
29 void * _Melder_malloc_f (int64 size);
30 #define Melder_malloc_f(type,numberOfElements)  (type *) _Melder_malloc_f ((numberOfElements) * (int64) sizeof (type))
31 void * Melder_realloc (void *pointer, int64 size);
32 void * Melder_realloc_f (void *pointer, int64 size);
33 void * _Melder_calloc (int64 numberOfElements, int64 elementSize);
34 #define Melder_calloc(type,numberOfElements)  (type *) _Melder_calloc (numberOfElements, sizeof (type))
35 void * _Melder_calloc_f (int64 numberOfElements, int64 elementSize);
36 #define Melder_calloc_f(type,numberOfElements)  (type *) _Melder_calloc_f (numberOfElements, sizeof (type))
37 
38 #define Melder_free(pointer)  _Melder_free ((void **) & (pointer))
39 void _Melder_free (void **pointer) noexcept;
40 /*
41 	Preconditions:
42 		none (*pointer may be null).
43 	Postconditions:
44 		*pointer == nullptr;
45 */
46 
47 int64 Melder_allocationCount ();
48 /*
49 	Returns the total number of successful calls to
50 	Melder_malloc, Melder_realloc (if 'ptr' is null), and Melder_calloc,
51 	since the start of the process. Mainly for debugging purposes.
52 */
53 
54 int64 Melder_deallocationCount ();
55 /*
56 	Returns the total number of successful calls to Melder_free,
57 	since the start of the process. Mainly for debugging purposes.
58 */
59 
60 int64 Melder_allocationSize ();
61 /*
62 	Returns the total number of bytes allocated in calls to
63 	Melder_malloc, Melder_realloc (if moved), and Melder_calloc,
64 	since the start of the process. Mainly for debugging purposes.
65 */
66 
67 int64 Melder_reallocationsInSituCount ();
68 int64 Melder_movingReallocationsCount ();
69 
70 /********** Arrays. **********/
71 
72 namespace MelderArray {
73 
74 	enum class kInitializationType { RAW = 0, ZERO = 1 };
75 
76 	byte * _alloc_generic (integer cellSize, integer numberOfCells, kInitializationType initializationType);
77 	void _free_generic (byte *cells, integer numberOfCells) noexcept;
78 
79 	template <class T>
_alloc(integer numberOfCells,kInitializationType initializationType)80 	T* _alloc (integer numberOfCells, kInitializationType initializationType) {
81 		T* result = reinterpret_cast <T*> (MelderArray:: _alloc_generic (sizeof (T), numberOfCells, initializationType));
82 		return result;
83 	}
84 
85 	template <class T>
_free(T * cells,integer numberOfCells)86 	void _free (T* cells, integer numberOfCells) noexcept {
87 		_free_generic (reinterpret_cast <byte *> (cells), numberOfCells);
88 	}
89 
90 }
91 
92 int64 MelderArray_allocationCount ();
93 int64 MelderArray_deallocationCount ();
94 int64 MelderArray_cellAllocationCount ();
95 int64 MelderArray_cellDeallocationCount ();
96 
97 /* End of file melder_alloc.h */
98 #endif
99