/* ----------------------------------------------------------------------------- * * (c) The GHC Team 1998-2020 * * Prototypes for functions in IOManager.c and elsewhere * * Hooks for the I/O subsystem(s) that are called from other parts of the RTS. * * There are several different I/O subsystem implementations (aka I/O managers), * for different platforms (notably Windows vs others), and for the threaded vs * non-threaded RTS. These implementations all need hooks into other parts of * the RTS, such as startup/shutdown, the scheduler and other special features. * * To keep things comprehensible, all the hooks used by all the different I/O * subsystem implementations are centralised here. Not all implementations use * all hooks. * * -------------------------------------------------------------------------*/ #pragma once #include "BeginPrivate.h" /* Init hook: called from hs_init_ghc. */ void initIOManager(void); /* Init hook: called from forkProcess in the child process on the surviving * capability. * * Note that this is synchronous and can run Haskell code, so can change the * given cap. */ void initIOManagerAfterFork(/* inout */ Capability **pcap); /* TODO: rationalise initIOManager and initIOManagerAfterFork into a single per-capability init function. */ /* Shutdown hooks: called from hs_exit_ before and after the scheduler exits. * * The stopIOManager is also called many times (once per-capability) within the * scheduler shutdown (but only in threaded mode). This is despite the fact that * stopIOManager shuts down the I/O manager for all capabilities. * FIXME: this is accidentally quadratic and confusing. */ void stopIOManager(void); void exitIOManager(bool wait_threads); /* Wakeup hook: called from the scheduler's wakeUpRts (currently only in * threaded mode). * * The I/O manager can be blocked waiting on I/O or timers. Sometimes there are * other external events where we need to wake up the I/O manager and return * to the schedulr. * * At the moment, all the non-threaded I/O managers will do this automagically * since a signal will interrupt any waiting system calls, so at the moment * the implementation for the non-threaded I/O managers does nothing. * * For the I/O managers in threaded mode, this arranges to unblock the I/O * manager if it waa blocked waiting. */ void wakeupIOManager(void); /* Pedantic warning cleanliness */ #if !defined(THREADED_RTS) && defined(mingw32_HOST_OS) #define USED_IF_NOT_THREADS_AND_MINGW32 #else #define USED_IF_NOT_THREADS_AND_MINGW32 STG_UNUSED #endif #if defined(THREADED_RTS) && !defined(mingw32_HOST_OS) #define USED_IF_THREADS_AND_NOT_MINGW32 #else #define USED_IF_THREADS_AND_NOT_MINGW32 STG_UNUSED #endif #include "EndPrivate.h"