@@ -469,25 +469,27 @@ pub type mi_option_t = c_int;
469
469
// show_errors reversed as of 1.6.3, however what I have here is correct:
470
470
// https://github.com/microsoft/mimalloc/issues/266#issuecomment-653822341
471
471
472
- /// Option allowing printing error messages to stderr.
472
+ /// Print error messages to ` stderr` .
473
473
pub const mi_option_show_errors: mi_option_t = 0 ;
474
474
475
- /// Option allowing printing statistics to stderr when the program is done.
475
+ /// Print statistics to ` stderr` when the program is done.
476
476
pub const mi_option_show_stats: mi_option_t = 1 ;
477
477
478
- /// Option allowing printing verbose messages to stderr.
478
+ /// Print verbose messages to ` stderr` .
479
479
pub const mi_option_verbose: mi_option_t = 2 ;
480
480
481
- /// Option (experimental) specifying eagerly commit segments (4MiB) (enabled by default).
482
- pub const mi_option_eager_commit : mi_option_t = 3 ;
481
+ /// ### The following options are experimental
482
+ /// ### Deprecated options are kept for binary backward compatibility with v1.x versions
483
483
484
- /// Option (experimental) specifying eagerly commit large (256MiB) memory regions (enabled by default, except on Windows ).
485
- pub const mi_option_eager_region_commit : mi_option_t = 4 ;
484
+ /// Option (experimental) Eagerly commit segments (4MiB) (enabled by default).
485
+ pub const mi_option_eager_commit : mi_option_t = 3 ;
486
486
487
- /// Experimental
488
- pub const mi_option_reset_decommits: mi_option_t = 5 ;
487
+ /// Option Deprecated
488
+ pub const mi_option_deprecated_eager_region_commit: mi_option_t = 4 ;
489
+ /// Option Deprecated
490
+ pub const mi_option_deprecated_reset_decommits: mi_option_t = 5 ;
489
491
490
- /// Option (experimental) to use large OS pages (2MiB in size) if possible.
492
+ /// Option (experimental) Use large OS pages (2MiB in size) if possible.
491
493
///
492
494
/// Use large OS pages (2MiB) when available; for some workloads this can
493
495
/// significantly improve performance. Use mi_option_verbose to check if
@@ -499,7 +501,7 @@ pub const mi_option_reset_decommits: mi_option_t = 5;
499
501
/// instead whenever possible).
500
502
pub const mi_option_large_os_pages: mi_option_t = 6 ;
501
503
502
- /// Option (experimental) specifying number of huge OS pages (1GiB in size) to reserve at the start of the program.
504
+ /// Option (experimental) The number of huge OS pages (1GiB in size) to reserve at the start of the program.
503
505
///
504
506
/// This reserves the huge pages at startup and sometimes this can give a large (latency) performance
505
507
/// improvement on big workloads. Usually it is better to not use MIMALLOC_LARGE_OS_PAGES in
@@ -512,13 +514,20 @@ pub const mi_option_large_os_pages: mi_option_t = 6;
512
514
/// allocate just a little to take up space in the huge OS page area (which cannot be reset).
513
515
pub const mi_option_reserve_huge_os_pages: mi_option_t = 7 ;
514
516
515
- /// TODO: update later
516
- pub const mi_option_reserve_os_memory: mi_option_t = 8 ;
517
+ /// Option (experimental) Reserve huge OS pages at node N.
518
+ ///
519
+ /// The huge pages are usually allocated evenly among NUMA nodes.
520
+ /// You can use mi_option_reserve_huge_os_pages_at=N where `N` is the numa node (starting at 0) to allocate all
521
+ /// the huge pages at a specific numa node instead.
522
+ pub const mi_option_reserve_huge_os_pages_at: mi_option_t = 8 ;
517
523
518
- /// Option (experimental) specifying number of segments per thread to keep cached .
519
- pub const mi_option_segment_cache : mi_option_t = 9 ;
524
+ /// Option (experimental) Reserve specified amount of OS memory at startup, e.g. "1g" or "512m" .
525
+ pub const mi_option_reserve_os_memory : mi_option_t = 9 ;
520
526
521
- /// Option (experimental) to reset page memory after mi_option_reset_delay milliseconds when it becomes free.
527
+ /// Option Deprecated
528
+ pub const mi_option_deprecated_segment_cache: mi_option_t = 10 ;
529
+
530
+ /// Option (experimental) Reset page memory after a mi_option_reset_delay milliseconds when it becomes free.
522
531
///
523
532
/// By default, mimalloc will reset (or purge) OS pages that are not in use, to signal to the OS
524
533
/// that the underlying physical memory can be reused. This can reduce memory fragmentation in
@@ -528,40 +537,49 @@ pub const mi_option_segment_cache: mi_option_t = 9;
528
537
/// off completely.
529
538
///
530
539
/// Default: 1 (true)
531
- pub const mi_option_page_reset: mi_option_t = 10 ;
540
+ pub const mi_option_page_reset: mi_option_t = 11 ;
532
541
533
- /// Experimental
534
- pub const mi_option_abandoned_page_reset : mi_option_t = 11 ;
542
+ /// Option (experimental)
543
+ pub const mi_option_abandoned_page_decommit : mi_option_t = 12 ;
535
544
536
- /// Experimental
537
- pub const mi_option_segment_reset : mi_option_t = 12 ;
545
+ // Option (experimental)
546
+ pub const mi_option_deprecated_segment_reset : mi_option_t = 13 ;
538
547
539
- /// Experimental
540
- pub const mi_option_eager_commit_delay: mi_option_t = 13 ;
548
+ /// Option (experimental) the first N segments per thread are not eagerly committed (=1).
549
+ pub const mi_option_eager_commit_delay: mi_option_t = 14 ;
541
550
542
- /// Option (experimental) specifying delay in milli-seconds before resetting a page (100ms by default ).
543
- pub const mi_option_reset_delay : mi_option_t = 14 ;
551
+ /// Option (experimental) Decommit page memory after N milli-seconds delay (25ms ).
552
+ pub const mi_option_decommit_delay : mi_option_t = 15 ;
544
553
545
- /// Option (experimental) to pretend there are at most N NUMA nodes.
546
- ///
547
- /// If not set, the actual NUMA nodes are detected at runtime. Setting N to 1 may avoid
548
- /// problems in some virtual environments. Also, setting it to a lower number than the
549
- /// actual NUMA nodes is fine and will only cause threads to potentially allocate more
550
- /// memory across actual NUMA nodes (but this can happen in any case as NUMA local
551
- /// allocation is always a best effort but not guaranteed).
552
- pub const mi_option_use_numa_nodes: mi_option_t = 15 ;
554
+ /// Option (experimental) Pretend there are at most N NUMA nodes; Use 0 to use the actual detected NUMA nodes at runtime.
555
+ pub const mi_option_use_numa_nodes: mi_option_t = 16 ;
556
+
557
+ /// Option (experimental) If set to 1, do not use OS memory for allocation (but only pre-reserved arenas)
558
+ pub const mi_option_limit_os_alloc: mi_option_t = 17 ;
559
+
560
+ /// Option (experimental) OS tag to assign to mimalloc'd memory
561
+ pub const mi_option_os_tag: mi_option_t = 18 ;
562
+
563
+ /// Option (experimental)
564
+ pub const mi_option_max_errors: mi_option_t = 19 ;
565
+
566
+ /// Option (experimental)
567
+ pub const mi_option_max_warnings: mi_option_t = 20 ;
553
568
554
- /// TODO: update later
555
- pub const mi_option_limit_os_alloc : mi_option_t = 16 ;
569
+ /// Option (experimental)
570
+ pub const mi_option_max_segment_reclaim : mi_option_t = 21 ;
556
571
557
- /// Option (experimental) specifying OS tag to assign to mimalloc'd memory.
558
- pub const mi_option_os_tag : mi_option_t = 17 ;
572
+ /// Option (experimental) Enable decommitting memory (=on)
573
+ pub const mi_option_allow_decommit : mi_option_t = 22 ;
559
574
560
- /// Experimental
561
- pub const mi_option_max_errors : mi_option_t = 18 ;
575
+ /// Option (experimental) Decommit large segment memory after N milli-seconds delay (500ms).
576
+ pub const mi_option_segment_decommit_delay : mi_option_t = 23 ;
562
577
563
- /// Experimental
564
- pub const mi_option_max_warnings: mi_option_t = 19 ;
578
+ /// Option (experimental)
579
+ pub const mi_option_decommit_extend_delay: mi_option_t = 24 ;
580
+
581
+ /// Last option.
582
+ pub const _mi_option_last: mi_option_t = 25 ;
565
583
566
584
extern "C" {
567
585
// Note: mi_option_{enable,disable} aren't exposed because they're redundant
@@ -670,6 +688,8 @@ pub struct mi_heap_area_t {
670
688
pub used : usize ,
671
689
/// Size in bytes of one block.
672
690
pub block_size : usize ,
691
+ /// Size in bytes of a full block including padding and metadata.
692
+ pub full_block_size : usize ,
673
693
}
674
694
675
695
/// Visitor function passed to [`mi_heap_visit_blocks`]
@@ -970,17 +990,34 @@ mod tests {
970
990
use super :: * ;
971
991
972
992
#[ test]
973
- fn runtime_option_page_reset ( ) {
993
+ fn runtime_option_decommit ( ) {
994
+ unsafe {
995
+ // decommit slices when no longer used (after decommit_delay milli-seconds) (default 1)
996
+ assert_eq ! ( mi_option_get( mi_option_allow_decommit) , 1 ) ;
997
+ mi_option_set ( mi_option_allow_decommit, 0 ) ;
998
+ assert_eq ! ( mi_option_get( mi_option_allow_decommit) , 0 ) ;
999
+
1000
+ // page decommit delay in milli-seconds (default 25)
1001
+ assert_eq ! ( mi_option_get( mi_option_decommit_delay) , 25 ) ;
1002
+ mi_option_set ( mi_option_decommit_delay, 100 ) ;
1003
+ assert_eq ! ( mi_option_get( mi_option_decommit_delay) , 100 ) ;
1004
+ }
1005
+ }
1006
+
1007
+ #[ test]
1008
+ fn runtime_stable_option ( ) {
974
1009
unsafe {
975
- // page reset
976
- assert_eq ! ( mi_option_get( mi_option_page_reset) , 1 ) ;
977
- mi_option_set ( mi_option_page_reset, 2 ) ;
978
- assert_eq ! ( mi_option_get( mi_option_page_reset) , 2 ) ;
979
-
980
- // page reset delay
981
- assert_eq ! ( mi_option_get( mi_option_reset_delay) , 100 ) ;
982
- mi_option_set ( mi_option_reset_delay, 10_000 ) ;
983
- assert_eq ! ( mi_option_get( mi_option_reset_delay) , 10_000 ) ;
1010
+ assert_eq ! ( mi_option_get( mi_option_show_errors) , 0 ) ;
1011
+ mi_option_set ( mi_option_show_errors, 1 ) ;
1012
+ assert_eq ! ( mi_option_get( mi_option_show_errors) , 1 ) ;
1013
+
1014
+ assert_eq ! ( mi_option_get( mi_option_show_stats) , 0 ) ;
1015
+ mi_option_set ( mi_option_show_stats, 1 ) ;
1016
+ assert_eq ! ( mi_option_get( mi_option_show_stats) , 1 ) ;
1017
+
1018
+ assert_eq ! ( mi_option_get( mi_option_verbose) , 0 ) ;
1019
+ mi_option_set ( mi_option_verbose, 1 ) ;
1020
+ assert_eq ! ( mi_option_get( mi_option_verbose) , 1 ) ;
984
1021
}
985
1022
}
986
1023
}
0 commit comments