@@ -38,6 +38,7 @@ struct AllocProfile {
38
38
// == global variables manipulated by callbacks ==
39
39
40
40
AllocProfile g_alloc_profile;
41
+ RawAllocResults *g_alloc_profile_results = nullptr ;
41
42
int g_alloc_profile_enabled = false ;
42
43
43
44
// === stack stuff ===
@@ -63,25 +64,27 @@ JL_DLLEXPORT void jl_start_alloc_profile(int skip_every) {
63
64
64
65
extern " C" { // Needed since the function doesn't take any arguments.
65
66
66
- JL_DLLEXPORT struct RawAllocResults jl_stop_alloc_profile () {
67
+ JL_DLLEXPORT struct RawAllocResults * jl_stop_alloc_profile () {
67
68
g_alloc_profile_enabled = false ;
68
69
69
- auto results = RawAllocResults{
70
+ auto results = new RawAllocResults{
70
71
g_alloc_profile.allocs .data (),
71
72
g_alloc_profile.allocs .size ()
72
73
};
73
74
74
75
// package up frees
75
- results. num_frees = g_alloc_profile.frees_by_type_address .size ();
76
- results. frees = (FreeInfo*) malloc (sizeof (FreeInfo) * results. num_frees );
76
+ results-> num_frees = g_alloc_profile.frees_by_type_address .size ();
77
+ results-> frees = (FreeInfo*) malloc (sizeof (FreeInfo) * results-> num_frees );
77
78
int j = 0 ;
78
79
for (auto type_addr_free_count : g_alloc_profile.frees_by_type_address ) {
79
- results. frees [j++] = FreeInfo{
80
+ results-> frees [j++] = FreeInfo{
80
81
type_addr_free_count.first ,
81
82
type_addr_free_count.second
82
83
};
83
84
}
84
85
86
+ g_alloc_profile_results = results;
87
+
85
88
return results;
86
89
}
87
90
@@ -93,6 +96,12 @@ JL_DLLEXPORT void jl_free_alloc_profile() {
93
96
free (alloc.backtrace .data );
94
97
}
95
98
g_alloc_profile.allocs .clear ();
99
+
100
+ if (g_alloc_profile_results != nullptr ) {
101
+ free (g_alloc_profile_results->frees );
102
+ // free the results?
103
+ g_alloc_profile_results = nullptr ;
104
+ }
96
105
}
97
106
98
107
}
0 commit comments