@hackage leaky0.4.0.0

Robust space leak, and its strictification

This leaky mini-project provides a Haskell program exhibiting classic space leak behaviour. It leaks in GHC 7.8.3 (and lower), even when compiled -O2.

leaky-min-cppd.hs - a tiny Haskell program that leaks in GHC 7.8.3 -O2 leaky-min.hs - like leaky-min-cppd.hs, with some alternatives leaky.hs - a similar but elaborated example, with .cabal flags

In addition to the source files, more information can be found at the http://www.fremissant.net/leaky project homepage, including discussion links (cafe, reddit, etc.).

There may also be a community-editable version at the https://www.haskell.org/haskellwiki/Space_Leak wiki page.

Configure and build in place:

cabal get leaky # download and unpack leaky cd leaky-0.1.0.0 # (or whatever version it is) cabal configure && cabal build # build in place

Run by supplying a seed for the random number generator:

./dist/build/leaky/leaky 234

Or you may prefer to build in a sandbox:

cabal get leaky cd leaky-0.1.0.0 cabal sandbox init cabal install --only-dependencies cabal install

And to run:

./.cabal-sandbox/bin/leaky 234

NOTE: If you don't build with Cabal, you will need to put options from leaky.cabal into your command line.

Anyway, seqaid uses both the Cabal library and the cabal executable, meaning that only FORCING_STRATEGY from 0 through 3 (refer to leaky.cabal) can work wtihout the presence of the leaky.cabal file.

The output is explained at http://www.fremissant.net/leaky/output.html or in the corresponding local document ./HTML/output.html.

The FORCING_STRATEGY CPP macro currently controls the leak and plug variants, which are best set by editing the leaky.cabal file,reconfiguring and rebuilding (or reinstalling in the case of a sandbox). See the included file rough-fs-twiddling-guide.txt for more details.

There are also some constants in leaky.hs you may like to adjust.

If you have a version of the compiler that does not leak for the default variant of leaky, please let me know at rasfar@gmail.com, or on the reddit discussion:

http://www.reddit.com/r/haskell/comments/2pscxh/ann_deepseqbounded_seqaid_leaky/

It's nice to share your thoughts.

Sept. 20, 2014 / Dec. 2014 Andrew Seniuk rasfar on #haskell

  • Installation

  • Dependencies (0)

  • Dependents (1)

    @hackage/acme-everything
  • Package Flags

      hello_hackage_visitor
       (off by default)
      Note to those reading on Hackage:
      Please ignore these flags, which would be better presented in a collapsed state. The flags are mostly for development purposes.
      turn_on_seqaid_plugin
       (on by default)

      Only when True, provide the options to enable the seqaid preprocessor and GHC plugin.

      omnitypic
       (off by default)

      Blanket seqaid harness at subexpressions of all possible types. Shouldn't need a Cabal flag for this, but it's the same problem of casing over integer values for a macro (in a .cabal file). So this need not be orthogonal to FORCING_STRATEGY, but this way it is ... which is okay, actually. (Can then test interactions with other FS=0..6.)

      test_seqaidpp
       (on by default)

      Finally crumbed and availed myself of -F -pgmF, although only for things which are fairly safe via regex (injecting imports, top-level splices, "deriving instance" statements, LANGUAGE pragmas, etc.). (Later: You can't really do without this anymore, although with FORCING_STRATEGY=4 it is possible.)

      stats
       (on by default)

      Dump periodic stats lines, for FORCING_STRATEGY that need it.

      use_second_module
       (on by default)

      Temporary for testing... (Later: Sadly this is not so temporary. There is some kind of interference between SOP.TH and Seqaid.TH splices which is still unresolved. So, types needing NFDataP (etc.) instances will need to live in a module which is not being harnessed.)

      profile
       (off by default)

      Enable profiling

      use_growing_list
       (on by default)

      The problem with using a growing list is, it itself is a leak (as it were), so it's hard to see you've plugged anything. However, the slowdown of "force" relative to "forcep" will be noticed! Alternative to GROWING is FIXED (is at length 10000 at the moment). Fixed list is infinite if INFINITE set below. (INFINITE has no effect when GROWING set.)

      use_growing_list_reduction
       (on by default)

      XXX For some reason, memory is being retained when REDUCTION is enabled. (Later: Is this still the case? I see it's been set to True throughout development...).

      use_infinite_list
       (off by default)

      To show DeepSeq.force (FORCING_STRATEGY=1) at its worst.

      use_strict_blob
       (on by default)

      Put some weighty strict subtrees in the test data structure, so can showcase forcep's specificity relative to forcen.

      use_cpphs
       (on by default)

      The original intention was to make this a non-manual flag, to allow the build system to try cpphs first, and if that fails, then to try system-wide cpp (typically GNU). Due to path problems, when the build client installs cpphs in the course of installing, it turns out to be better to use a shell script to delegate which cpp runs, jimmy options, etc.