@@ -495,69 +495,45 @@ mod platform {
495
495
mod platform {
496
496
extern crate dlmalloc;
497
497
498
- use core:: alloc:: { Alloc , AllocErr , Layout , Excess , CannotReallocInPlace } ;
498
+ use core:: alloc:: { Alloc , AllocErr , Layout } ;
499
499
use System ;
500
- use self :: dlmalloc:: GlobalDlmalloc ;
500
+
501
+ // No need for synchronization here as wasm is currently single-threaded
502
+ static mut DLMALLOC : dlmalloc:: Dlmalloc = dlmalloc:: DLMALLOC_INIT ;
503
+
504
+ fn to_result ( ptr : * mut u8 ) -> Result < * mut u8 , AllocErr > {
505
+ if !ptr. is_null ( ) {
506
+ Ok ( ptr)
507
+ } else {
508
+ Err ( AllocErr :: Unsupported { details : "" } )
509
+ }
510
+ }
501
511
502
512
#[ unstable( feature = "allocator_api" , issue = "32838" ) ]
503
513
unsafe impl < ' a > Alloc for & ' a System {
504
514
#[ inline]
505
515
unsafe fn alloc ( & mut self , layout : Layout ) -> Result < * mut u8 , AllocErr > {
506
- GlobalDlmalloc . alloc ( layout)
516
+ to_result ( DLMALLOC . malloc ( layout. size ( ) , layout . align ( ) ) )
507
517
}
508
518
509
519
#[ inline]
510
- unsafe fn alloc_zeroed ( & mut self , layout : Layout )
511
- -> Result < * mut u8 , AllocErr >
512
- {
513
- GlobalDlmalloc . alloc_zeroed ( layout)
520
+ unsafe fn alloc_zeroed ( & mut self , layout : Layout ) -> Result < * mut u8 , AllocErr > {
521
+ to_result ( DLMALLOC . calloc ( layout. size ( ) , layout. align ( ) ) )
514
522
}
515
523
516
524
#[ inline]
517
525
unsafe fn dealloc ( & mut self , ptr : * mut u8 , layout : Layout ) {
518
- GlobalDlmalloc . dealloc ( ptr, layout)
526
+ DLMALLOC . free ( ptr, layout. size ( ) , layout . align ( ) )
519
527
}
520
528
521
529
#[ inline]
522
530
unsafe fn realloc ( & mut self ,
523
531
ptr : * mut u8 ,
524
532
old_layout : Layout ,
525
533
new_layout : Layout ) -> Result < * mut u8 , AllocErr > {
526
- GlobalDlmalloc . realloc ( ptr, old_layout, new_layout)
527
- }
528
-
529
- #[ inline]
530
- fn usable_size ( & self , layout : & Layout ) -> ( usize , usize ) {
531
- GlobalDlmalloc . usable_size ( layout)
532
- }
533
-
534
- #[ inline]
535
- unsafe fn alloc_excess ( & mut self , layout : Layout ) -> Result < Excess , AllocErr > {
536
- GlobalDlmalloc . alloc_excess ( layout)
537
- }
538
-
539
- #[ inline]
540
- unsafe fn realloc_excess ( & mut self ,
541
- ptr : * mut u8 ,
542
- layout : Layout ,
543
- new_layout : Layout ) -> Result < Excess , AllocErr > {
544
- GlobalDlmalloc . realloc_excess ( ptr, layout, new_layout)
545
- }
546
-
547
- #[ inline]
548
- unsafe fn grow_in_place ( & mut self ,
549
- ptr : * mut u8 ,
550
- layout : Layout ,
551
- new_layout : Layout ) -> Result < ( ) , CannotReallocInPlace > {
552
- GlobalDlmalloc . grow_in_place ( ptr, layout, new_layout)
553
- }
554
-
555
- #[ inline]
556
- unsafe fn shrink_in_place ( & mut self ,
557
- ptr : * mut u8 ,
558
- layout : Layout ,
559
- new_layout : Layout ) -> Result < ( ) , CannotReallocInPlace > {
560
- GlobalDlmalloc . shrink_in_place ( ptr, layout, new_layout)
534
+ to_result ( DLMALLOC . realloc (
535
+ ptr, old_layout. size ( ) , old_layout. align ( ) , new_layout. size ( ) ,
536
+ ) )
561
537
}
562
538
}
563
539
}
0 commit comments