| 1364 | } |
| 1365 | |
| 1366 | size_t emmalloc_free_dynamic_memory() { |
| 1367 | size_t freeDynamicMemory = 0; |
| 1368 | |
| 1369 | int bucketIndex = 0; |
| 1370 | |
| 1371 | MALLOC_ACQUIRE(); |
| 1372 | BUCKET_BITMASK_T bucketMask = freeRegionBucketsUsed; |
| 1373 | |
| 1374 | // Loop through each bucket that has free regions in it, based on bits set in freeRegionBucketsUsed bitmap. |
| 1375 | while (bucketMask) { |
| 1376 | BUCKET_BITMASK_T indexAdd = __builtin_ctzll(bucketMask); |
| 1377 | bucketIndex += indexAdd; |
| 1378 | bucketMask >>= indexAdd; |
| 1379 | for (Region *freeRegion = freeRegionBuckets[bucketIndex].next; |
| 1380 | freeRegion != &freeRegionBuckets[bucketIndex]; |
| 1381 | freeRegion = freeRegion->next) { |
| 1382 | freeDynamicMemory += freeRegion->size - REGION_HEADER_SIZE; |
| 1383 | } |
| 1384 | ++bucketIndex; |
| 1385 | bucketMask >>= 1; |
| 1386 | } |
| 1387 | MALLOC_RELEASE(); |
| 1388 | return freeDynamicMemory; |
| 1389 | } |
| 1390 | |
| 1391 | size_t emmalloc_compute_free_dynamic_memory_fragmentation_map(size_t freeMemorySizeMap[32]) { |
| 1392 | memset((void*)freeMemorySizeMap, 0, sizeof(freeMemorySizeMap[0])*32); |