Skip to content

Update semaphore-compat to 2.0.0.0 to fix #9993#11628

Open
wz1000 wants to merge 1 commit into
haskell:masterfrom
wz1000:wip/semaphore-v2
Open

Update semaphore-compat to 2.0.0.0 to fix #9993#11628
wz1000 wants to merge 1 commit into
haskell:masterfrom
wz1000:wip/semaphore-v2

Conversation

@wz1000
Copy link
Copy Markdown
Contributor

@wz1000 wz1000 commented Mar 17, 2026

Update to semaphore-compat 2.0.0 fixing #9993 and https://gitlab.haskell.org/ghc/ghc/-/issues/25087

semaphore-compat now uses a unix sockets based implementation.

Semaphore identifiers are now versioned, and we can really on the versioning
scheme to detect semaphore version mismatch with GHC and fallback gracefully if
possible.

GHC patch: https://gitlab.haskell.org/ghc/ghc/-/merge_requests/15729

After the GHC patch lands, it will include a "Semaphore version" field in its
settings file/--info output that we can use to guide Cabal behaviour.

If this field does not exist (and ghc is 9.8+), then we assume it uses version v1 of the protocol
and this triggers a graceful degradation of behaviour to -jN without semaphore based coordination.

See also

semaphore-compat MR: https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8
ghc-proposals change: ghc-proposals/ghc-proposals#673

Comment thread cabal.project Outdated
@wz1000 wz1000 force-pushed the wip/semaphore-v2 branch 3 times, most recently from 67769ee to 98685dd Compare March 19, 2026 04:30
Comment thread changelog.d/semaphore-version-compat.md Outdated
Comment thread Cabal/src/Distribution/Simple/Compiler.hs Outdated
Comment thread cabal-install/src/Distribution/Client/JobControl.hs Outdated
Comment thread cabal-install/src/Distribution/Client/JobControl.hs Outdated
Comment thread changelog.d/semaphore-version-compat.md Outdated
@Mikolaj
Copy link
Copy Markdown
Member

Mikolaj commented Apr 9, 2026

Is this needed for GHC 10 and so for Cabal 3.18? If so, how can we get this merged now?

@wz1000 wz1000 force-pushed the wip/semaphore-v2 branch 4 times, most recently from cea0774 to 2758155 Compare May 12, 2026 11:55
bgamari pushed a commit to ghc/ghc that referenced this pull request May 13, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
@wz1000 wz1000 force-pushed the wip/semaphore-v2 branch from 2758155 to 067e12c Compare May 13, 2026 13:01
bgamari pushed a commit to ghc/ghc that referenced this pull request May 19, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
@wz1000 wz1000 force-pushed the wip/semaphore-v2 branch 2 times, most recently from d49fb8c to ee96ef5 Compare May 19, 2026 09:05
bgamari pushed a commit to ghc/ghc that referenced this pull request May 19, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 19, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
Copy link
Copy Markdown
Collaborator

@sheaf sheaf left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this looks good.

Personally I would like to avoid the "normal parallelism control" phrasing (that predates this PR) as I think we can be more specific about what we are falling back to, but that's just a nitpick.

bgamari pushed a commit to ghc/ghc that referenced this pull request May 19, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 19, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
@philderbeast
Copy link
Copy Markdown
Collaborator

