diff --git a/rts/IOManager.c b/rts/IOManager.c index 894a12cf4276d9cae47f8ac16a7733cc5d6652e0..04222af8fc7a16fead15baf90f280fe80b61a69d 100644 --- a/rts/IOManager.c +++ b/rts/IOManager.c @@ -20,6 +20,7 @@ #include "IOManager.h" // RTS internal #include "Capability.h" #include "Schedule.h" +#include "Prelude.h" #include "RtsFlags.h" #include "RtsUtils.h" #include "sm/Evac.h" @@ -296,8 +297,15 @@ void initIOManager(void) switch (iomgr_type) { - /* The IO_MANAGER_SELECT needs no global initialisation */ - +#if defined(IOMGR_ENABLED_SELECT) + case IO_MANAGER_SELECT: + /* Make the exception CAF a GC root. See initBuiltinGcRoots for + * similar examples. We throw this exception if a thread tries to + * wait on an invalid FD. + */ + getStablePtr((StgPtr)blockedOnBadFD_closure); + break; +#endif #if defined(IOMGR_ENABLED_MIO_POSIX) case IO_MANAGER_MIO_POSIX: /* Posix implementation in posix/Signals.c diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index 70e926b44623fe9a65fd6df683e7b8cd93736059..4cb3a566d330bce09d5a3764b60ab7dd0fd9074f 100644 --- a/rts/RtsStartup.c +++ b/rts/RtsStartup.c @@ -211,7 +211,6 @@ static void initBuiltinGcRoots(void) getStablePtr((StgPtr)interruptIOManager_closure); getStablePtr((StgPtr)ioManagerCapabilitiesChanged_closure); #if !defined(mingw32_HOST_OS) - getStablePtr((StgPtr)blockedOnBadFD_closure); getStablePtr((StgPtr)runHandlersPtr_closure); #else getStablePtr((StgPtr)processRemoteCompletion_closure);