@hackage seqaid0.1.6.0
Dynamic strictness control, including space leak repair
Installation
Dependencies (14)
- array >=0.5 && <0.6
- base >=4 && <5
- containers >=0.5 && <0.6
- deepseq-bounded >=0.5 && <0.6
- generics-sop >=0.1 && <0.2
- ghc >=7.4 && <7.9 Show all…
Dependents (2)
@hackage/acme-everything, @hackage/leaky
Package Flags
try_inject_noinline_on_requested_binds
(off by default)
If we can prevent inling of injected binds (without requiring user edits), that would probably be a good trade off in terms of lost optimiser oppportunities in exchange for assurance that the bind won't be inlined. This didn't work, and is a poor solution anyway.
seqable_only
(off by default)
Like NFDATAN_ONLY, but for newer Seqable module.
th_type_in_types_ann
(off by default)
Actually this is just preparatory, haven't gone down this road far yet. (We would like a TH.Type to Type.Type conversion function in the GHC API. Then we'd just send the list of Type.Type for direct use by the Core-plugin downstream).
seqaidpp_types
(on by default)
Rather than choose types to seqinj for based on the types of the top-level binds, use seqaidpp to parse the types from seqaid.config. This stays on perpetually, finally, and could be removed soon.
infer_top_level_types
(off by default)
If True, then TH/modulespection will be used as it has been, to blanket-inject all top-level functions (at least, those not explicitly or implicitly excluded). Now, if False, only RHS's with result types in the "types" list for the module (in seqaid.config) will be wrapped (again, at least those not explicitly or implicitly excluded).
demo_mode
(on by default)
This is the only working mode in the first release. (And it only works when tested on the "leaky" package.) The switch exists to exclude hashable/hashtables deps (and subdeps) from the first release, while I can continue to work on this aspect in the development head.
dbg_seqaid
(on by default)
When set, every call to seqaidDispatch emits a line of info.
no_top_level_seqinj_dummies
(off by default)
If have to inject a class and instance anyway to evade DCE, no need for the old top-level seqinj_ declarations (we hope...).
nfdatan_only
(off by default)
To simplify debugging.
show_type
(on by default)
Include Typeable instance for (show . typeOf) in seqaidDispatch
Seqaid : Space Leak Diagnostic and Remedial Tool
Andrew Seniuk rasfar@gmail.com 2014
The easiest way to get started with seqaid is
cabal install seqaid
seqaid demo
This will create a fresh directory, populate
it with the
To instrument your own project ("myapp" for didactic purposes), typically the following steps suffice:
1. cabal install seqaid, of course.
2. Add the following (at the appropriate level of indentation)
to your myapp.cabal file:
default-extensions: TemplateHaskell
ghc-options: -fplugin=Seqaid.Plugin
ghc-options: -F -pgmF seqaidpp
ghc-options: -with-rtsopts=-T
3. Create a seqaid.config file in the project dir.
The preprocessor will parse this, and control
the extent of the instrumentation harness.
There is no mechanism yet for real blanket
instrumentation: You must name at least
the modules you want instrumented, and the
types you're interested in. All binds in
a module will be covered however.
Looking at the seqaid.config file for leaky:
package leaky
module Main
binds duty
types Types.TA
instances Types.TA, Types.TB, Types.TC
is this was changed to
package leaky
module Main
types Types.TA
instances Types.TA, Types.TB, Types.TC
then all binds in module Main will be instrumented at
all subexpressions having type Types.TA.
The instances line names types you need to be able
to force through. If you get missing instance errors
when you build, then you probably need to add those
types to this list.
When the preprocessor runs, it will parse the configuration from seqaid.config, and perform the requisite insertions and substitutions behind the scenes.
NOTE: This will never ever edit your source files directly!
GHC takes care of running the preprocessor (-F option) on
its own temporary files, in the natural course of the
compilation pipeline.
The other project inseparable from this is
More specific information resides in
- this document, and links from it: http://www.fremissant.net/deepseq-bounded-seqaid-leaky
- reddit thread(s): http://www.reddit.com/r/haskell/comments/2pscxh/ann_deepseqbounded_seqaid_leaky/
- the Haddock API docs for
and - haskell.org mailing list thread(s), for instance: http://web.archiveorange.com/archive/v/nDNOvlhf3EjknkvBbCya
And to a lesser extent, sporadic bits of information can also be found in files in the source distribution
- the project README and .cabal files
- comments in the source files [tend to obsolescence]
Subsequent versions will hopefully be more cohesive.