Could we move forward on this? I recently did a cabal install cabal-install:exe:cabal --overwrite-policy=always from the master branch (in the past week or two) to check behaviour between the master branch and some other branch (can't remember which) and I'm hitting the #9993 issue often. I'm using the following as a build check:

$ cabal build all --enable-tests --enable-benchmarks -j --semaphore --ghc-options="-Werror"

bgamari pushed a commit to ghc/ghc that referenced this pull request May 21, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
@wz1000 wz1000 force-pushed the wip/semaphore-v2 branch 2 times, most recently from d564a18 to 1e9c8ae Compare May 21, 2026 13:27
@wz1000
Copy link
Copy Markdown
Contributor Author

wz1000 commented May 21, 2026

https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8 has been merged, which took longer than expected. I will try to merge the GHC MR tomorrow, and then this should be unblocked for merging.

@sheaf
Copy link
Copy Markdown
Collaborator

sheaf commented May 21, 2026

Could we move forward on this? I recently did a cabal install cabal-install:exe:cabal --overwrite-policy=always from the master branch (in the past week or two) to check behaviour between the master branch and some other branch (can't remember which) and I'm hitting the #9993 issue often.

@philderbeast I don't think that's related. In this PR we are fixing the situation in which GHC and Cabal were linked against different C standard libraries which have incompatible implementations of POSIX semaphores.

If you are running into another issue and are able to provide a reproducer, please open a ticket and I will investigate it.

@wz1000 wz1000 force-pushed the wip/semaphore-v2 branch from 1e9c8ae to b8817fb Compare May 21, 2026 14:00
bgamari pushed a commit to ghc/ghc that referenced this pull request May 21, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 22, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
@wz1000 wz1000 force-pushed the wip/semaphore-v2 branch 2 times, most recently from 0751d73 to 02ae51d Compare May 22, 2026 05:00
bgamari pushed a commit to ghc/ghc that referenced this pull request May 22, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 22, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 22, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 25, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 25, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 25, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
@wz1000 wz1000 force-pushed the wip/semaphore-v2 branch 3 times, most recently from eb272bf to 88784cc Compare May 25, 2026 11:16
…ab.haskell.org/ghc/ghc/-/issues/25087

Also update index-state and bootstrap plans to pull in new version of semaphore-compat.

semaphore-compat now uses a unix sockets based implementation.

Semaphore identifiers are now versioned, and we can really on the versioning
scheme to detect semaphore version mismatch with GHC and fallback gracefully if
possible.

GHC patch: https://gitlab.haskell.org/ghc/ghc/-/merge_requests/15729

After the GHC patch lands, it will include a "Semaphore version" field in its
settings file/`--info` output that we can use to guide Cabal behaviour.

If this field does not exist (and ghc is 9.8+), then we assume it uses version v1 of the protocol
and this triggers a graceful degradation of behaviour to `-jN` without semaphore based coordination.

See also

semaphore-compat MR: https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

ghc-proposals change: ghc-proposals/ghc-proposals#673
@wz1000 wz1000 force-pushed the wip/semaphore-v2 branch from 88784cc to 96ccd50 Compare May 25, 2026 11:43
@wz1000 wz1000 dismissed geekosaur’s stale review May 25, 2026 12:14

source-repository-package has been removed.

@wz1000
Copy link
Copy Markdown
Contributor Author

wz1000 commented May 25, 2026

This patch should be ready to merge.

semaphore-compat-2.0.0 is now released and the GHC MR upgrading to sempahore-compat-2.0.0 is in the merge queue. We plan to backport the GHC MR to GHC 9.10.4, 9.12.5, 9.14.2 and 10.0.1. cabal-install releases without these changes will have builds degrading to reduced parallelism with --semaphore on these and later releases, so it would be good to have these changes included in the next release.

@Mikolaj Mikolaj added the merge me Tell Mergify Bot to merge label May 25, 2026
@mergify mergify Bot added the ready and waiting Mergify is waiting out the cooldown period label May 25, 2026
bgamari pushed a commit to ghc/ghc that referenced this pull request May 26, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 26, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253
bgamari pushed a commit to ghc/ghc that referenced this pull request May 26, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253

(cherry picked from commit 8db331a)
bgamari pushed a commit to ghc/ghc that referenced this pull request May 26, 2026
On Linux and other POSIX platforms, GHC's -jsem jobserver client now
speaks v2 of the semaphore-compat protocol, which uses Unix domain
sockets in place of POSIX named semaphores. This avoids the libc-ABI
issues that affected the old implementation. Windows is unaffected
and continues to use the v1 protocol (Win32 named semaphores); its
reported protocol version remains v1.

When GHC receives a -jsem name whose protocol version it does not
support, it emits a -Wsemaphore-version-mismatch warning and falls
back to -j<N> rather than crashing. ghc --info exposes the supported
version in a new "Semaphore version" entry so cabal-install can detect
a mismatch before invoking GHC.

Users on a cabal-install that predates the v2 update will continue to
build successfully on Linux/POSIX, but will lose the cross-process
-jsem coordination and fall back to -j<N> per GHC invocation. Users
must upgrade to a cabal-install that supports protocol v2 to recover
full parallelism.

Also fix a leak in cleanupSem (#27253): cleanupSem used to snapshot
heldTokens and release them before killing the loop, while the loop's
in-flight acquire/release children could still be mutating it.
Cleanup now runs inside the loop's own exit handler, after draining
the active child via a new activeChild TVar, so the snapshot has no
concurrent mutator.

See also:
  - GHC proposal amendment:  ghc-proposals/ghc-proposals#673
  - cabal-install patch:     haskell/cabal#11628
  - semaphore-compat MR:     https://gitlab.haskell.org/ghc/semaphore-compat/-/merge_requests/8

Bump semaphore-compat submodule to 2.0.0

Fixes #25087 and #27253

(cherry picked from commit 8db331a)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge me Tell Mergify Bot to merge ready and waiting Mergify is waiting out the cooldown period

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants