HORIZON HASKELLDocslts/ghc-9.14.x99ffbb82026-10-19Search packagesCtrl K
Theme: |

GHC 9.14.1 · lts/ghc-9.14.x · 99ffbb8 · 2026-10-19

Moduletime-manager-0.4.0Haskell2010

System.ThreadManager

A thread manager including a time manager. The manager has responsibility to kill managed threads.

Because this is based on the accompanying System.TimeManager module, the same caveats apply:

  • Only works for GHC.

  • Only works with a threaded runtime.

  • Users of older versions should check the current semantics.

  • Using 32-bit systems means the max timeout is maxBound :: Int (2147483647) microseconds, which is less than 36 minutes.

  • Using the same Handle in different threads might cause issues in some edge cases. (i.e. using cancel/pause in one thread, and resume in another)

Contents
  1. Fork
  2. Synchronization
  3. Re-exports
Synopsis
valuestopAfter :: ThreadManager -> IO a -> (Maybe SomeException -> IO ()) -> IO a

Stopping the manager.

stopAfter threadManager action cleanup

The action is run in the scope of an exception handler that catches all exceptions (including asynchronous ones); this allows the cleanup handler to cleanup in all circumstances. If an exception is caught, it is rethrown after the cleanup is complete.

Fork

valueforkManaged
  1. :: ThreadManager
  2. -> String

    Thread name

  3. -> IO ()

    Action

  4. -> IO ()

Fork a managed thread.

This guarantees that the thread ID is added to the manager's queue before the thread starts, and is removed again when the thread terminates (normally or abnormally).

Synchronization

Re-exports

valuetickle :: Handle -> IO ()

Extending the timeout.

To keep frequent callers cheap, the renewal is rate-limited: it is skipped unless at least a quarter of the timeout (capped at one second) has passed since the timeout was last registered or updated.

Careful: this does NOT reactivate an already paused Handle!

WARNING for Windows users: the precision of extending timeouts is only full "seconds". The provided microseconds will be floored to the first full second. (i.e. initialize 2_500_000 will get extended by 2 seconds on a tickle) This also means timeouts of less than one second will not be extended when using tickle.

valuepause :: Handle -> IO ()

Pauses the timeout so you can resume it later. Does not stop it entirely. Use cancel if you want to make sure the action will not be resumed.

To resume a timeout with the same Handle, resume MUST be called. Don't call tickle for resumption.