@@ -62,28 +62,83 @@ void af_debug(const char *fmt, ...) {
62
62
#define mp_picovector_get_point_type mp_obj_get_float
63
63
#define mp_picovector_set_point_type mp_obj_new_float
64
64
65
+ uint32_t _af_malloc_count = 0 ;
66
+ uint32_t _af_malloc_bytes = 0 ;
67
+ uint32_t _af_realloc_count = 0 ;
68
+
69
+ uint32_t _af_tracked_malloc_count = 0 ;
70
+ uint32_t _af_tracked_malloc_bytes = 0 ;
71
+ uint32_t _af_tracked_realloc_count = 0 ;
72
+
65
73
66
74
void *af_malloc (size_t size) {
67
- // mp_printf(&mp_plat_print, "af_malloc %lu\n", size);
68
- // __printf_debug_flush();
69
- // void *addr = m_tracked_calloc(sizeof(uint8_t), size);
75
+ _af_malloc_count++;
76
+ _af_malloc_bytes += size;
70
77
void *addr = m_malloc (size);
71
- // mp_printf(&mp_plat_print, "addr %lu\n", addr);
72
- // __printf_debug_flush();
73
78
return addr;
74
79
}
75
80
81
+
76
82
void *af_realloc (void *p, size_t size) {
77
- return m_realloc (p, size);
83
+ _af_realloc_count++;
84
+ void *addr = m_realloc (p, size);
85
+ return addr;
78
86
}
79
87
80
88
void af_free (void *p) {
81
- // mp_printf(&mp_plat_print, "af_free\n");
82
- // __printf_debug_flush();
83
- // m_tracked_free(p);
84
89
m_free (p);
85
90
}
86
91
92
+ void *af_tracked_malloc (size_t size) {
93
+ _af_tracked_malloc_count++;
94
+ _af_tracked_malloc_bytes += size;
95
+
96
+ // Allocate an extra sizeof(size_t) bytes
97
+ size_t *addr = (size_t *)m_tracked_calloc (sizeof (uint8_t ), size + sizeof (size_t ));
98
+ // Tag our memory with its allocated size
99
+ *addr = size;
100
+ // Skip past the size_t size
101
+ addr++;
102
+
103
+ #if DEBUG
104
+ mp_printf (&mp_plat_print, " af_tracked_malloc %lu %p : %p\n " , size, addr, (uint8_t *)addr + size);
105
+ __printf_debug_flush ();
106
+ #endif
107
+
108
+ return (void *)addr;
109
+ }
110
+
111
+ void *af_tracked_realloc (void *p, size_t size) {
112
+ _af_tracked_realloc_count++;
113
+
114
+ void *addr = af_tracked_malloc (size);
115
+ size_t old_size = *((size_t *)p - 1 );
116
+ memcpy (addr, p, std::min (old_size, size));
117
+
118
+ #if DEBUG
119
+ mp_printf (&mp_plat_print, " af_tracked_realloc %lu -> %lu, %p -> %p : %p\n " , old_size, size, p, addr, (uint8_t *)addr + size);
120
+ __printf_debug_flush ();
121
+ #endif
122
+
123
+ af_tracked_free (p);
124
+
125
+ return addr;
126
+ }
127
+
128
+ void af_tracked_free (void *p) {
129
+ size_t *pp = (size_t *)p; // Convert our void pointer to size_t* so we can read the size marker
130
+ pp--; // Skip back to get our real start
131
+
132
+ #if DEBUG
133
+ size_t size = *pp; // First "size_t" should be the allocated size
134
+ mp_printf (&mp_plat_print, " af_tracked_free %p (size %d)\n " , p, size);
135
+ __printf_debug_flush ();
136
+ #endif
137
+
138
+ m_tracked_free ((void *)pp);
139
+ // m_free(p);
140
+ }
141
+
87
142
void * fileio_open (const char *filename) {
88
143
mp_obj_t fn = mp_obj_new_str (filename, (mp_uint_t )strlen (filename));
89
144
@@ -857,4 +912,27 @@ mp_obj_t VECTOR_draw(mp_obj_t self_in, mp_obj_t poly_in) {
857
912
return mp_const_none;
858
913
}
859
914
915
+ mp_obj_t MALLOC_get_stats (mp_obj_t self_in) {
916
+ (void )self_in;
917
+
918
+ mp_obj_t tuple[6 ];
919
+ tuple[0 ] = mp_obj_new_int (_af_malloc_count);
920
+ tuple[1 ] = mp_obj_new_int (_af_realloc_count);
921
+ tuple[2 ] = mp_obj_new_int (_af_malloc_bytes);
922
+
923
+ tuple[3 ] = mp_obj_new_int (_af_tracked_malloc_count);
924
+ tuple[4 ] = mp_obj_new_int (_af_tracked_realloc_count);
925
+ tuple[5 ] = mp_obj_new_int (_af_tracked_malloc_bytes);
926
+
927
+ _af_malloc_count = 0 ;
928
+ _af_realloc_count = 0 ;
929
+ _af_malloc_bytes = 0 ;
930
+
931
+ _af_tracked_malloc_count = 0 ;
932
+ _af_tracked_realloc_count = 0 ;
933
+ _af_tracked_malloc_bytes = 0 ;
934
+
935
+ return mp_obj_new_tuple (6 , tuple);
936
+ }
937
+
860
938
}
0 commit comments