@@ -62,28 +62,83 @@ void af_debug(const char *fmt, ...) {
6262#define mp_picovector_get_point_type mp_obj_get_float
6363#define mp_picovector_set_point_type mp_obj_new_float
6464
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+
6573
6674void *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;
7077 void *addr = m_malloc (size);
71- // mp_printf(&mp_plat_print, "addr %lu\n", addr);
72- // __printf_debug_flush();
7378 return addr;
7479}
7580
81+
7682void *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;
7886}
7987
8088void af_free (void *p) {
81- // mp_printf(&mp_plat_print, "af_free\n");
82- // __printf_debug_flush();
83- // m_tracked_free(p);
8489 m_free (p);
8590}
8691
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+
87142void * fileio_open (const char *filename) {
88143 mp_obj_t fn = mp_obj_new_str (filename, (mp_uint_t )strlen (filename));
89144
@@ -857,4 +912,27 @@ mp_obj_t VECTOR_draw(mp_obj_t self_in, mp_obj_t poly_in) {
857912 return mp_const_none;
858913}
859914
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+
860938}
0 commit comments