32
32
*
33
33
* - If not NDEBUG, runtime assert()s are in use.
34
34
* - If EMMALLOC_MEMVALIDATE is defined, a large amount of extra checks are done.
35
- * - If EMMALLOC_VERBOSE is defined, a lot of operations are logged
36
- * out, in addition to EMMALLOC_MEMVALIDATE.
37
- * - Debugging and logging directly uses console.log via uses EM_ASM, not
35
+ * - If EMMALLOC_VERBOSE is defined, a lot of operations are logged using
36
+ * ` out` , in addition to EMMALLOC_MEMVALIDATE.
37
+ * - Debugging and logging directly uses `out` and `err` via EM_ASM, not
38
38
* printf etc., to minimize any risk of debugging or logging depending on
39
39
* malloc.
40
40
*
@@ -368,38 +368,38 @@ static void dump_memory_regions()
368
368
{
369
369
ASSERT_MALLOC_IS_ACQUIRED ();
370
370
RootRegion * root = listOfAllRegions ;
371
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('All memory regions:' ));
371
+ MAIN_THREAD_ASYNC_EM_ASM (out ('All memory regions:' ));
372
372
while (root )
373
373
{
374
374
Region * r = (Region * )root ;
375
375
assert (debug_region_is_consistent (r ));
376
376
uint8_t * lastRegionEnd = root -> endPtr ;
377
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Region block 0x' + ($0 >>> 0 ).toString (16 )+ ' - 0x' + ($1 >>> 0 ).toString (16 )+ ' (' + ($2 >>> 0 )+ ' bytes):' ),
377
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Region block 0x' + ($0 >>> 0 ).toString (16 )+ ' - 0x' + ($1 >>> 0 ).toString (16 )+ ' (' + ($2 >>> 0 )+ ' bytes):' ),
378
378
r , lastRegionEnd , lastRegionEnd - (uint8_t * )r );
379
379
while ((uint8_t * )r < lastRegionEnd )
380
380
{
381
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Region 0x' + ($0 >>> 0 ).toString (16 )+ ', size: ' + ($1 >>> 0 )+ ' (' + ($2 ?"used" :"--FREE--" )+ ')' ),
381
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Region 0x' + ($0 >>> 0 ).toString (16 )+ ', size: ' + ($1 >>> 0 )+ ' (' + ($2 ?"used" :"--FREE--" )+ ')' ),
382
382
r , r -> size , region_ceiling_size (r ) == r -> size );
383
383
384
384
assert (debug_region_is_consistent (r ));
385
385
size_t sizeFromCeiling = size_of_region_from_ceiling (r );
386
386
if (sizeFromCeiling != r -> size )
387
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Corrupt region! Size marker at the end of the region does not match: ' + ($0 >>> 0 )), sizeFromCeiling );
387
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Corrupt region! Size marker at the end of the region does not match: ' + ($0 >>> 0 )), sizeFromCeiling );
388
388
if (r -> size == 0 )
389
389
break ;
390
390
r = next_region (r );
391
391
}
392
392
root = root -> next ;
393
- MAIN_THREAD_ASYNC_EM_ASM (console . log ("" ));
393
+ MAIN_THREAD_ASYNC_EM_ASM (out ("" ));
394
394
}
395
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Free regions:' ));
395
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Free regions:' ));
396
396
for (int i = 0 ; i < NUM_FREE_BUCKETS ; ++ i )
397
397
{
398
398
Region * prev = & freeRegionBuckets [i ];
399
399
Region * fr = freeRegionBuckets [i ].next ;
400
400
while (fr != & freeRegionBuckets [i ])
401
401
{
402
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('In bucket ' + $0 + ', free region 0x' + ($1 >>> 0 ).toString (16 )+ ', size: ' + ($2 >>> 0 ) + ' (size at ceiling: ' + ($3 >>> 0 )+ '), prev: 0x' + ($4 >>> 0 ).toString (16 ) + ', next: 0x' + ($5 >>> 0 ).toString (16 )),
402
+ MAIN_THREAD_ASYNC_EM_ASM (out ('In bucket ' + $0 + ', free region 0x' + ($1 >>> 0 ).toString (16 )+ ', size: ' + ($2 >>> 0 ) + ' (size at ceiling: ' + ($3 >>> 0 )+ '), prev: 0x' + ($4 >>> 0 ).toString (16 ) + ', next: 0x' + ($5 >>> 0 ).toString (16 )),
403
403
i , fr , fr -> size , size_of_region_from_ceiling (fr ), fr -> prev , fr -> next );
404
404
assert (debug_region_is_consistent (fr ));
405
405
assert (region_is_free (fr ));
@@ -410,8 +410,8 @@ static void dump_memory_regions()
410
410
fr = fr -> next ;
411
411
}
412
412
}
413
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Free bucket index map: ' + ($0 >>> 0 ).toString (2 ) + ' ' + ($1 >>> 0 ).toString (2 )), (uint32_t )(freeRegionBucketsUsed >> 32 ), (uint32_t )freeRegionBucketsUsed );
414
- MAIN_THREAD_ASYNC_EM_ASM (console . log ("" ));
413
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Free bucket index map: ' + ($0 >>> 0 ).toString (2 ) + ' ' + ($1 >>> 0 ).toString (2 )), (uint32_t )(freeRegionBucketsUsed >> 32 ), (uint32_t )freeRegionBucketsUsed );
414
+ MAIN_THREAD_ASYNC_EM_ASM (out ("" ));
415
415
}
416
416
417
417
void emmalloc_dump_memory_regions ()
@@ -430,7 +430,7 @@ static int validate_memory_regions()
430
430
Region * r = (Region * )root ;
431
431
if (!debug_region_is_consistent (r ))
432
432
{
433
- MAIN_THREAD_ASYNC_EM_ASM (console . error ('Used region 0x' + ($0 >>> 0 ).toString (16 )+ ', size: ' + ($1 >>> 0 )+ ' (' + ($2 ?"used" :"--FREE--" )+ ') is corrupt (size markers in the beginning and at the end of the region do not match!)' ),
433
+ MAIN_THREAD_ASYNC_EM_ASM (err ('Used region 0x' + ($0 >>> 0 ).toString (16 )+ ', size: ' + ($1 >>> 0 )+ ' (' + ($2 ?"used" :"--FREE--" )+ ') is corrupt (size markers in the beginning and at the end of the region do not match!)' ),
434
434
r , r -> size , region_ceiling_size (r ) == r -> size );
435
435
return 1 ;
436
436
}
@@ -439,7 +439,7 @@ static int validate_memory_regions()
439
439
{
440
440
if (!debug_region_is_consistent (r ))
441
441
{
442
- MAIN_THREAD_ASYNC_EM_ASM (console . error ('Used region 0x' + ($0 >>> 0 ).toString (16 )+ ', size: ' + ($1 >>> 0 )+ ' (' + ($2 ?"used" :"--FREE--" )+ ') is corrupt (size markers in the beginning and at the end of the region do not match!)' ),
442
+ MAIN_THREAD_ASYNC_EM_ASM (err ('Used region 0x' + ($0 >>> 0 ).toString (16 )+ ', size: ' + ($1 >>> 0 )+ ' (' + ($2 ?"used" :"--FREE--" )+ ') is corrupt (size markers in the beginning and at the end of the region do not match!)' ),
443
443
r , r -> size , region_ceiling_size (r ) == r -> size );
444
444
return 1 ;
445
445
}
@@ -457,7 +457,7 @@ static int validate_memory_regions()
457
457
{
458
458
if (!debug_region_is_consistent (fr ) || !region_is_free (fr ) || fr -> prev != prev || fr -> next == fr || fr -> prev == fr )
459
459
{
460
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('In bucket ' + $0 + ', free region 0x' + ($1 >>> 0 ).toString (16 )+ ', size: ' + ($2 >>> 0 ) + ' (size at ceiling: ' + ($3 >>> 0 )+ '), prev: 0x' + ($4 >>> 0 ).toString (16 ) + ', next: 0x' + ($5 >>> 0 ).toString (16 ) + ' is corrupt!' ),
460
+ MAIN_THREAD_ASYNC_EM_ASM (out ('In bucket ' + $0 + ', free region 0x' + ($1 >>> 0 ).toString (16 )+ ', size: ' + ($2 >>> 0 ) + ' (size at ceiling: ' + ($3 >>> 0 )+ '), prev: 0x' + ($4 >>> 0 ).toString (16 ) + ', next: 0x' + ($5 >>> 0 ).toString (16 ) + ' is corrupt!' ),
461
461
i , fr , fr -> size , size_of_region_from_ceiling (fr ), fr -> prev , fr -> next );
462
462
return 1 ;
463
463
}
@@ -479,7 +479,7 @@ int emmalloc_validate_memory_regions()
479
479
static bool claim_more_memory (size_t numBytes )
480
480
{
481
481
#ifdef EMMALLOC_VERBOSE
482
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('claim_more_memory(numBytes=' + ($0 >>> 0 )+ ')' ), numBytes );
482
+ MAIN_THREAD_ASYNC_EM_ASM (out ('claim_more_memory(numBytes=' + ($0 >>> 0 )+ ')' ), numBytes );
483
483
#endif
484
484
485
485
#ifdef EMMALLOC_MEMVALIDATE
@@ -491,12 +491,12 @@ static bool claim_more_memory(size_t numBytes)
491
491
if ((intptr_t )startPtr == -1 )
492
492
{
493
493
#ifdef EMMALLOC_VERBOSE
494
- MAIN_THREAD_ASYNC_EM_ASM (console . error ('claim_more_memory: sbrk failed!' ));
494
+ MAIN_THREAD_ASYNC_EM_ASM (err ('claim_more_memory: sbrk failed!' ));
495
495
#endif
496
496
return false;
497
497
}
498
498
#ifdef EMMALLOC_VERBOSE
499
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('claim_more_memory: claimed ' + ptrToString ($0 ) + ' - ' + ptrToString ($1 ) + ' (' + ($2 >>> 0 ) + ' bytes) via sbrk()' ), startPtr , startPtr + numBytes , numBytes );
499
+ MAIN_THREAD_ASYNC_EM_ASM (out ('claim_more_memory: claimed ' + ptrToString ($0 ) + ' - ' + ptrToString ($1 ) + ' (' + ($2 >>> 0 ) + ' bytes) via sbrk()' ), startPtr , startPtr + numBytes , numBytes );
500
500
#endif
501
501
assert (HAS_ALIGNMENT (startPtr , alignof(size_t )));
502
502
uint8_t * endPtr = startPtr + numBytes ;
@@ -564,7 +564,7 @@ static void initialize_emmalloc_heap()
564
564
freeRegionBuckets [i ].prev = freeRegionBuckets [i ].next = & freeRegionBuckets [i ];
565
565
566
566
#ifdef EMMALLOC_VERBOSE
567
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('initialize_emmalloc_heap()' ));
567
+ MAIN_THREAD_ASYNC_EM_ASM (out ('initialize_emmalloc_heap()' ));
568
568
#endif
569
569
570
570
// Start with a tiny dynamic region.
@@ -646,7 +646,7 @@ static void *attempt_allocate(Region *freeRegion, size_t alignment, size_t size)
646
646
#endif
647
647
648
648
#ifdef EMMALLOC_VERBOSE
649
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('attempt_allocate - succeeded allocating memory, region ptr=' + ptrToString ($0 ) + ', align=' + $1 + ', payload size=' + ($2 >>> 0 ) + ' bytes)' ), freeRegion , alignment , size );
649
+ MAIN_THREAD_ASYNC_EM_ASM (out ('attempt_allocate - succeeded allocating memory, region ptr=' + ptrToString ($0 ) + ', align=' + $1 + ', payload size=' + ($2 >>> 0 ) + ' bytes)' ), freeRegion , alignment , size );
650
650
#endif
651
651
652
652
return (uint8_t * )freeRegion + sizeof (size_t );
@@ -682,7 +682,7 @@ static void *allocate_memory(size_t alignment, size_t size)
682
682
ASSERT_MALLOC_IS_ACQUIRED ();
683
683
684
684
#ifdef EMMALLOC_VERBOSE
685
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('allocate_memory(align=' + $0 + ', size=' + ($1 >>> 0 ) + ' bytes)' ), alignment , size );
685
+ MAIN_THREAD_ASYNC_EM_ASM (out ('allocate_memory(align=' + $0 + ', size=' + ($1 >>> 0 ) + ' bytes)' ), alignment , size );
686
686
#endif
687
687
688
688
#ifdef EMMALLOC_MEMVALIDATE
@@ -692,15 +692,15 @@ static void *allocate_memory(size_t alignment, size_t size)
692
692
if (!IS_POWER_OF_2 (alignment ))
693
693
{
694
694
#ifdef EMMALLOC_VERBOSE
695
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Allocation failed: alignment not power of 2!' ));
695
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Allocation failed: alignment not power of 2!' ));
696
696
#endif
697
697
return 0 ;
698
698
}
699
699
700
700
if (size > MAX_ALLOC_SIZE )
701
701
{
702
702
#ifdef EMMALLOC_VERBOSE
703
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0 ) + 'bytes! (negative integer wraparound?)' ), size );
703
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0 ) + 'bytes! (negative integer wraparound?)' ), size );
704
704
#endif
705
705
return 0 ;
706
706
}
@@ -811,7 +811,7 @@ static void *allocate_memory(size_t alignment, size_t size)
811
811
}
812
812
813
813
#ifdef EMMALLOC_VERBOSE
814
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Could not find a free memory block!' ));
814
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Could not find a free memory block!' ));
815
815
#endif
816
816
817
817
return 0 ;
@@ -875,7 +875,7 @@ void emmalloc_free(void *ptr)
875
875
return ;
876
876
877
877
#ifdef EMMALLOC_VERBOSE
878
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('free(ptr=0x' + ($0 >>> 0 ).toString (16 )+ ')' ), ptr );
878
+ MAIN_THREAD_ASYNC_EM_ASM (out ('free(ptr=0x' + ($0 >>> 0 ).toString (16 )+ ')' ), ptr );
879
879
#endif
880
880
881
881
uint8_t * regionStartPtr = (uint8_t * )ptr - sizeof (size_t );
@@ -891,9 +891,9 @@ void emmalloc_free(void *ptr)
891
891
if (debug_region_is_consistent (region ))
892
892
// LLVM wasm backend bug: cannot use MAIN_THREAD_ASYNC_EM_ASM() here, that generates internal compiler error
893
893
// Reproducible by running e.g. other.test_alloc_3GB
894
- EM_ASM (console . error ('Double free at region ptr 0x' + ($0 >>> 0 ).toString (16 ) + ', region->size: 0x' + ($1 >>> 0 ).toString (16 ) + ', region->sizeAtCeiling: 0x' + ($2 >>> 0 ).toString (16 ) + ')' ), region , size , region_ceiling_size (region ));
894
+ EM_ASM (err ('Double free at region ptr 0x' + ($0 >>> 0 ).toString (16 ) + ', region->size: 0x' + ($1 >>> 0 ).toString (16 ) + ', region->sizeAtCeiling: 0x' + ($2 >>> 0 ).toString (16 ) + ')' ), region , size , region_ceiling_size (region ));
895
895
else
896
- MAIN_THREAD_ASYNC_EM_ASM (console . error ('Corrupt region at region ptr 0x' + ($0 >>> 0 ).toString (16 ) + ' region->size: 0x' + ($1 >>> 0 ).toString (16 ) + ', region->sizeAtCeiling: 0x' + ($2 >>> 0 ).toString (16 ) + ')' ), region , size , region_ceiling_size (region ));
896
+ MAIN_THREAD_ASYNC_EM_ASM (err ('Corrupt region at region ptr 0x' + ($0 >>> 0 ).toString (16 ) + ' region->size: 0x' + ($1 >>> 0 ).toString (16 ) + ', region->sizeAtCeiling: 0x' + ($2 >>> 0 ).toString (16 ) + ')' ), region , size , region_ceiling_size (region ));
897
897
}
898
898
#endif
899
899
assert (size >= sizeof (Region ));
@@ -947,7 +947,7 @@ static int attempt_region_resize(Region *region, size_t size)
947
947
assert (HAS_ALIGNMENT (size , sizeof (size_t )));
948
948
949
949
#ifdef EMMALLOC_VERBOSE
950
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('attempt_region_resize(region=0x' + ($0 >>> 0 ).toString (16 ) + ', size=' + ($1 >>> 0 ) + ' bytes)' ), region , size );
950
+ MAIN_THREAD_ASYNC_EM_ASM (out ('attempt_region_resize(region=0x' + ($0 >>> 0 ).toString (16 ) + ', size=' + ($1 >>> 0 ) + ' bytes)' ), region , size );
951
951
#endif
952
952
953
953
// First attempt to resize this region, if the next region that follows this one
@@ -999,7 +999,7 @@ static int attempt_region_resize(Region *region, size_t size)
999
999
}
1000
1000
}
1001
1001
#ifdef EMMALLOC_VERBOSE
1002
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('attempt_region_resize failed.' ));
1002
+ MAIN_THREAD_ASYNC_EM_ASM (out ('attempt_region_resize failed.' ));
1003
1003
#endif
1004
1004
return 0 ;
1005
1005
}
@@ -1015,7 +1015,7 @@ static int acquire_and_attempt_region_resize(Region *region, size_t size)
1015
1015
void * emmalloc_aligned_realloc (void * ptr , size_t alignment , size_t size )
1016
1016
{
1017
1017
#ifdef EMMALLOC_VERBOSE
1018
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('aligned_realloc(ptr=0x' + ($0 >>> 0 ).toString (16 ) + ', alignment=' + $1 + ', size=' + ($2 >>> 0 )), ptr , alignment , size );
1018
+ MAIN_THREAD_ASYNC_EM_ASM (out ('aligned_realloc(ptr=0x' + ($0 >>> 0 ).toString (16 ) + ', alignment=' + $1 + ', size=' + ($2 >>> 0 )), ptr , alignment , size );
1019
1019
#endif
1020
1020
1021
1021
if (!ptr )
@@ -1030,7 +1030,7 @@ void *emmalloc_aligned_realloc(void *ptr, size_t alignment, size_t size)
1030
1030
if (size > MAX_ALLOC_SIZE )
1031
1031
{
1032
1032
#ifdef EMMALLOC_VERBOSE
1033
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0 ) + 'bytes! (negative integer wraparound?)' ), size );
1033
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0 ) + 'bytes! (negative integer wraparound?)' ), size );
1034
1034
#endif
1035
1035
return 0 ;
1036
1036
}
@@ -1084,7 +1084,7 @@ void *emmalloc_realloc_try(void *ptr, size_t size)
1084
1084
if (size > MAX_ALLOC_SIZE )
1085
1085
{
1086
1086
#ifdef EMMALLOC_VERBOSE
1087
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0 ) + 'bytes! (negative integer wraparound?)' ), size );
1087
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0 ) + 'bytes! (negative integer wraparound?)' ), size );
1088
1088
#endif
1089
1089
return 0 ;
1090
1090
}
@@ -1119,7 +1119,7 @@ void *emmalloc_aligned_realloc_uninitialized(void *ptr, size_t alignment, size_t
1119
1119
if (size > MAX_ALLOC_SIZE )
1120
1120
{
1121
1121
#ifdef EMMALLOC_VERBOSE
1122
- MAIN_THREAD_ASYNC_EM_ASM (console . log ('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0 ) + 'bytes! (negative integer wraparound?)' ), size );
1122
+ MAIN_THREAD_ASYNC_EM_ASM (out ('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0 ) + 'bytes! (negative integer wraparound?)' ), size );
1123
1123
#endif
1124
1124
return 0 ;
1125
1125
}
0 commit comments