Skip to content
Snippets Groups Projects
  1. Dec 20, 2023
    • Ben Gamari's avatar
      Fix thunk update ordering · 9a52ae46
      Ben Gamari authored and Marge Bot's avatar Marge Bot committed
      Previously we attempted to ensure soundness of concurrent thunk update
      by synchronizing on the access of the thunk's info table pointer field.
      This was believed to be sufficient since the indirectee (which may
      expose a closure allocated by another core) would not be examined
      until the info table pointer update is complete.
      
      However, it turns out that this can result in data races in the presence
      of multiple threads racing a update a single thunk. For instance,
      consider this interleaving under the old scheme:
      
                  Thread A                             Thread B
                  ---------                            ---------
          t=0     Enter t
            1     Push update frame
            2     Begin evaluation
      
            4     Pause thread
            5     t.indirectee=tso
            6     Release t.info=BLACKHOLE
      
            7     ... (e.g. GC)
      
            8     Resume thread
            9     Finish evaluation
            10    Relaxed t.indirectee=x
      
            11                                         Load t.info
            12  ...
      9a52ae46
  2. Dec 15, 2023
  3. Dec 14, 2023
  4. Dec 13, 2023
  5. Dec 12, 2023
  6. Dec 11, 2023
    • Arnaud Spiwack's avatar
      Linear let and where bindings · 8e0446df
      Arnaud Spiwack authored
      For expediency, the initial implementation of linear types in GHC
      made it so that let and where binders would always be considered
      unrestricted. This was rather unpleasant, and probably a big obstacle
      to adoption. At any rate, this was not how the proposal was designed.
      
      This patch fixes this infelicity. It was surprisingly difficult to
      build, which explains, in part, why it took so long to materialise.
      
      As of this patch, let or where bindings marked with %1 will be
      linear (respectively %p for an arbitrary multiplicity p). Unmarked let
      will infer their multiplicity.
      
      Here is a prototypical example of program that used to be rejected and
      is accepted with this patch:
      
      ```haskell
      f :: A %1 -> B
      g :: B %1 -> C
      
      h :: A %1 -> C
      h x = g y
        where
          y = f x
      ```
      
      Exceptions:
      - Recursive let are unrestricted, as there isn't a clear semantics of
        what a linear recursive binding would be.
      - Destructive lets with lazy bindings are unrestricted, as their
        desugaring isn't linear (see also #23461).
      - (Strict) destructive lets with inferred polymorphic type are
        unrestricted. Because the desugaring isn't linear (See #18461
        down-thread).
      
      Closes #18461 and #18739
      
      Co-authored-by: @jackohughes
      8e0446df
    • Arnaud Spiwack's avatar
      LinearTypes => MonoLocalBinds · 188b280d
      Arnaud Spiwack authored
      188b280d
    • Zubin's avatar
      compiler: Force IfGlobalRdrEnv in NFData instance. · 522c12a4
      Zubin authored and Marge Bot's avatar Marge Bot committed
      522c12a4
    • Zubin's avatar
      compiler: Add some strictness annotations to ImportSpec and related constructors · e822ff88
      Zubin authored and Marge Bot's avatar Marge Bot committed
      This prevents us from retaining entire HscEnvs.
      
      Force these ImportSpecs when forcing the GlobalRdrEltX
      
      Adds an NFData instance for Bag
      
      Fixes #24107
      e822ff88
    • Zubin's avatar
      testsuite: add test for #24118 and #24107 · 105c370c
      Zubin authored and Marge Bot's avatar Marge Bot committed
      MultiLayerModulesDefsGhci was not able to catch the leak because it uses
      :l which discards the previous environment.
      
      Using :r catches both of these leaks
      105c370c
    • Zubin's avatar
      driver: Ensure we force the lookup of old build artifacts before returning the build plan · 8e5745a0
      Zubin authored and Marge Bot's avatar Marge Bot committed
      This prevents us from retaining all previous build artifacts in memory until a
      recompile finishes, instead only retaining the exact artifacts we need.
      
      Fixes #24118
      8e5745a0
    • Zubin's avatar
      driver: Ensure we actually clear the interactive context before reloading · 58d56644
      Zubin authored and Marge Bot's avatar Marge Bot committed
      Previously we called discardIC, but immediately after set the session
      back to an old HscEnv that still contained the IC
      
      Partially addresses #24107
      Fixes #23405
      58d56644
    • Vladislav Zavialov's avatar
      Make forall a keyword (#23719) · d9e4c597
      Vladislav Zavialov authored and Marge Bot's avatar Marge Bot committed
      Before this change, GHC used to accept `forall` as a term-level
      identifier:
      
      	-- from constraints-0.13
      	forall :: forall p. (forall a. Dict (p a)) -> Dict (Forall p)
      	forall d = ...
      
      Now it is a parse error.
      
      The -Wforall-identifier warning has served its purpose and is now
      a deprecated no-op.
      d9e4c597
  7. Dec 08, 2023
  8. Dec 06, 2023
Loading