Skip to content
Snippets Groups Projects
  1. Apr 03, 2024
    • Duncan Coutts's avatar
      Accept changes to base-exports · 1adc6fa4
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      All the changes are in fact not changes at all.
      
      Previously, the IoSubSystem data type was defined in GHC.RTS.Flags and
      exported from both GHC.RTS.Flags and GHC.IO.SubSystem. Now, the data
      type is defined in GHC.IO.SubSystem and still exported from both
      modules.
      
      Therefore, the same exports and same instances are still available from
      both modules. But the base-exports records only the defining module, and
      so it looks like a change when it is fully compatible.
      
      Related: we do add a deprecation to the export of the type via
      GHC.RTS.Flags, telling people to use the export from GHC.IO.SubSystem.
      
      Also the sort order for some unrelated Show instances changed. No idea
      why.
      
      The same changes apply in the other versions, with a few more changes
      due to sort order weirdness.
      1adc6fa4
    • Duncan Coutts's avatar
      Conditionally ignore some GCC warnings · 83a74d20
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Some GCC versions don't know about some warnings, and they complain
      that we're ignoring unknown warnings. So we try to ignore the warning
      based on the GCC version.
      83a74d20
    • Duncan Coutts's avatar
      waitRead# / waitWrite# do not work for win32-legacy I/O manager · 8023bad4
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Previously it was unclear that they did not work because the code path
      was shared with other I/O managers (in particular select()).
      
      Following the code carefully shows that what actually happens is that
      the calling thread would block forever: the thread will be put into the
      blocked queue, but no other action is scheduled that will ever result in
      it getting unblocked.
      
      It's better to just fail loudly in case anyone accidentally calls it,
      also it's less confusing code.
      8023bad4
    • Duncan Coutts's avatar
      Include the default I/O manager in the +RTS --info output · c7d3e3a3
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Document the extra +RTS --info output in the user guide
      c7d3e3a3
    • Duncan Coutts's avatar
      Add tracing for the main I/O manager actions · 9c51473b
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      
      Using the new tracer class.
      
      Note: The unconditional definition of showIOManager should be
      compatible with the debugTrace change in 7c7d1f66.
      
      Co-authored-by: default avatarPi Delport <pi@well-typed.com>
      9c51473b
    • Duncan Coutts's avatar
      The select() I/O manager does have some global initialisation · 877a2a80
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      It's just to make sure an exception CAF is a GC root.
      877a2a80
    • Duncan Coutts's avatar
      Make struct CapIOManager be fully opaque · aaa294d0
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Provide an opaque (forward) definition in Capability.h (since the cap
      contains a *CapIOManager) and then only provide a full definition in
      a new file IOManagerInternals.h. This new file is only supposed to be
      included by the IOManager implementation, not by its users. So that
      means IOManager.c and individual I/O manager implementations.
      
      The posix/Signals.c still needs direct access, but that should be
      eliminated. Anything that needs direct access either needs to be clearly
      part of an I/O manager (e.g. the sleect() one) or go via a proper API.
      aaa294d0
    • Duncan Coutts's avatar
      Select an I/O manager early in RTS startup · 3be6d591
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      We need to select the I/O manager to use during startup before the
      per-cap I/O manager initialisation.
      3be6d591
    • Duncan Coutts's avatar
      Add I/O manager API notifyIOManagerCapabilitiesChanged · 94a87d21
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Used in setNumCapabilities.
      
      It only does anything for MIO on Posix.
      
      Previously it always invoked Haskell code, but that code only did
      anything on non-Windows (and non-JS), and only threaded. That currently
      effectively means the MIO I/O manager on Posix.
      
      So now it only invokes it for the MIO Posix case.
      94a87d21
    • Duncan Coutts's avatar
      Add an IOManager API for scavenging TSO blocked_info · 4161f516
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      When the GC scavenges a TSO it needs to scavenge the tso->blocked_info
      but the blocked_info is a big union and what lives there depends on the
      two->why_blocked, which for I/O-related reasons is something that in
      principle is the responsibility of the I/O manager and not the GC. So
      the right thing to do is for the GC to ask the I/O manager to sscavenge
      the blocked_info if it encounters any I/O-related why_blocked reasons.
      
      So we add scavengeTSOIOManager in IOManager.{h,c} with the usual style.
      
      Now as it happens, right now, there is no special scavenging to do, so
      the implementation of scavengeTSOIOManager is a fancy no-op. That's
      because the select I/O manager uses only the fd and target members,
      which are not GC pointers, and the win32-legacy I/O manager _ought_ to
      be using GC-managed heap objects for the StgAsyncIOResult but it is
      actually usingthe C heap, so again no GC pointers. If the win32-legacy
      were doing this more sensibly, then scavengeTSOIOManager would be the
      right place to do the GC magic.
      
      Future I/O managers will need GC heap objects in the tso->blocked_info
      and will make use of this functionality.
      4161f516
    • Duncan Coutts's avatar
      Tidy up a couple things in Select.{h,c} · d30c6bc6
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Use the standard #include {Begin,End}Private.h style rather than
      RTS_PRIVATE on individual decls.
      
      And conditionally build the code for the select I/O manager based on
      the new CPP IOMGR_ENABLED_SELECT rather than on THREADED_RTS.
      d30c6bc6
    • Duncan Coutts's avatar
      Rename awaitEvent in select and win32 I/O managers · 5ad4b30f
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      These are now just called from IOManager.c and are the per-I/O manager
      backend impls (whereas previously awaitEvent was the entry point).
      
      Follow the new naming convention in the IOManager.{h,c} of
      awaitCompletedTimeoutsOrIO, with the I/O manager's name as a suffix:
      so awaitCompletedTimeoutsOrIO{Select,Win32}.
      5ad4b30f
    • Duncan Coutts's avatar
      Move awaitEvent into a proper IOManager API · 4f9e9c4e
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      and have the scheduler use it.
      
      Previously the scheduler calls awaitEvent directly, and awaitEvent is
      implemented directly in the RTS I/O managers (select, win32). This
      relies on the old scheme where there's a single active I/O manager for
      each platform and RTS way.
      
      We want to move that to go via an API in IOManager.{h,c} which can then
      call out to the active I/O manager.
      
      Also take the opportunity to split awaitEvent into two. The existing
      awaitEvent has a bool wait parameter, to say if the call should be
      blocking or non-blocking. We split this into two separate functions:
      pollCompletedTimeoutsOrIO and awaitCompletedTimeoutsOrIO. We split them
      for a few reasons: they have different post-conditions (specifically the
      await version is supposed to guarantee that there are threads runnable
      when it completes). Secondly, it is also anticipated that in future I/O
      managers the implementations of the two cases will be simpler if they
      are separated.
      4f9e9c4e
    • Duncan Coutts's avatar
      Have the throwTo impl go via (new) IOManager APIs · f0c1f862
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      rather than directly operating on the IO manager's data structures.
      
      Specifically, when thowing an async exception to a thread that is
      blocked waiting for I/O or waiting for a timer, then we want to cancel
      that I/O waiting or cancel the timer. Currently this is done directly in
      removeFromQueues() in RaiseAsync.c. We want it to go via proper APIs
      both for modularity but also to let us support multiple I/O managers.
      
      So add sync{IO,Delay}Cancel, which is the cancellation for the
      corresponding sync{IO,Delay}. The implementations of these use the usual
      "switch (iomgr_type)" style.
      f0c1f862
    • Duncan Coutts's avatar
      Add a new trace class for the iomanager · b48805b9
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      It makes sense now for it to be separate from the scheduler class of
      tracers.
      
      Enabled with +RTS -Do. Document the -Do debug flag in the user guide.
      b48805b9
    • Duncan Coutts's avatar
      Take a simpler approach to gcc warnings in IOManager.c · f70b8108
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      We have lots of functions with conditional implementations for
      different I/O managers. Some functions, for some I/O managers,
      naturally have implementations that do nothing or barf. When only one
      such I/O manager is enabled then the whole function implementation will
      have an implementation that does nothing or barfs. This then results in
      warnings from gcc that parameters are unused, or that the function
      should be marked with attribute noreturn (since barf does not return).
      The USED_IF_THREADS trick for fine-grained warning supression is fine
      for just two cases, but an equivalent here would need
      USED_IF_THE_ONLY_ENABLED_IOMGR_IS_X_OR_Y which would have combinitorial
      blowup. So we take a coarse grained approach and simply disable these
      two warnings for the whole file.
      
      So we use a GCC pragma, with its handy push/pop support:
      
       #pragma GCC diagnostic push
       #pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"
       #pragma GCC diagnostic ignored "-Wunused-parameter"
      
      ...
      
       #pragma GCC diagnostic pop
      f70b8108
    • Duncan Coutts's avatar
      Move anyPendingTimeoutsOrIO impl from .h to .c · 60ce9910
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      The implementation is eventually going to need to use more private
      things, which will drag in unwanted includes into IOManager.h, so it's
      better to move the impl out of the header file and into the .c file, at
      the slight cost of it no longer being inline.
      
      At the same time, change to the "switch (iomgr_type)" style.
      60ce9910
    • Duncan Coutts's avatar
      insertIntoSleepingQueue is no longer public · e93058e0
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      No longer defined in IOManager.h, just a private function in
      IOManager.c. Since it is no longer called from cmm code, just from
      syncDelay. It ought to get moved further into the select() I/O manager
      impl, rather than living in IOManager.c.
      
      On the other hand appendToIOBlockedQueue is still called from cmm code
      in the win32-legacy I/O manager primops async{Read,Write}#, and it is
      also used by the select() I/O manager. Update the CPP and comments to
      reflect this.
      e93058e0
    • Duncan Coutts's avatar
      Move most of the delay# impl from cmm to C · 457705a8
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Moves it into the IOManager.c where we can follow the new pattern of
      switching on the selected I/O manager.
      
      Uses a new IOManager API: syncDelay, following the naming convention of
      sync* for thread-synchronous I/O & timer/delay operations.
      
      As part of porting from cmm to C, we maintain the rule that the
      why_blocked gets accessed using load acquire and store release atomic
      memory operations. There was one exception to this rule: in the delay#
      primop cmm code on posix (not win32), the why_blocked was being updated
      using a store relaxed, not a store release. I've no idea why. In this
      convesion I'm playing it safe here and using store release consistently.
      457705a8
    • Duncan Coutts's avatar
      Move most of waitRead#/Write# from cmm to C · c2f26f36
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Moves it into the IOManager.c where we can follow the new pattern of
      switching on the selected I/O manager.
      c2f26f36
    • Duncan Coutts's avatar
      Convert initIOManagerAfterFork and wakeupIOManager to switch style · 1d36e609
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      1d36e609
    • Duncan Coutts's avatar
      Split up the CapIOManager content by I/O manager · a5bad3d2
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Using the new IOMGR_ENABLED_<name> CPP defines.
      a5bad3d2
    • Duncan Coutts's avatar
      Convert {init,stop,exit}IOManager to switch style · 1a8f020f
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Rather than ad-hoc cpp conitionals on THREADED_RTS and mingw32_HOST_OS,
      we use a style where we switch on the I/O manager impl, with cases for
      each I/O manager impl.
      1a8f020f
    • Duncan Coutts's avatar
      Change the handling of the RTS flag --io-manager= · 85b0f87a
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      Now instead of it being just used on Windows to select between the WinIO
      vs the MIO or Win32-legacy I/O managers, it is now used on all platforms
      for selecting the I/O manager to use.
      
      Right now it remains the case that there is only an actual choice on
      Windows, but that will change later.
      
      Document the --io-manager flag in the user guide.
      
      This change is also reflected in the RTS flags types in the base
      library. Deprecate the export of IoSubSystem from GHC.RTS.Flags with a
      message to import it from GHC.IO.Subsystem.
      
      The way the 'IoSubSystem' is detected also changes. Instead of looking
      at the RTS flag, there is now a C bool global var in the RTS which gets
      set on startup when the I/O manager is selected. This bool var says
      whether the selected I/O manager classifies as "native" on Windows,
      which in practice means the WinIO I/O manager has been selected.
      
      Similarly, the is_io_mng_native_p RTS helper function is re-implemented
      in terms of the selected I/O manager, rather than based on the RTS
      flags.
      
      We do however remove the ./configure --native-io-manager flag because
      we're bringing the WinIO/MIO/Win32-legacy choice under the new general
      scheme for selecting I/O managers, and that new scheme involves no
      ./configure time user choices, just runtime RTS flag choices.
      85b0f87a
    • Duncan Coutts's avatar
      Initial ./configure support for selecting I/O managers · 15f4d867
      Duncan Coutts authored and Marge Bot's avatar Marge Bot committed
      
      In this patch we just define new CPP vars, but don't yet use them
      or replace the existing approach. That will follow.
      
      The intention here is that every I/O manager can be enabled/disabled at
      GHC build time (subject to some constraints). More than one I/O manager
      can be enabled to be built. At least one I/O manager supporting the
      non-threaded RTS must be enabled as well as at least one supporting the
      non-threaded RTS. The I/O managers enabled here will become the choices
      available at runtime at RTS startup (in later patches). The choice can
      be made with RTS flags. There are separate sets of choices for the
      threaded and non-threaded RTS ways, because most I/O managers are
      specific to these ways. Furthermore we must establish a default I/O
      manager for the threaded and non-threaded RTS.
      
      Most I/O managers are platform-specific so there are checks to ensure
      each one can be enabled on the platform. Such checks are also where (in
      future) any system dependencies (e.g. libraries) can be checked.
      
      The output is a set of CPP flags (in the mk/config.h file), with one
      flag per named I/O manager:
      * IOMGR_BUILD_<name>                : which ones should be built (some)
      * IOMGR_DEFAULT_NON_THREADED_<name> : which one is default (exactly one)
      * IOMGR_DEFAULT_THREADED_<name>     : which one is default (exactly one)
      
      and a set of derived flags in IOManager.h
      
      * IOMGR_ENABLED_<name>              : enabled for the current RTS way
      
      Note that IOMGR_BUILD_<name> just says that an I/O manager will be
      built for _some_ RTS way (i.e. threaded or non-threaded). The derived
      flags IOMGR_ENABLED_<name> in IOManager.h say if each I/O manager is
      enabled in the "current" RTS way. These are the ones that can be used
      for conditional compilation of the I/O manager code.
      
      Co-authored-by: default avatarPi Delport <pi@well-typed.com>
      15f4d867
    • Simon Peyton Jones's avatar
      Try using MCoercion in exprIsConApp_maybe · e0b0c717
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      This is just a simple refactor that makes exprIsConApp_maybe
      a little bit more direct, simple, and efficient.
      
      Metrics: compile_time/bytes allocated
          geo. mean                                          -0.1%
          minimum                                            -2.0%
          maximum                                            -0.0%
      
      Not a big gain, but worthwhile given that the code is, if anything,
      easier to grok.
      e0b0c717
    • Simon Peyton Jones's avatar
      Deal with duplicate tyvars in type declarations · faa30b41
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      GHC was outright crashing before this fix: #24604
      faa30b41
    • Sylvain Henry's avatar
      JS: fix h$appendToHsString implementation (#24495) · 527616e9
      Sylvain Henry authored and Marge Bot's avatar Marge Bot committed
      h$appendToHsString needs to wrap its argument in an updatable thunk
      to behave like unpackAppendCString#. Otherwise if a SingleEntry thunk is
      passed, it is stored as-is in a CONS cell, making the resulting list
      impossible to deepseq (forcing the thunk doesn't update the contents of
      the CONS cell)!
      
      The added test checks that the optimization kicks in and that
      h$appendToHsString works as intended.
      
      Fix #24495
      527616e9
    • Sylvain Henry's avatar
      JS: reenable h$appendToHsString optimization (#24495) · b36ee57b
      Sylvain Henry authored and Marge Bot's avatar Marge Bot committed
      The optimization introducing h$appendToHsString wasn't kicking in
      anymore (while it did in 9.8.1) because of the changes introduced in #23270 (7e0c8b3b).
      This patch reenables the optimization by matching on case-expression, as
      done in Cmm for unpackCString# standard thunks.
      
      The test is also T24495 added in the next commits (two commits for ease
      of backporting to 9.8).
      b36ee57b
    • Rodrigo Mesquita's avatar
      th: Hide the Language.Haskell.TH.Lib.Internal module from haddock · 817e8936
      Rodrigo Mesquita authored and Marge Bot's avatar Marge Bot committed
      Fixes #24562
      817e8936
  2. Apr 02, 2024
    • Andrei Borzenkov's avatar
      Merge tc_infer_hs_type and tc_hs_type into one function using ExpType philosophy (#24299, #23639) · a1c18c7b
      Andrei Borzenkov authored and Marge Bot's avatar Marge Bot committed
      This patch implements refactoring which is a prerequisite to
      updating kind checking of type patterns. This is a huge simplification
      of the main worker that checks kind of HsType.
      
      It also fixes the issues caused by previous code duplication, e.g.
      that we didn't add module finalizers from splices in inference mode.
      a1c18c7b
    • Cheng Shao's avatar
      ci: improve TSAN CI jobs · 07cb627c
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      - Run TSAN jobs with +thread_sanitizer_cmm which enables Cmm
        instrumentation as well.
      - Run TSAN jobs in deb12 which ships gcc-12, a reasonably recent gcc
        that @bgamari confirms he's using in #GHC:matrix.org. Ideally we
        should be using latest clang release for latest improvements in
        sanitizers, though that's left as future work.
      - Mark TSAN jobs as manual+allow_failure in validate pipelines. The
        purpose is to demonstrate that we have indeed at least fixed
        building of TSAN mode in CI without blocking the patch to land, and
        once merged other people can begin playing with TSAN using their own
        dev setups and feature branches.
      07cb627c
    • Cheng Shao's avatar
      compiler: fix github link to __tsan_memory_order in a comment · 865bd717
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      865bd717
    • Cheng Shao's avatar
      rts: fix clang-specific errors when compiling with TSAN · a9ab9455
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      This commit fixes clang-specific rts compilation errors when compiling
      with TSAN:
      
      - clang doesn't have -Wtsan flag
      - Fix prototype of ghc_tsan_* helper functions
      - __tsan_atomic_* functions aren't clang built-ins and
        sanitizer/tsan_interface_atomic.h needs to be included
      - On macOS, TSAN runtime library is
        libclang_rt.tsan_osx_dynamic.dylib, not libtsan. -fsanitize-thread
        as a link-time flag will take care of linking the TSAN runtime
        library anyway so remove tsan as an rts extra library
      a9ab9455
    • Cheng Shao's avatar
      rts: fix errors when compiling with TSAN · e91dad93
      Cheng Shao authored and Marge Bot's avatar Marge Bot committed
      This commit fixes rts compilation errors when compiling with TSAN:
      
      - xxx_FENCE macros are redefined and trigger CPP warnings.
      - Use SIZEOF_W. WORD_SIZE_IN_BITS is provided by MachDeps.h which
        Cmm.h doesn't include by default.
      e91dad93
    • Ben Gamari's avatar
      rts: Fix TSAN_ENABLED CPP guard · c8a4c050
      Ben Gamari authored and Marge Bot's avatar Marge Bot committed
      This should be `#if defined(TSAN_ENABLED)`, not `#if TSAN_ENABLED`,
      lest we suffer warnings.
      c8a4c050
  3. Apr 01, 2024
  4. Mar 29, 2024
  5. Mar 27, 2024
Loading