
#8400: Migrate the RTS to use libuv (or libev, or libevent) -------------------------------------+------------------------------------- Reporter: schyler | Owner: (none) Type: feature request | Status: new Priority: normal | Milestone: Component: Runtime System | Version: Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: 635, 7353 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by dobenour): I have an idea for how to implement this: * Each `Capability` contains a `uv_loop_t` as well as a pointer to a list of threads that are blocked waiting on C callbacks to fire. Since initializing a `uv_loop_t` can fail due to OS resource exhaustion, such as too many open files, the RTS checks that initializing succeeded before a capability can run Haskell code. * Each Capability owns a pool of C structures {{{#!C typedef struct StgCCallbackInfo { StgTSO *BlockedThread; /* The thread that is blocked waiting for the callback */ StgWord refcount; /* Reference count */ void *user; /* Arbitrary C data */ } StgCCallbackInfo; }}} This list is a GC root. The members of this pool are in pinned memory, so they can safely be referenced by C code * The RTS exports C functions {{{#!C /** * Allocates a C callback info struct, or NULL if we run out of memory. */ StgCCallbackInfo *rts_newCCallbackInfo(Capability *c, StgTSO *t, void *user); /** * Wakes up the thread pointed to by the given `StgCCallbackInfo`. */ void rts_wakeupThread(struct StgCCallbackInfo *ptr); /** * Increments the reference count on the `StgCCallbackInfo`. */ void rts_callback_incref(struct StgCCallbackInfo *ptr); /** * Decrements the reference count. */ void rts_callback_decref(struct StgCCallbackInfo *ptr); }}} which can be used to manipulate these structures -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8400#comment:24 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler