<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en">
<head>
<meta content="text/html; charset=US-ASCII" http-equiv="Content-Type">
<title>
GitLab
</title>



<style>img {
max-width: 100%; height: auto;
}
</style>
</head>
<body>
<div class="content">

<h3>
Ben Gamari pushed to branch wip/gc/nonmoving-nonconcurrent
at <a href="https://gitlab.haskell.org/ghc/ghc">Glasgow Haskell Compiler / GHC</a>
</h3>
<h4>
Commits:
</h4>
<ul>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/673a0e4166e0fcfd9200e87bd4bdc98b3222bdbd">673a0e41</a></strong>
<div>
<span>by Ömer Sinan Ağacan</span>
<i>at 2019-06-19T18:17:47Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/GC: Add an obvious assertion during block initialization

Namely ensure that block descriptors are initialized with valid
generation numbers.

Co-Authored-By: Ben Gamari <ben@well-typed.com>
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/1baa6967a5d30ba1cb14e3167976fa8cc5ff3667">1baa6967</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:17:48Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Add Note explaining applicability of selector optimisation depth limit

This was slightly non-obvious so a note seems deserved.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/4c866b4f7004443b515b63a1fe550167be898107">4c866b4f</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:17:48Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/Capability: A few documentation comments
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/d930ba9b8842f395cd09baab608660888021653f">d930ba9b</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:17:48Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Give stack flags proper macros

This were previously quite unclear and will change a bit under the
non-moving collector so let's clear this up now.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/5f8f04b771aeb49146bdc71e6bd0d99447fa618b">5f8f04b7</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:17:48Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/GC: Refactor gcCAFs
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/c8ee5c5f45f48f272f877d18ea7aaeae54caf7da">c8ee5c5f</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:17:48Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Fix macro parenthesisation
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/4f65be60b81cd70c41fd14dd73a18fb68478dd84">4f65be60</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:17:48Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Fix CPP linter issues
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/ada2e65ed3d1479658971bbcf071052c66b51ae8">ada2e65e</a></strong>
<div>
<span>by Ömer Sinan Ağacan</span>
<i>at 2019-06-19T18:19:53Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">Disallow allocating megablocks, again
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/7f6f49e060ae2952b35f7876fadc5289bda460d0">7f6f49e0</a></strong>
<div>
<span>by Ömer Sinan Ağacan</span>
<i>at 2019-06-19T18:20:02Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">Comments
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/64cf96a37a29b7d0e014753faea647217533f80f">64cf96a3</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:20:36Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">Merge branches 'wip/gc/misc-rts' and 'wip/gc/aligned-block-allocation' into wip/gc/preparation
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/2413f24334bfb0ba51bdd86467033609db216c31">2413f243</a></strong>
<div>
<span>by Ömer Sinan Ağacan</span>
<i>at 2019-06-19T18:21:20Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/StableName: Expose FOR_EACH_STABLE_NAME, freeSnEntry, SNT_size

These will be needed when we implement sweeping in the nonmoving
collector.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/a5767c9834a654f0dcab96d3f34f1bfe5be270c2">a5767c98</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:21:20Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Disable aggregate-return warnings from gcc

This warning is a bit of a relic; there is little reason to avoid
aggregate return values in 2019.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/17d23113098c42a815bb285478761db7caec4fe8">17d23113</a></strong>
<div>
<span>by Ömer Sinan Ağacan</span>
<i>at 2019-06-19T18:21:21Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/Scav: Expose scavenging functions

To keep the non-moving collector nicely separated from the moving
collector its scavenging phase will live in another file,
`NonMovingScav.c`. However, it will need to use these functions so
let's expose them.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/437933b888205f6888422fb32162c4cb7b99c51d">437933b8</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:21:21Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Introduce flag to enable the nonmoving old generation

This flag will enable the use of a non-moving oldest generation.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/8d190c8342c878293f2bb2272a86862dd3fb2254">8d190c83</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:21:21Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Introduce debug flag for non-moving GC
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/3f9bd4596191eb5f3aa69172e8f7546db68f2b07">3f9bd459</a></strong>
<div>
<span>by Ömer Sinan Ağacan</span>
<i>at 2019-06-19T18:22:09Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Non-concurrent mark and sweep

