1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
.. _release-notes:

Release notes
=============


.. _release-notes-1.118:

Release 1.118.0
---------------

New features
............

#. New supported platforms:

   * ``lia6gc`` (Linux, ARM64, GCC).
   * ``lia6ll`` (Linux, ARM64, Clang/LLVM).
   * ``xca6ll`` (macOS, ARM64, Clang/LLVM).

   See :ref:`topic-platform-limitations` for limitations in the
   support for Apple Hardened Runtime on ``xca6ll``.

#. Support removed for platform:

   * ``xci3ll`` (macOS, IA-32, Clang/LLVM).

   Support for this platform was removed in macOS 10.15 (Catalina),
   making it inconvenient to develop and test.

#. The arena's :term:`spare commit limit` is now expressed as a
   fraction of the :term:`committed <mapped>` memory (rather than a
   fixed size, as previously). This allows the :term:`spare committed
   memory` to scale with the :term:`working set` size. Set the spare
   commit limit using the keyword argument :c:macro:`MPS_KEY_SPARE` to
   :c:func:`mps_arena_create_k`, or the function
   :c:func:`mps_arena_spare_set`, and query it using the function
   :c:func:`mps_arena_spare`.

#. A new support tool, the **monitor**, implements a graphical user
   interface for analysis of :ref:`topic-telemetry`. This is
   experimental: the implementation is likely to change in future
   versions of the MPS. See :ref:`design-monitor`.

#. The new function :c:func:`mps_pool_walk` visits all areas of
   :term:`formatted objects` in a pool using the
   :ref:`topic-scanning-protocol`. This allows the client program to
   safely update references in the visited objects.


Interface changes
.................

#. The deprecated pool class MV (Manual Variable), and the deprecated
   functions ``mps_mv_free_size`` and ``mps_mv_size`` have been
   removed. Use :ref:`pool-mvff` and the generic functions
   :c:func:`mps_pool_free_size` and :c:func:`mps_pool_total_size`
   instead.

#. The deprecated function :c:func:`mps_tramp` has been removed. The
   MPS has had no need for a trampoline, and client programs have not
   needed to take any special precautions before calling functions in
   the MPS, since version 1.111.

#. The deprecated functions :c:func:`mps_arena_expose`,
   :c:func:`mps_arena_unsafe_expose_remember_protection` and
   :c:func:`mps_arena_unsafe_expose_restore_protection` have been
   removed. If you need access to protected memory for debugging a
   fatal error, use :c:func:`mps_arena_postmortem` instead.

#. The deprecated reservoir functions
   :c:func:`mps_ap_fill_with_reservoir_permit`,
   :c:func:`mps_reservoir_available`, :c:func:`mps_reservoir_limit`,
   :c:func:`mps_reservoir_limit_set` and
   :c:func:`mps_reserve_with_reservoir_permit`, have been removed.

#. The deprecated function :c:func:`mps_fix` has been removed. Use
   the macro :c:func:`MPS_FIX12` instead.

#. The deprecated function :c:func:`mps_telemetry_control` has been
   removed. Use :c:func:`mps_telemetry_get`,
   :c:func:`mps_telemetry_set` and :c:func:`mps_telemetry_reset`
   instead.

#. The keyword argument ``MPS_KEY_SPARE_COMMIT_LIMIT`` to
   :c:func:`mps_arena_create_k`, and the functions
   :c:func:`mps_arena_spare_commit_limit` and
   :c:func:`mps_arena_spare_commit_limit_set` are now deprecated. Use
   :c:macro:`MPS_KEY_SPARE`, :c:func:`mps_arena_spare` and
   :c:func:`mps_arena_spare_set` instead.

#. The format of the :term:`telemetry stream` has changed: Booleans
   are no longer packed into bitfields, but are emitted as unsigned
   bytes. This makes it possible to decode the telemetry stream using
   the Python function |unpack|_.

   .. |unpack| replace:: :py:func:`struct.unpack`
   .. _unpack: https://docs.python.org/3/library/struct.html#struct.unpack

#. The functions :c:func:`mps_formatted_objects_walk` and
   :c:func:`mps_amc_apply` are deprecated in favour of the new
   function :c:func:`mps_pool_walk`.


Other changes
.............

#. On FreeBSD and Linux, if the MPS handles a signal while the client
   program is blocked in a system call, the system call is
   automatically restarted and does not fail with ``EINTR``. See
   :ref:`topic-thread-signal`.

#. On FreeBSD and Linux, the MPS signal handlers no longer modify
   ``errno``. See `GitHub issue #10`_.

   .. _GitHub issue #10: https://github.com/Ravenbrook/mps/issues/10

#. The MPS now builds with Clang 10 and
   ``-Wimplicit-int-float-conversion``. See `GitHub issue #51`_.

   .. _GitHub issue #51: https://github.com/Ravenbrook/mps/issues/51

