<!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/48504bf59d561df988c5d8214f09e012fb617f46">48504bf5</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-05-16T01:46:28Z</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/a2b74bc7f839a8dcca0b50cf9d08d9fcde69cde2">a2b74bc7</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-05-16T16:31:34Z</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">Merge branch 'wip/gc/misc-rts' into wip/gc/preparation
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/commit/a53d4411122409378cf9bce02aaa38a027999da3">a53d4411</a></strong>
<div>
<span>by Ömer Sinan Ağacan</span>
<i>at 2019-05-16T16:37:44Z</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/0444df2abb21df3cad233d1484a1b73c59d93f53">0444df2a</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-05-16T20:39:49Z</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/fb0e64f93d318b0e543dedda423901dfbf93cc69">fb0e64f9</a></strong>
<div>
<span>by Ömer Sinan Ağacan</span>
<i>at 2019-05-16T20:40:20Z</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/bf21f97869393916a4ba135dd2a5831959ff8b30">bf21f978</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-05-17T00:42:44Z</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/fb1513a7492f3e8b04334b9c90769e7df00984fb">fb1513a7</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-05-17T00:42:44Z</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/242f9ff8081a546ec36874bbd14038be8d7f915a">242f9ff8</a></strong>
<div>
<span>by Ömer Sinan Ağacan</span>
<i>at 2019-05-17T17:00:12Z</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/24c946a53b690984c45e6522d90603844ae8730b">24c946a5</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2019-05-17T17:00:12Z</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>28 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="#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="#ea5b55864b3d39c103447f9e3f5b04289d9c2e4d">
includes/rts/storage/InfoTables.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="#640fc6f2f536ba83f1694f9a7ef3d43e2d0428d3">
rts/RtsFlags.c
</a>
</li>
<li class="file-stats">
<a href="#9ed11d0519762dae04656481b089dbb5b05acf98">
rts/RtsStartup.c
</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="#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="#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>
<li class="file-stats">
<a href="#4f5ba3ce18ccc17ad367193f379aa61f4c9180a0">
<span class="new-file">
+
rts/sm/NonMovingMark.c
</span>
</a>
</li>
<li class="file-stats">
<a href="#bcae703553e66a4a73c4aa4a930513cc4aa923cf">
<span class="new-file">
+
rts/sm/NonMovingMark.h
</span>
</a>
</li>
<li class="file-stats">
<a href="#7893c76945f74c60b62878fa12bb5de75b8e1340">
<span class="new-file">
+
rts/sm/NonMovingScav.c
</span>
</a>
</li>
<li class="file-stats">
<a href="#9cbb27e8dac63b5209040e177a71a14a21cfeadc">
<span class="new-file">
+
rts/sm/NonMovingScav.h
</span>
</a>
</li>
<li class="file-stats">
<a href="#78077cd665e91d3877a41e287033df6d2884b2ce">
<span class="new-file">
+
rts/sm/NonMovingSweep.c
</span>
</a>
</li>
<li class="file-stats">
<a href="#e0df3d3aff01c04aefc7478eff33fb15fd9f98a6">
<span class="new-file">
+
rts/sm/NonMovingSweep.h
</span>
</a>
</li>
<li class="file-stats">
<a href="#58096134fc46f90956354534c54f43e04f893269">
rts/sm/Sanity.c
</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/68e5616f404b14a0e02b7d719bf1d50865dba44b...24c946a53b690984c45e6522d90603844ae8730b">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>