[Haskell-cafe] Genuine Need For Persistent Global State?

Don Stewart dons at galois.com
Fri Oct 16 15:29:53 EDT 2009

StablePtrs are relatively easy to use, and have precisely the guarantees
you need -- the state can be passed to C and recovered. Any use of
IORefs that will scale past more than one state object will
essentially duplicate the stable pointer functionality.

They're a reasonable choice.

-- Don

> Stable pointers might do what you want:
> http://haskell.org/ghc/docs/latest/html/libraries/base/Foreign-StablePtr.html
> Though an IORef would probably work just as well, depending on how you needed
> to use it..
> - Job
> On Fri, Oct 16, 2009 at 2:59 PM, Alan Carter <alangcarter at gmail.com> wrote:
>     Hi,
>     I've been looking at the patches given by Tom at Beware the Jabberwolk, for
>     building Linux kernel modules in Haskell. Once I'd got Tom's stuff
>     building, the next thing was to build a little driver which actually does
>     something. Step by step I was making progress, and I've now got a little
>     function which can see all the characters which are catted to the device
>     file. That's when I got stuck.
>     Trouble is, my function is (ultimately) being called from the C kernel
>     stuff. It isn't on the bottom of a call graph coming from a Haskell main. A
>     driver really needs to know where it's at. So I seem to need some kind of
>     global, persistent state, and Control.Monad.State seems to be out because I
>     can't pass a State around my call graph.
>     I've thought about trying to create some State when I initialize, pass some
>     kind of pointer back to the C shim which actually does the calling into
>     Haskell, and then passing it back into Haskell on the writes and reads, but
>     that seems dangerous because the Haskell garbage collector would
>     (understandably) get the wrong idea and delete it. Also it's ugly - having
>     to use C for something Haskell can't do.
>     I've been looking at the Halfs Haskell file system, which surely must have
>     solved its own version of this problem, but whatever it does in its FSState
>     seems very complicated and is beyond my comprehension :-(
>     So my questions are:
>     1) Am I right in thinking that I have a genuine need for global, persistent
>     state?
>     2) Halfs works. Am I right in thinking it has (somehow) solved this
>     problem?
>     3) Is there a simple way to maintain global persistent state that I can
>     stash between calls into a function, and access without needing to pass the
>     state in? If so, is there an example anywhere?
>     Thanks in advance,
>     Alan
>     --
>     ... the PA system was moaning unctuously, like a lady hippopotamus reading
>     A. E. Housman ..."
>      -- James Blish, "They Shall Have Stars"
>     _______________________________________________
>     Haskell-Cafe mailing list
>     Haskell-Cafe at haskell.org
>     http://www.haskell.org/mailman/listinfo/haskell-cafe

> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

More information about the Haskell-Cafe mailing list