This implements the core heap structure and a serial mark/sweep
collector which can be used to manage the oldest-generation heap.
This is the first step towards a concurrent mark-and-sweep collector
aimed at low-latency applications.

The full design of the collector implemented here is described in detail
in a technical note

    B. Gamari. "A Concurrent Garbage Collector For the Glasgow Haskell
    Compiler" (2018)

The basic heap structure used in this design is heavily inspired by

    K. Ueno & A. Ohori. "A fully concurrent garbage collector for
    functional programs on multicore processors." /ACM SIGPLAN Notices/
    Vol. 51. No. 9 (presented by ICFP 2016)

This design is intended to allow both marking and sweeping
concurrent to execution of a multi-core mutator. Unlike the Ueno design,
which requires no global synchronization pauses, the collector
introduced here requires a stop-the-world pause at the beginning and end
of the mark phase.

To avoid heap fragmentation, the allocator consists of a number of
fixed-size /sub-allocators/. Each of these sub-allocators allocators into
its own set of /segments/, themselves allocated from the block
allocator. Each segment is broken into a set of fixed-size allocation
blocks (which back allocations) in addition to a bitmap (used to track
the liveness of blocks) and some additional metadata (used also used
to track liveness).

This heap structure enables collection via mark-and-sweep, which can be
performed concurrently via a snapshot-at-the-beginning scheme (although
concurrent collection is not implemented in this patch).

The mark queue is a fairly straightforward chunked-array structure.
The representation is a bit more verbose than a typical mark queue to
accomodate a combination of two features:

 * a mark FIFO, which improves the locality of marking, reducing one of
   the major overheads seen in mark/sweep allocators (see [1] for
   details)

 * the selector optimization and indirection shortcutting, which
   requires that we track where we found each reference to an object
   in case we need to update the reference at a later point (e.g. when
   we find that it is an indirection). See Note [Origin references in
   the nonmoving collector] (in `NonMovingMark.h`) for details.

Beyond this the mark/sweep is fairly run-of-the-mill.

[1] R. Garner, S.M. Blackburn, D. Frampton. "Effective Prefetch for
    Mark-Sweep Garbage Collection." ISMM 2007.

Co-Authored-By: Ben Gamari <ben@well-typed.com>
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/439e50c3d1f575d6886f3f8fdac937b8d93f10a0">439e50c3</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-06-19T18:22:09Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">testsuite: Add nonmoving WAY

