[Haskell-cafe] Re: [Haskell] Re: Global Variables and IO initializers

Robert Dockins robdockins at fastmail.fm
Mon Nov 8 13:10:00 EST 2004

As a purely practical matter, it seems like the easiest solution (to 
this particular use case) is to write a small wrapper initializer in C 
which is idempotent, then use FFI to call the wrapper, rather than 
calling the initialization directly.  This is easy enough to do with a 
static local variable:

void doInit()
     static int doneInit = 0;
     if( !doneInit ) {
        doneInit = 1;

Then your haskell libs can call doInit any number of times, and
reallyInit will be called at most once.

Since your committed to FFI anyway (calling a C lib is the premise), the 
wrapper seems a small price to pay.  For Haskell-only code, something 
else would be nice.

Keith Wansbrough wrote:
> Adrian Hey writes:
>>The problem is simple enough to restate for anyone who's interested.
>>"Provide a simple reliable mechanism to ensure that in a given
>> program run one particular top level IO operation cannot be executed
>> more than once."
>>>Can you give one concrete example of an "intended application
>>>of oneShot", so that we can either propose a concrete Haskell
>>>implementation of it, or agree that global variables really are necessary.
>>Any C library which requires an explicit initialisation call before anything
>>in that library can be used (common enough IME). Accidental re-initialisation
>>(e.g. by two independent modules/libraries) will destroy any state currently
>>be used by the libraries existing "clients".
> Great, thanks, that's just what I was hoping for - I now see the
> problem you're trying to address.
> --KW 8-)
> _______________________________________________
> 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