<!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/tsan-ghc-8.10
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/5300e0e6c612e9fd924b13d3a69a0973ddc3de8c">5300e0e6</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">testsuite: Mark hie002 as high_memory_usage
This test has a peak residency of 1GByte; this is large enough to
classify as "high" in my book.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/3e97158a4ca72a95975b1d966367ee2464394127">3e97158a</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">testsuite: Mark T9872[abc] as high_memory_usage
These all have a maximum residency of over 2 GB.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/6df201b52510f5442c0bfb970e90aa6d02c4729e">6df201b5</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">gitlab-ci: Disable documentation in TSAN build
Haddock chews through enough memory to cause the CI builders to OOM and
there's frankly no reason to build documentation in this job anyways.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/878bc8c8f20a406ad6d2112babba5578c0dbcfc6">878bc8c8</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">TSANUtils: Ensure that C11 atomics are supported
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/26d535e5acc8dcbd42bb89973cf9b5806ee4c2ca">26d535e5</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">testsuite: Mark T3807 as broken with TSAN
Due to #18883.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/1377402f7129097129e5d10723ca0aeda22233c5">1377402f</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">testsuite: Mark T13702 as broken with TSAN due to #18884
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/6f10802e232403a396fa4eceb35bf0f5876f73ae">6f10802e</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/BlockAlloc: Use relaxed operations
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/48fd966b17e472f6a8aadce249d2848b1715ada9">48fd966b</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Rework handling of mutlist scavenging statistics
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/aa2215f982f795c25b818f739247f8e39a41fce7">aa2215f9</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Avoid data races in StablePtr implementation
This fixes two potentially problematic data races in the StablePtr
implementation:
* We would fail to RELEASE the stable pointer table when enlarging it,
causing other cores to potentially see uninitialized memory.
* We would fail to ACQUIRE when dereferencing a stable pointer.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/f2ea40ca245d186f0bfd6a1d5b8a568685c77551">f2ea40ca</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/Storage: Use atomics
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/e371a1498f960cb20409d57c080dc821a053cdeb">e371a149</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/Updates: Use proper atomic operations
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/05975e8438f3a66e545a911aa032f027065e397d">05975e84</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/Weak: Eliminate data races
By taking all_tasks_mutex in stat_exit. Also better-document the fact
that the task statistics are protected by all_tasks_mutex.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/01d8d105038814c0ad2c9329664d1457f7c1dd25">01d8d105</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/GC: Use atomics
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/c30bbd9215ceec42bdb50ccb9ab1d1fcb7725d28">c30bbd92</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Use RELEASE ordering in unlockClosure
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/65daad3399073a11fe09fa26b869a8051add4511">65daad33</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/Storage: Accept races on heap size counters
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/0fd2a3b4b59aa0d8abe186996034aabd91344f73">0fd2a3b4</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Join to concurrent mark thread during shutdown
Previously we would take all capabilities but fail to join on the thread
itself, potentially resulting in a leaked thread.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/69877da4f900f5e6ef2d124262947469fd99dce1">69877da4</a></strong>
<div>
<span>by GHC GitLab CI</span>
<i>at 2020-11-24T13:40:34-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Fix race in GC CPU time accounting
Ensure that the GC leader synchronizes with workers before calling
stat_endGC.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/e5217165234f97c8541716bf32e52ae0953a59b1">e5217165</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/SpinLock: Separate out slow path
Not only is this in general a good idea, but it turns out that GCC
unrolls the retry loop, resulting is massive code bloat in critical
parts of the RTS (e.g. `evacuate`).
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/b313c31716b91fe7888b0ac59e0f18ec793d762f">b313c317</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Use relaxed ordering on spinlock counters
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/f23aa99e35c7052d747e7c54febbad16013b8980">f23aa99e</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Annotate hopefully "benign" races in freeGroup
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/2790c3968bbe8ad8793bfd775778049e8e17b79a">2790c396</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">Strengthen ordering in releaseGCThreads
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/f711be8a6e5ea4980f9bc52427a3c284b810cfa7">f711be8a</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/WSDeque: Rewrite with proper atomics
After a few attempts at shoring up the previous implementation, I ended
up turning to the literature and now use the proven implementation,
> N.M. Lê, A. Pop, A.Cohen, and F.Z. Nardelli. "Correct and Efficient
> Work-Stealing for Weak Memory Models". PPoPP'13, February 2013,
> ACM 978-1-4503-1922/13/02.
Note only is this approach formally proven correct under C11 semantics
but it is also proved to be a bit faster in practice.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/928dc06d440fd8216e1b92cd5fa1c370f1c5b368">928dc06d</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Use relaxed atomics for whitehole spin stats
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/95760050824b639ec887c0fc735dded7aa6eac7e">95760050</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Avoid lock order inversion during fork
Fixes #17275.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/290ce1a3a585c5fb599760c294cf3617f3d566bb">290ce1a3</a></strong>
<div>
<span>by GHC GitLab CI</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Use proper relaxe operations in getCurrentThreadCPUTime
Here we are doing lazy initialization; it's okay if we do the check more
than once, hence relaxed operation is fine.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/d5241ddfd5d139974dce7596f30d9de98266e1b1">d5241ddf</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/STM: Use atomics
This fixes a potentially harmful race where we failed to synchronize
before looking at a TVar's current_value.
Also did a bit of refactoring to avoid abstract over management of
max_commits.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/d511cbb21ee0b687994d17846452257550e3aadd">d511cbb2</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/stm: Strengthen orderings to SEQ_CST instead of volatile
Previously the `current_value`, `first_watch_queue_entry`, and
`num_updates` fields of `StgTVar` were marked as `volatile` in an
attempt to provide strong ordering. Of course, this isn't sufficient.
We now use proper atomic operations. In most of these cases I strengthen
the ordering all the way to SEQ_CST although it's possible that some
could be weakened with some thought.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/9230100f05edd4efa5fbb389a05381d9954fd5fe">9230100f</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">Mitigate data races in event manager startup/shutdown
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/5db98cfea9b465d00062342d9a6b382593fbb8c1">5db98cfe</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">Suppress data race due to close
This suppresses the other side of a race during shutdown.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/65b4ddf4636614243bdd4c368611944ba891180f">65b4ddf4</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Accept benign races in Proftimer
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/4b5216f3879957c509fe4005fb54b2ed6acdf087">4b5216f3</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Pause timer while changing capability count
This avoids #17289.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/6ca8df01787fd15634911e7d51dfd582e7188ca4">6ca8df01</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">Fix #17289
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/5b89c84b3bc35f7f2ca359f449aa0b637309d48e">5b89c84b</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">suppress #17289 (ticker) race
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/0122610e18207219a30dae61accc9e95bf9051ae">0122610e</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Fix timer initialization
Previously `initScheduler` would attempt to pause the ticker and in so
doing acquire the ticker mutex. However, initTicker, which is
responsible for initializing said mutex, hadn't been called
yet.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/3bfcaf4b0fc06083e023a35f251d5bc5821c755a">3bfcaf4b</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Fix races in Pthread timer backend shudown
We can generally be pretty relaxed in the barriers here since the timer
thread is a loop.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/0a75b95065d330e315b07ecaa5de4a1f1463cb2d">0a75b950</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/Stats: Hide a few unused unnecessarily global functions
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/c1b7767f6c833a1f92fd0f55193ab09190ad31e0">c1b7767f</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts/Stats: Protect with mutex
While on face value this seems a bit heavy, I think it's far better than
enforcing ordering on every access.
</pre>
</li>
<li>
<strong><a href="https://gitlab.haskell.org/ghc/ghc/-/commit/01325b12799cc3ccd997aa20006572b132e5b799">01325b12</a></strong>
<div>
<span>by Ben Gamari</span>
<i>at 2020-11-24T13:40:35-05:00</i>
</div>
<pre class="commit-message" style="white-space: pre-wrap; margin: 0;">rts: Tear down stats_mutex after exitHeapProfiling
Since the latter wants to call getRTSStats.
</pre>
</li>
</ul>
<h4>30 changed files:</h4>
<ul>
<li class="file-stats">
<a href="#587d266bb27a4dc3022bbed44dfa19849df3044c">
.gitlab-ci.yml
</a>
</li>
<li class="file-stats">
<a href="#452d5ee18aa2b91b6486a157ecf550dc84081872">
includes/rts/OSThreads.h
</a>
</li>
<li class="file-stats">
<a href="#397950c6118f4b5a74a10249b6bcc322ab8e2e25">
includes/rts/SpinLock.h
</a>
</li>
<li class="file-stats">
<a href="#0e9120c800f0c7864f3631f8fb8d7035a4778f97">
includes/rts/StablePtr.h
</a>
</li>
<li class="file-stats">
<a href="#32b24c17e385bd15c4751ab0da5f55876fd57f51">
includes/rts/TSANUtils.h
</a>
</li>
<li class="file-stats">
<a href="#0ea78c0eb38d298692960f63f47248f6464a0479">
includes/rts/storage/Closures.h
</a>
</li>
<li class="file-stats">
<a href="#94ca41c5afbb3d932bd6f37ee16458322988fb69">
includes/rts/storage/GC.h
</a>
</li>
<li class="file-stats">
<a href="#fbe566a2918ba0562be9aceeb5d07448bf2f9ed0">
includes/stg/SMP.h
</a>
</li>
<li class="file-stats">
<a href="#e5d5c3eb2ba69f9a4ab3f56a8e9dab426c012963">
libraries/base/GHC/Event/Control.hs
</a>
</li>
<li class="file-stats">
<a href="#46661d25ba83700d4344aaa428308c552e201be8">
rts/.tsan-suppressions
</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="#a3b0919403d8f328f07cda7c4a7f9817c369357c">
rts/Proftimer.c
</a>
</li>
<li class="file-stats">
<a href="#9ed11d0519762dae04656481b089dbb5b05acf98">
rts/RtsStartup.c
</a>
</li>
<li class="file-stats">
<a href="#632a1fac336e62e26d0af2de3f023c11a62c927a">
rts/SMPClosureOps.h
</a>
</li>
<li class="file-stats">
<a href="#e137645f8a9be9fa32cc764e19cea2b492e33d9c">
rts/STM.c
</a>
</li>
<li class="file-stats">
<a href="#7d6961cb073b9fe3df3a81f0ad5cf36eed293c42">
rts/Schedule.c
</a>
</li>
<li class="file-stats">
<a href="#b1247567bf64d38ef0ee9a14575ac22983232204">
rts/Sparks.c
</a>
</li>
<li class="file-stats">
<a href="#6b4f3c89a36017ba0c8ca6c6bd086631c47406df">
<span class="new-file">
+
rts/SpinLock.c
</span>
</a>
</li>
<li class="file-stats">
<a href="#264b041893a19041ac2281341c74847243da87e3">
rts/StablePtr.c
</a>
</li>
<li class="file-stats">
<a href="#6c6e266b51f1c94d2ebf5aa2052f408397451f94">
rts/Stats.c
</a>
</li>
<li class="file-stats">
<a href="#b90c7236dd80d0ab7be1156ccd798e69994e38c6">
rts/Stats.h
</a>
</li>
<li class="file-stats">
<a href="#4b22b3f666af23f7c8097b32282abfd52fb6c342">
rts/ThreadPaused.c
</a>
</li>
<li class="file-stats">
<a href="#fd2da1c8cf8253388466e15a3258c85e18636790">
rts/Timer.c
</a>
</li>
<li class="file-stats">
<a href="#2ffbdc61d9d0e36978f07f62c00c08f33149e335">
rts/Updates.h
</a>
</li>
<li class="file-stats">
<a href="#5af0fafc777cbdedc6d56a630fc6e283715430ca">
rts/WSDeque.c
</a>
</li>
<li class="file-stats">
<a href="#88f201d58ea1c0522c70854a9a8a8dfea5f24aca">
rts/WSDeque.h
</a>
</li>
<li class="file-stats">
<a href="#8a78f03f80f0544ead476d53dd0f1db7cbd68d1b">
rts/Weak.c
</a>
</li>
<li class="file-stats">
<a href="#8d4f2f35ca75df36e543dd637c726b7578faf8be">
rts/posix/GetTime.c
</a>
</li>
<li class="file-stats">
<a href="#cc73d9e9eaa9bba27d82a52a4c9ad6e125643836">
rts/posix/OSThreads.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: #666;">
—
<br>
<a href="https://gitlab.haskell.org/ghc/ghc/-/compare/0b4a532a1ce8a02afa5f9eb3672ca86f0ea36c6f...01325b12799cc3ccd997aa20006572b132e5b799">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>