This simply runs the compile_and_run tests with `-xn`, enabling the
nonmoving oldest generation.
</pre>
</li>
</ul>
<h4>30 changed files:</h4>
<ul>
<li class="file-stats">
<a href="#6ae923e173536bf0ddb39552416a7e21767287db">
docs/users_guide/runtime_control.rst
</a>
</li>
<li class="file-stats">
<a href="#40f83a2cddcbc1f8190b0551eb572ccf4ea88cc9">
includes/Rts.h
</a>
</li>
<li class="file-stats">
<a href="#241971342cd0c394b24e67a781cf7e3d2f01aa72">
includes/rts/Flags.h
</a>
</li>
<li class="file-stats">
<a href="#0dcc7b3b05fd9aac5ea350885b06f0718bcf70c2">
includes/rts/storage/Block.h
</a>
</li>
<li class="file-stats">
<a href="#94ca41c5afbb3d932bd6f37ee16458322988fb69">
includes/rts/storage/GC.h
</a>
</li>
<li class="file-stats">
<a href="#ea5b55864b3d39c103447f9e3f5b04289d9c2e4d">
includes/rts/storage/InfoTables.h
</a>
</li>
<li class="file-stats">
<a href="#2f870b7c76a5e24010e464cc1a1f860c0f9e0dab">
includes/rts/storage/TSO.h
</a>
</li>
<li class="file-stats">
<a href="#c184941110ec11e4f595256c2354bed617511571">
libraries/base/GHC/RTS/Flags.hsc
</a>
</li>
<li class="file-stats">
<a href="#33249795fee267712d5c3a7ecfa9f2edea260401">
rts/Capability.c
</a>
</li>
<li class="file-stats">
<a href="#62ec5569a8af1e443ae952b393d15b9dd1cea199">
rts/Capability.h
</a>
</li>
<li class="file-stats">
<a href="#6db965f97cbab901f493506a385bcf1283009921">
rts/PrimOps.cmm
</a>
</li>
<li class="file-stats">
<a href="#640fc6f2f536ba83f1694f9a7ef3d43e2d0428d3">
rts/RtsFlags.c
</a>
</li>
<li class="file-stats">
<a href="#9ed11d0519762dae04656481b089dbb5b05acf98">
rts/RtsStartup.c
</a>
</li>
<li class="file-stats">
<a href="#7d6961cb073b9fe3df3a81f0ad5cf36eed293c42">
rts/Schedule.c
</a>
</li>
<li class="file-stats">
<a href="#52526efc348b52718c69d51f8df6e5425ff68d48">
rts/Schedule.h
</a>
</li>
<li class="file-stats">
<a href="#2f69bf0632a148614b9aceae17e7e627784cf567">
rts/StableName.c
</a>
</li>
<li class="file-stats">
<a href="#a6a45e2bced459a8c9ae14a62849f69ae436b0e9">
rts/StableName.h
</a>
</li>
<li class="file-stats">
<a href="#a5d219117032120cc7bde9f13451d9627cff5614">
rts/Threads.c
</a>
</li>
<li class="file-stats">
<a href="#af7520a7c19cb7a894a90a944c97a4ed95f12b78">
rts/Trace.h
</a>
</li>
<li class="file-stats">
<a href="#8a78f03f80f0544ead476d53dd0f1db7cbd68d1b">
rts/Weak.c
</a>
</li>
<li class="file-stats">
<a href="#22d6a1257dd9727593b678661c672529539427ba">
rts/ghc.mk
</a>
</li>
<li class="file-stats">
<a href="#e432c7b248b68100c3cc37db36ee80d975efd697">
rts/rts.cabal.in
</a>
</li>
<li class="file-stats">
<a href="#a9accda65187a56e0d42dd7fb7a717af6b41d918">
rts/sm/BlockAlloc.c
</a>
</li>
<li class="file-stats">
<a href="#37a93df244a7789fddf557443b6398d06763e9cc">
rts/sm/Evac.c
</a>
</li>
<li class="file-stats">
<a href="#6477e10756faf038741e63d1ad499a1df809fe10">
rts/sm/GC.c
</a>
</li>
<li class="file-stats">
<a href="#06e70a7de800b2de9d75c2d5b5b554929f6b9bcb">
rts/sm/GC.h
</a>
</li>
<li class="file-stats">
<a href="#a481abfdf0106c53321542436ad78f6df542b1b8">
rts/sm/GCAux.c
</a>
</li>
<li class="file-stats">
<a href="#26a3faea0f0e66eab204fe0639219eea4729a9d3">
rts/sm/GCThread.h
</a>
</li>
<li class="file-stats">
<a href="#b4a38dad10ba126e05a0b6adc99aa0c2eb742875">
<span class="new-file">
+
rts/sm/NonMoving.c
</span>
</a>
</li>
<li class="file-stats">
<a href="#371d3c3c9fad484c1163aa733d70507ce33084c9">
<span class="new-file">
+
rts/sm/NonMoving.h
</span>
</a>
</li>
</ul>
<h5>The diff was not included because it is too large.</h5>

</div>
<div class="footer" style="margin-top: 10px;">
<p style="font-size: small; color: #777;">

<br>
<a href="https://gitlab.haskell.org/ghc/ghc/compare/fbaf283cc9d30f3e6fc4e5815ce1c9674d41d5d6...439e50c3d1f575d6886f3f8fdac937b8d93f10a0">View it on GitLab</a>.
<br>
You're receiving this email because of your account on gitlab.haskell.org.
If you'd like to receive fewer emails, you can
adjust your notification settings.


</p>
</div>
</body>
</html>