#. The MPS now builds with ``clang -Wcomma``. See `GitHub issue #47`_.

   .. _GitHub issue #47: https://github.com/Ravenbrook/mps/issues/47


.. _release-notes-1.117:

Release 1.117.0
---------------

New features
............

#. On FreeBSD, Linux and macOS, the MPS is now able to run in the
   child process after ``fork()``. See :ref:`topic-thread-fork`.

#. The MPS now supports Windows Vista or later; it no longer supports
   Windows XP. (Microsoft's own support for Windows XP `expired in
   April 2014`_.) This is so that we can use |InitOnceExecuteOnce|_ to
   ensure thread-safe initialization.

   .. _expired in April 2014: https://www.microsoft.com/en-gb/windowsforbusiness/end-of-xp-support
   .. |InitOnceExecuteOnce| replace:: ``InitOnceExecuteOnce()``
   .. _InitOnceExecuteOnce: https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-initonceexecuteonce


Interface changes
.................

#. The pool class MV (Manual Variable) is now deprecated.


Other changes
.............

#. References from the MPS's own stack frames no longer :term:`pin
   <pinning>` objects allocated by the :term:`client program` in
   moving pools, which prevented them from moving. See job003525_.

   .. _job003525: https://www.ravenbrook.com/project/mps/issue/job003525/

#. Creation of :term:`arenas` is now thread-safe on Windows. See
   job004056_.

   .. _job004056: https://www.ravenbrook.com/project/mps/issue/job004056/

#. :ref:`pool-awl` and :ref:`pool-lo` pools now detect (and assert on)
   invalid :term:`exact references`. See job004070_.

   .. _job004070: https://www.ravenbrook.com/project/mps/issue/job004070/

#. The MPS now compiles without warnings on GCC version 7 with
   ``-Wextra``. See job004076_.

   .. _job004076: https://www.ravenbrook.com/project/mps/issue/job004076/

#. Deprecated function :c:func:`mps_arena_roots_walk` no longer causes
   :c:func:`mps_arena_formatted_objects_walk` to miss some objects. See
   job004090_.

   .. _job004090: https://www.ravenbrook.com/project/mps/issue/job004090/


.. _release-notes-1.116:

Release 1.116.0
---------------

New features
............

#. The MPS now measures the mortality of a :term:`generation` each
   time it is :term:`collected`, and maintains a moving average. This
   means that it is no longer important to provide an accurate
   estimate of the mortality when creating a :term:`generation chain`
   by calling :c:func:`mps_chain_create`.

#. The MPS no longer supports Linux 2.4 and 2.5. (These versions used
   LinuxThreads_ instead of POSIX threads; all major distributions
   have long since ceased to support these versions and so it is no
   longer convenient to test against them.) See
   :ref:`guide-overview-platforms`.

   .. _LinuxThreads: https://en.wikipedia.org/wiki/LinuxThreads

#. New function :c:func:`mps_arena_postmortem` assists with postmortem
   debugging.

#. New function :c:func:`mps_arena_busy` assists debugging of re-entry
   errors in dynamic function table callbacks on Windows on x86-64.


Interface changes
.................

#. The pool class :ref:`pool-snc` is no longer deprecated.

#. Allocation frames are no longer deprecated. See :ref:`topic-frame`.

#. On Linux and FreeBSD, it is now possible to configure the signals
   used to suspend and resume threads. See :ref:`topic-thread-signal`.


Other changes
.............

#. It is now possible to register a :term:`thread` with the MPS
   multiple times on OS X, thus supporting the use case where a
   program that does not use the MPS is calling into MPS-using code
   from multiple threads. (This was already supported on other
   platforms.) See job003559_.

   .. _job003559: https://www.ravenbrook.com/project/mps/issue/job003559/

#. The function :c:func:`mps_arena_formatted_objects_walk` walks the
   :term:`formatted objects` in all :term:`pools`. Previously this was
   not implemented for :ref:`pool-ams` pools. See job003738_.

   .. _job003738: https://www.ravenbrook.com/project/mps/issue/job003738/

#. Objects in :ref:`pool-snc` pools are no longer scanned after their
   :term:`allocation frame` is popped, and so do not keep objects in
   automatically managed pools alive. See job003883_.

   .. _job003883: https://www.ravenbrook.com/project/mps/issue/job003883/

#. When the MPS :term:`collects` a set of :term:`generations`, it
   :term:`condemns <condemned set>` only the :term:`blocks` in those
   generations. Previously, it also condemned blocks that happened to
   share a region of memory with blocks currently or formerly
   allocated in those generations. See job004000_.

   .. _job004000: https://www.ravenbrook.com/project/mps/issue/job004000/

#. Memory in :term:`allocation points` no longer contributes to the
   decision to start a :term:`garbage collection`, avoiding wasted
   work repeatedly collecting generations with very small capacities.
   See job004007_.

   .. _job004007: https://www.ravenbrook.com/project/mps/issue/job004007/

#. The MPS no longer considers :term:`collecting <collect>` the world
   again, without allowing the :term:`client program` to run first.
   See job004011_.

   .. _job004011: https://www.ravenbrook.com/project/mps/issue/job004011/

#. :term:`Roots` created by :c:func:`mps_root_create_thread_scanned`
   no longer cause an assertion failure. See job004036_.

   .. _job004036: https://www.ravenbrook.com/project/mps/issue/job004036/

#. The MPS test suite now compiles and passes with GCC 6.1. See job004037_.

   .. _job004037: https://www.ravenbrook.com/project/mps/issue/job004037/

#. The MPS no longer passes an uninitialized variable to
   :c:func:`thread_swap_exception_ports` on OS X. See job004040_.

   .. _job004040: https://www.ravenbrook.com/project/mps/issue/job004040/


.. _release-notes-1.115:

Release 1.115.0
---------------

New features
............

#. The MPS now provides control over the maximum time that operations
   within an arena may pause the :term:`client program` for. This can
   be specified by the new function :c:func:`mps_arena_pause_time_set`
   or by passing the new keyword argument
   :c:macro:`MPS_KEY_PAUSE_TIME` to :c:func:`mps_arena_create_k`. The
   current value can be retrieved by the new function
   :c:func:`mps_arena_pause_time`.

   The maximum pause time defaults to 0.1 seconds. For the old
   behaviour (whereby the MPS always returned to the :term:`client
   program` as soon as possible), set it to zero.

#. New supported platforms ``fri3ll`` (FreeBSD, IA-32, Clang/LLVM)
   and ``fri6ll`` (FreeBSD, x86-64, Clang/LLVM).

#. When creating an :ref:`pool-amc` pool, :c:func:`mps_pool_create_k`
   accepts the new keyword argument :c:macro:`MPS_KEY_EXTEND_BY`,
   specifying the minimum size of the memory segments that the pool
   requests from the :term:`arena`.

#. The function :c:func:`mps_arena_create_k` accepts two new
   :term:`keyword arguments`. :c:macro:`MPS_KEY_COMMIT_LIMIT`
   sets the :term:`commit limit` for the arena, and
   ``MPS_KEY_SPARE_COMMIT_LIMIT`` sets the :term:`spare
   commit limit` for the arena.

#. New area scanning functions :c:func:`mps_scan_area`,
   :c:func:`mps_scan_area_masked`, :c:func:`mps_scan_area_tagged`,
   :c:func:`mps_scan_area_tagged_or_zero` for use when scanning,
   especially when scanning threads and :term:`tagged references`.

#. New thread root functions :c:func:`mps_root_create_thread`,
   :c:func:`mps_root_create_thread_tagged`, and
   :c:func:`mps_root_create_thread_scanned` allow flexible scanning of
   thread stacks and registers in any format, with convenient
   implementations provided for :term:`tagged references`.

#. New function :c:func:`mps_root_create_table_tagged` for tables of roots
   containing :term:`tagged references`.

#. New area root functions :c:func:`mps_root_create_area` and
   :c:func:`mps_root_create_area_tagged` for areas of memory
   that can be scanned by area scanning functions.


Interface changes
.................

#. The pool class MV (Manual Variable) is no longer deprecated.

#. The type of pool classes is now :c:type:`mps_pool_class_t`. The old
   name :c:type:`mps_class_t` is still available via a ``typedef``,
   but is deprecated.

#. The functions ``mps_mv_free_size``, ``mps_mv_size``,
   :c:func:`mps_mvff_free_size`, :c:func:`mps_mvff_size`,
   :c:func:`mps_mvt_free_size` and :c:func:`mps_mvt_size` are now
   deprecated in favour of the generic functions
   :c:func:`mps_pool_free_size` and :c:func:`mps_pool_total_size`.

#. The function :c:func:`mps_root_create_reg` is deprecated in favour
   of :c:func:`mps_root_create_thread_tagged`.

#. The function :c:func:`mps_root_create_table_masked` is deprecated in
   favour of :c:func:`mps_root_create_table_tagged`.

#. The :ref:`pool-snc` pool class now implements
   :c:func:`mps_pool_total_size` and :c:func:`mps_pool_free_size`.

#. The (undocumented) reservoir functions
   :c:func:`mps_ap_fill_with_reservoir_permit`,
   :c:func:`mps_reservoir_available`, :c:func:`mps_reservoir_limit`,
   :c:func:`mps_reservoir_limit_set`, and
   :c:func:`mps_reserve_with_reservoir_permit`, together with the
   ``has_reservoir_permit`` arguments to :c:func:`mps_sac_alloc` and
   :c:func:`MPS_SAC_ALLOC_FAST` are now deprecated.


Other changes
.............

#. :c:func:`mps_arena_committed` now returns a meaningful value (the
   amount of memory marked as in use in the page tables) for
   :term:`client arenas`. See job001887_.

   .. _job001887: https://www.ravenbrook.com/project/mps/issue/job001887/

#. :ref:`pool-amc` pools now assert that exact references into the
   pool are aligned to the pool's alignment. See job002175_.

   .. _job002175: https://www.ravenbrook.com/project/mps/issue/job002175/

#. Internal calculation of the address space available to the MPS no
   longer takes time proportional to the number of times the arena has
   been extended, speeding up allocation when memory is tight. See
   job003814_.

   .. _job003814: https://www.ravenbrook.com/project/mps/issue/job003814/

#. Setting :c:macro:`MPS_KEY_SPARE` for a :ref:`pool-mvff` pool now
   works. See job003870_.
   
   .. _job003870: https://www.ravenbrook.com/project/mps/issue/job003870/

#. In the :term:`hot` (production) variety,
   :c:func:`mps_pool_free_size` now returns the correct result for
   :ref:`pool-awl` and :ref:`pool-lo` pools. See job003884_.

   .. _job003884: https://www.ravenbrook.com/project/mps/issue/job003884/

#. When the arena is out of memory and cannot be extended without
   hitting the :term:`commit limit`, the MPS now returns
   :c:macro:`MPS_RES_COMMIT_LIMIT` rather than substituting
   :c:macro:`MPS_RES_RESOURCE`. See job003899_.
   
   .. _job003899: https://www.ravenbrook.com/project/mps/issue/job003899/

#. Unfinalizable objects can no longer be registered for finalization.
   Previously the objects would be registered but never finalized. See
   job003865_.

   .. _job003865: https://www.ravenbrook.com/project/mps/issue/job003865/

#. :c:func:`mps_arena_has_addr` now returns the correct result for
   objects allocated from the :ref:`pool-mfs`, MV (Manual Variable),
   and :ref:`pool-mvff` pools. See job003866_.

   .. _job003866: https://www.ravenbrook.com/project/mps/issue/job003866/

#. The MPS can now make use of :term:`spare committed memory` even if
   it is :term:`mapped` at an unhelpful address, by unmapping it and
   remapping at a better address. See job003898_.

   .. _job003898: https://www.ravenbrook.com/project/mps/issue/job003898/

#. :c:func:`mps_arena_step` now always considers starting a new
   :term:`garbage collection` if the remaining idle time is long
   enough to complete it. (Previously, if there was already a
   collection in progress when :c:func:`mps_arena_step` was called, it
   would finish the collection but not consider starting a new one.)
   See job003934_.

   .. _job003934: https://www.ravenbrook.com/project/mps/issue/job003934/

#. The MPS no longer carries out :term:`garbage collections` when there
   is no collection work to be done. See job003938_.

   .. _job003938: https://www.ravenbrook.com/project/mps/issue/job003938/

#. The MPS is less aggressive in its use of hardware memory protection
   to maintain :term:`write barrier` to speed up future collections.
   This is particularly important for OS X, where memory protection
   operations are very expensive.  See job003371_ and job003975_.

#. The MPS coalesces memory protection, reducing the number of system
   calls. This markedly improves real run time on operating systems
   where memory protection operations are very expensive, such as OS
   X, but also has a significant effect on Linux. See job003371_ and
   job003975_.

   .. _job003371: https://www.ravenbrook.com/project/mps/issue/job003371/
   .. _job003975: https://www.ravenbrook.com/project/mps/issue/job003975/


.. _release-notes-1.114:

Release 1.114.0
---------------

New features
............

#. :term:`Ambiguous <ambiguous reference>` :term:`interior pointers`
   now keep objects in :ref:`pool-amc` and :ref:`pool-amcz` pools
   alive.

   This means that if the compiler optimizes away a pointer to the
   base of an object, leaving an interior pointer as the only
   reference keeping the object alive, this does not cause the object
   to be incorrectly collected. Or, if you are writing your own
   compiler, you can now perform such an optimization safely.

   If you require the old behaviour (in which ambiguous interior
   pointers were ignored) then you can set the
   :c:macro:`MPS_KEY_INTERIOR` keyword argument to ``FALSE`` when
   calling :c:func:`mps_pool_create_k`.

#. The logic for deciding which generations should be collected has
   changed. Now, a chain may be scheduled for collection if the new
   size of *any* of its generations exceeds its capacity, and when a
   chain is collected, all generations are collected up to, and
   including, the highest generation whose new size exceeds its
   capacity. This ensures that all generations are collected reliably
   on chains where there is no allocation into the nursery generation.
   See :ref:`topic-collection-schedule`.

   (Previously, only the nursery generation in each chain
   was considered, and a chain was collected up to, but not including,
   the lowest generation whose new size was within its capacity.)

   As a result of this change, we recommend that you retune your
   generation sizes. (This is not necessary, but may improve
   performance.)

#. New pool introspection functions :c:func:`mps_pool_free_size` and
   :c:func:`mps_pool_total_size`.


Interface changes
.................

#. The granularity with which the arena manages memory can now be
   specified using the :c:macro:`MPS_KEY_ARENA_GRAIN_SIZE` keyword
   argument to :c:func:`mps_arena_create_k`. See
   :c:func:`mps_arena_class_cl` and :c:func:`mps_arena_class_vm`.

#. There is now a default value (currently 256 \ :term:`megabytes`)
   for the :c:macro:`MPS_KEY_ARENA_SIZE` keyword argument to
   :c:func:`mps_arena_create_k` when creating a virtual memory arena.
   See :c:func:`mps_arena_class_vm`.

#. The keyword argument :c:macro:`MPS_KEY_AMS_SUPPORT_AMBIGUOUS` now
   defaults to ``TRUE`` in order to better support the general case:
   the value ``FALSE`` is appropriate only when you know that all
   references are exact. See :ref:`pool-ams`.

#. There is now a default value for the
   :c:macro:`MPS_KEY_AWL_FIND_DEPENDENT` keyword argument to
   :c:func:`mps_pool_create_k` when creating an :ref:`pool-awl` pool.
   The default value is a function that always returns ``NULL``
   (meaning that there is no dependent object).

#. It is now possible to configure the alignment of objects allocated
   in an MV (Manual Variable) pool, by passing the
   :c:macro:`MPS_KEY_ALIGN` keyword argument to
   :c:func:`mps_pool_create_k`.

#. The :ref:`pool-mvff` pool class takes a new keyword argument
   :c:macro:`MPS_KEY_SPARE`. This specifies the maximum proportion of
   memory that the pool will keep spare for future allocations.

#. The alignment requirements for :ref:`pool-mvff` and :ref:`pool-mvt`
   pools have been relaxed on the platforms ``w3i3mv`` and ``w3i6mv``.
   On all platforms it is now possible to specify alignments down to
   ``sizeof(void *)`` as the alignment for pools of these classes.

#. The sizes of the templates in a :c:type:`mps_pool_debug_option_s`
   structure no longer have to be related to the alignment of the
   pools that they are used with. This makes it easier to reuse these
   structures.


Other changes
.............

#. The :ref:`pool-ams` pool class no longer triggers the assertion
   ``!AMS_IS_INVALID_COLOUR(seg, i)`` under rare circumstances
   (namely, detaching an :term:`allocation point` from a :term:`grey`
   segment when :c:macro:`MPS_KEY_AMS_SUPPORT_AMBIGUOUS` is
   ``FALSE``). See job001549_.

   .. _job001549: https://www.ravenbrook.com/project/mps/issue/job001549/

#. :c:func:`mps_arena_roots_walk` no longer triggers an assertion
   failure when run twice in succession. See job003496_.

   .. _job003496: https://www.ravenbrook.com/project/mps/issue/job003496/

#. The alignment of :ref:`pool-awl` pools is now configurable via the
   object format, as documented, and is no longer always
   :c:macro:`MPS_PF_ALIGN`. See job003745_.

   .. _job003745: https://www.ravenbrook.com/project/mps/issue/job003745/

#. The debugging version of the :ref:`pool-mvff` pool class,
   :c:func:`mps_class_mvff_debug`, no longer triggers an assertion
   failure if you allocate a large object. See job003751_.

   .. _job003751: https://www.ravenbrook.com/project/mps/issue/job003751/

#. :program:`mpseventtxt` now successfully processes a telemetry log
   containing multiple labels associated with the same address. See
   job003756_.

   .. _job003756: https://www.ravenbrook.com/project/mps/issue/job003756/

#. :ref:`pool-ams`, :ref:`pool-awl` and :ref:`pool-lo` pools get
   reliably collected, even in the case where the pool is the only
   pool on its generation chain and is allocating into some generation
   other than the nursery. See job003771_.

   .. _job003771: https://www.ravenbrook.com/project/mps/issue/job003771/

#. Allocation into :ref:`pool-awl` pools again reliably provokes
   garbage collections of the generation that the pool belongs to. (In
   version 1.113, the generation would only be collected if a pool of
   some other class allocated into it.) See job003772_.

   .. _job003772: https://www.ravenbrook.com/project/mps/issue/job003772/

#. All unreachable objects in :ref:`pool-lo` pools are finalized.
   (Previously, objects on a segment attached to an allocation point
   were not finalized until the allocation point was full.) See
   job003773_.

   .. _job003773: https://www.ravenbrook.com/project/mps/issue/job003773/

#. The :ref:`pool-mvt` and :ref:`pool-mvff` pool classes are now
   around 25% faster (in our benchmarks) than they were in version
   1.113.

#. The default assertion handler in the default :term:`plinth` now
   flushes the telemetry stream before aborting. See
   :c:func:`mps_lib_assert_fail`.

#. Garbage collection performance is substantially improved in the
   situation where the arena has been extended many times. Critical
   operations now take time logarithmic in the number of times the
   arena has been extended (rather than linear, as in version 1.113
   and earlier). See job003554_.

   .. _job003554: https://www.ravenbrook.com/project/mps/issue/job003554/


.. _release-notes-1.113:

Release 1.113.0
---------------

New features
............

#. In previous releases there was an implicit connection between
   blocks allocated by :ref:`pool-awl` and :ref:`pool-lo` pools, and
   blocks allocated by other automatically managed pool classes.

   In particular, blocks allocated by AWL and LO pools were garbage
   collected together with blocks allocated by :ref:`pool-ams` pools,
   and blocks allocated by :ref:`pool-amc` pools in generation 1 of
   their chains.

   This is no longer the case: to arrange for blocks to be collected
   together you need to ensure that they are allocated in the *same*
   generation chain, using the :c:macro:`MPS_KEY_CHAIN` and
   :c:macro:`MPS_KEY_GEN` keyword arguments to
   :c:func:`mps_pool_create_k`.

   So if you have code like this::

       res = mps_pool_create(&my_amc, arena, mps_class_amc(), my_chain);
       res = mps_pool_create(&my_awl, arena, mps_class_awl());

   and you want to retain the connection between these pools, then you
   must ensure that they use the same generation chain::

       MPS_ARGS_BEGIN(args) {
         MPS_ARGS_ADD(args, MPS_KEY_CHAIN, my_chain);
         res = mps_pool_create_k(&my_amc, arena, mps_class_amc(), args);
       } MPS_ARGS_END(args);

       MPS_ARGS_BEGIN(args) {
         MPS_ARGS_ADD(args, MPS_KEY_CHAIN, my_chain);
         MPS_ARGS_ADD(args, MPS_KEY_GEN, 1);
         res = mps_pool_create_k(&my_awl, arena, mps_class_awl(), args);
       } MPS_ARGS_END(args);


Interface changes
.................

#. When creating a list of keyword arguments, there is no longer any
   need to call :c:func:`MPS_ARGS_DONE`. See :ref:`topic-keyword`.

#. When creating an automatically managed pool using
   :c:func:`mps_pool_create_k`, it is no longer necessary to pass in a
   generation chain. The arena has a default generation chain and this
   is used by all automatically managed pools where no generation
   chain was specified.

#. It is now possible to specify a generation chain for
   :ref:`pool-awl` and :ref:`pool-lo` pool classes, by using the
   optional :c:macro:`MPS_KEY_CHAIN` keyword argument to
   :c:func:`mps_pool_create_k`.

#. It is now possible to specify which generation the :ref:`pool-ams`,
   :ref:`pool-awl`, and :ref:`pool-lo` pool classes allocate new
   objects into, using the optional :c:macro:`MPS_KEY_GEN` keyword
   argument to :c:func:`mps_pool_create_k`.


Other changes
.............

#. The MPS now retains some unused memory instead of returning it to
   the operating system. This reduces unnecessary overhead due to
   system calls, thrashing the operating system's page table, and
   zeroing memory when re-allocated. See job003700_.

   .. _job003700: https://www.ravenbrook.com/project/mps/issue/job003700/


.. _release-notes-1.112:

Release 1.112.0
---------------

New features
............

#. New supported platform ``lii6ll`` (Linux, x86-64, Clang/LLVM).

#. On Windows, you can now request that the MPS allocate address space
   from the top down, allowing a 32-bit executable linked with
   ``/LARGEADDRESSAWARE`` to use the top half of the address space.
   Use the keyword argument :c:macro:`MPS_KEY_VMW3_TOP_DOWN` when
   creating an arena of class :c:func:`mps_arena_class_vm`.

#. On OS X, multi-threaded programs are now supported. See
   :ref:`topic-thread`.

#. On OS X, you can now debug the MPS using ``lldb``.


Interface changes
.................

#. In the :term:`hot` (production) variety, the default assertion handler
   now prints messages to standard error but does *not* terminate the
   program. Even though assertions indicate serious problems in the
   program, an end-user does not always want an application to terminate when
   there is a chance to shut down safely and save work, or even to limp
   along indefinitely.  See :ref:`topic-error-assertion-handling`.

#. The behaviour when an assertion is triggered is now configurable in
   the default :term:`plinth` by installing an assertion handler. See
   :c:func:`mps_lib_assert_fail_install`.

#. Functions that take a variable number of arguments
   (:c:func:`mps_arena_create`, :c:func:`mps_pool_create`,
   :c:func:`mps_ap_create`) and their ``va_list`` alternatives
   (:c:func:`mps_arena_create_v` etc.) are now deprecated in favour of
   functions that use a :term:`keyword argument` interface
   (:c:func:`mps_arena_create_k`, :c:func:`mps_pool_create_k`,
   :c:func:`mps_ap_create_k`).

   Similarly, the object format variant structures
   (:c:type:`mps_fmt_A_s` etc.) and the functions that take them as
   arguments (:c:func:`mps_fmt_create_A` etc.) are now deprecated in
   favour of :c:func:`mps_fmt_create_k`.

   The new interfaces provide better reporting of errors, default
   values for arguments, and forward compatibility. See
   :ref:`topic-keyword`.

   The old interfaces continue to be supported for now, but new
   features will become available through the keyword interface only.

#. :ref:`pool-mfs` pools no longer refuse to manage blocks that are
   smaller than the platform alignment. They now round up smaller
   sizes internally if necessary.

#. :ref:`pool-mvt` pools now allow the client to specify the alignment
   of blocks. Use the keyword argument :c:macro:`MPS_KEY_ALIGN` when
   creating a pool of class :c:func:`mps_class_mvt`.

#. On OS X, signals are no longer used for handling memory protection
   exceptions. This means that programs are free to handle ``SIGBUS``,
   but must not install a thread-local Mach exception handler for
   ``EXC_BAD_ACCESS`` exceptions. See :ref:`topic-thread-signal`.

#. On OS X, when debugging with ``gdb``, you no longer need to turn on
   ``dont-handle-bad-access`` or to request special handling of
   ``SIGBUS``.


Other changes
.............

#. On Windows, an execute exception no longer triggers an assertion.
   See job003301_.

   .. _job003301: https://www.ravenbrook.com/project/mps/issue/job003301/

#. Rehashing of large address-based hash tables no longer provokes a
   nursery collection that immediately renders the hash table stale
   again. See job003435_.

   .. _job003435: https://www.ravenbrook.com/project/mps/issue/job003435/

#. An :ref:`pool-mvt` pool no longer triggers an assertion failure
   when it runs out of space on its reserved block queue. See
   job003486_.

   .. _job003486: https://www.ravenbrook.com/project/mps/issue/job003486/

#. The ``-i`` and ``-o`` options no longer cause
   :program:`mpseventsql` to crash. See job003507_.

   .. _job003507: https://www.ravenbrook.com/project/mps/issue/job003507/

#. On Windows, telemetry files now have correct clock values.
   Previously the top 32 bits were incorrectly output as zero. See
   job003519_.

   .. _job003519: https://www.ravenbrook.com/project/mps/issue/job003519/

#. On 64-bit Windows, it's no longer possible to get a stack overflow
   exception while the MPS is holding the arena lock. See job003640_.

   .. _job003640: https://www.ravenbrook.com/project/mps/issue/job003640/


.. _release-notes-1.111:

Release 1.111.0
---------------

New features
............

#. Reporting features have been removed from the :ref:`mpseventcnv
   <telemetry-mpseventcnv>` utility. Instead, the telemetry system
   comes with two new utility programs to assist with reporting and
   analysis: :ref:`mpseventtxt <telemetry-mpseventtxt>` converts an
   event stream into human-readable form, and :ref:`mpseventsql
   <telemetry-mpseventsql>` loads an event stream into a SQLite
   database for further analysis. See :ref:`topic-telemetry`.

#. The new pool class :ref:`pool-mfs` provides manually managed
   allocation of fixed-size objects.

#. The new pool class :ref:`pool-mvt` provides manually managed
   allocation of variable-size objects using a *temporal fit*
   allocation policy (that is, objects that are allocated togther are
   expected to be freed together).


Interface changes
.................

#. It is no longer necessary for client programs to use
   :c:func:`mps_tramp` to ensure that exceptions due to barrier hits
   are caught. This function is now deprecated.

#. You can set the environment variable
   :envvar:`MPS_TELEMETRY_CONTROL` to ``all`` to make the telemetry
   system output all events. See :ref:`topic-telemetry`.

#. New functions :c:func:`mps_telemetry_get`,
   :c:func:`mps_telemetry_set` and :c:func:`mps_telemetry_reset`
   provide a more convenient interface to telemetry control than
   :c:func:`mps_telemetry_control`, which is now deprecated. See
   :ref:`topic-telemetry`.

#. The pool classes MV (Manual Variable) and :ref:`pool-snc` are now
   deprecated.

#. Allocation frames are now deprecated. See :ref:`topic-frame`.

#. Additionally, the functions :c:func:`mps_arena_expose`,
   :c:func:`mps_arena_unsafe_expose_remember_protection`,
   :c:func:`mps_arena_unsafe_restore_protection`,
   :c:func:`mps_arena_roots_walk`, and :c:func:`mps_fix` are now
   deprecated.


Other changes
.............

#. :c:func:`mps_arena_step` no longer unclamps the arena as a side
   effect. If the arena is clamped or parked before calling
   :c:func:`mps_arena_step`, it is clamped afterwards. See job003320_.

   .. _job003320: https://www.ravenbrook.com/project/mps/issue/job003320/

#. The ambiguous stack scanner, :c:func:`mps_stack_scan_ambig`, no
   longer asserts on Linux when there are multiple threads. See
   job003412_.

   .. _job003412: https://www.ravenbrook.com/project/mps/issue/job003412/

#. It is no longer possible for the "ramp" allocation pattern,
   :c:func:`mps_alloc_pattern_ramp()`, to get stuck. Now
   :c:func:`mps_ap_alloc_pattern_end` reliably clears this pattern.
   See job003454_.

   .. _job003454: https://www.ravenbrook.com/project/mps/issue/job003454/

#. The build system now correctly detects the FreeBSD operating system
   running on the x86-64 architecture, for FreeBSD version 9.1 or
   later. See job003473_.

   .. _job003473: https://www.ravenbrook.com/project/mps/issue/job003473/


.. _release-notes-1.110:

Release 1.110.0
---------------

New features
............

#. New supported platforms:

   * ``fri6gc`` (FreeBSD, x86-64, GCC)
   * ``lii6gc`` (Linux, x86-64, GCC)
   * ``w3i6mv`` (Windows, x86-64, Microsoft Visual C)
   * ``xci3ll`` (OS X, IA-32, Clang/LLVM)
   * ``xci6gc`` (OS X, x86-64, GCC)
   * ``xci6ll`` (OS X, x86-64, Clang/LLVM)

#. Support removed for platforms:

   * ``iam4cc`` (Irix 6, MIPS R4000, MIPSpro C)
   * ``lii3eg`` (Linux, IA-32, EGCS)
   * ``lippgc`` (Linux, PowerPC, GCC)
   * ``o1alcc`` (OSF/1, Alpha, Digital C)
   * ``o1algc`` (OSF/1, Alpha, GCC)
   * ``s7ppmw`` (System 7, PowerPC, MetroWerks C)
   * ``sos8gc`` (Solaris, SPARC 8, GCC)
   * ``sos9sc`` (Solaris, SPARC 9, SunPro C)
   * ``sus8gc`` (SunOS, SPARC 8, GCC)
   * ``xcppgc`` (OS X, PowerPC, GCC)

#. On Unix platforms, the MPS can now be built and installed by
   running ``./configure && make install``. See :ref:`guide-build`.

#. The MPS can be compiled in a single step via the new source file
   ``mps.c``. This also allows you to compile the MPS in the same
   compilation unit as your object format, allowing the compiler to
   perform global optimizations between the two. See
   :ref:`guide-build`.

#. The set of build varieties has been reduced to three: the
   :term:`cool` variety for development and debugging, the :term:`hot`
   variety for production, and the :term:`rash` variety for people who
   like to live dangerously. See :ref:`topic-error-variety`.

#. The environment variable :envvar:`MPS_TELEMETRY_CONTROL` can now be
   set to a space-separated list of event kinds. See
   :ref:`topic-telemetry`.

#. Telemetry output is now emitted to the file named by the
   environment variable :envvar:`MPS_TELEMETRY_FILENAME`, if it is
   set. See :ref:`topic-telemetry`.


Interface changes
.................

#. Deprecated constants ``MPS_MESSAGE_TYPE_FINALIZATION``,
   ``MPS_MESSAGE_TYPE_GC`` and ``MPS_MESSAGE_TYPE_GC_START`` have been
   removed. Use :c:func:`mps_message_type_finalization`,
   :c:func:`mps_message_type_gc` and
   :c:func:`mps_message_type_gc_start` instead.

#. Deprecated constants ``MPS_RANK_AMBIG``, ``MPS_RANK_EXACT`` and
   ``MPS_RANK_WEAK`` have been removed. Use :c:func:`mps_rank_ambig`,
   :c:func:`mps_rank_exact` and :c:func:`mps_rank_weak` instead.

#. Deprecated functions with names starting ``mps_space_`` have been
   removed. Use the functions with names starting ``mps_arena_``
   instead.