<div><br class="Apple-interchange-newline">On Thu, Jan 5, 2012 at 5:44 PM, Joachim Breitner <span dir="ltr">&lt;<a href="mailto:nomeata@debian.org">nomeata@debian.org</a>&gt;</span> wrote:<blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
 Anyways, I’m just brainstorming<br>a bit, although it seems I’m only turning up ideas that have been<br>dismissed already...</blockquote><div><br></div><div>It is good to hash through these things. =)</div><div><br></div>
</div><div>On a related note, which doesn&#39;t solve the general problem, I have been working with Dan Peebles on a nice set of MPFR bindings for my own purposes using custom foreign prims.</div><div><br></div><div><div>
I unpacked the main MPFR structures and let the ghc garbage collector move everything around, like it does with GMP itself.</div><div><br class="Apple-interchange-newline"></div></div><div><div>We&#39;ve been able to get a version that ALMOST works as expected. That is to say it works perfectly unless you need to access a function that pulls from its built-in constant cache. (MPFR internally caches the result of computing the first n digits of pi or log of 2, etc. growing the cache as you demand longer numbers.)</div>
</div><div><br></div><div>Dan was able to swap out the ghc gmp allocation hook for a slightly slower one that checks to see if it is being called from the MPFR cache management function, and diverting the allocation back to malloc. </div>
<div><br></div><div><div><div>Ideally we would swap the handler in an initializer when the library loads, and this works perfectly in ghc, but not ghci -- which apparently links in libraries in a way where c++ style initializers don&#39;t get invoked?</div>
<div><br></div><div>A &#39;replaceAllocator&#39; IO action that swaps the gmp allocation hook isn&#39;t a very Haskelly solution either, because I&#39;d prefer to just have it look like another numeric type.</div><div><br>
</div><div>Dan is currently investigating including a patched copy of MPFR in the haskell package, which doesn&#39;t try to use the built-in allocator for the constant cache. </div><div><br></div><div>This is where it becomes relevant to the discussion at hand, because it would effectively involve linking in our own copy of MPFR, making distributions unhappy.</div>
<div><br></div><div>But another option would be to unsafePerformIO that initializer, which would add a bit of overhead, going through an indirection to make sure that replaceAllocator had been forced, perhaps it wouldn&#39;t be too bad:</div>
<div><br></div><div>Something like:</div><div><br></div><div>replaceAllocator :: ()</div><div>replaceAllocator = unsafePerformIO replaceAllocatorIO</div><div>{-# NOINLINE replaceAllocator #-}</div><div><br></div><div>instance (Rounding r, Precision p) =&gt; Floating (Fixed r p) where</div>
<div>  pi = replaceAllocator `pseq` mpfr_pi ...</div><div><br></div><div>This doesn&#39;t address general purpose use of third party libraries that happen to internally rely upon GMP, however. </div><div><br></div><div>Or rather, if it does, the methodology it would lead to would be one of bringing over all of their internals into Haskell. ;)</div>
<div><br></div><div>-Edward Kmett</div></div></div>