[MLton-user] Raw conversion of 32 bits into Real32.t

Matthew Fluet fluet at tti-c.org
Mon Jan 22 17:58:57 PST 2007

Wesley W. Terpstra wrote:
> On Jan 23, 2007, at 1:04 AM, Henry Cejtin wrote:
>> The  problem  of the thread-safe aspect of allocation outside a 
>> function call
>> has   already   been   solved.    Look    at    the    structure    
>> One    in
>> basis-library/util/one.sml.
>> The signature is
>>     sig
>>        type 'a t
>>        val make: (unit -> 'a) -> 'a t
>>        val use: 'a t * ('a -> 'b) -> 'b
>>     end
>> The  arg  to  make  is  the creation thunk.  A single copy is made and 
>> saved,
>> along with the thunk and a flag.
>> When use is called, it checks if the single premade copy is in  use.   
>> If  it
>> isn't then it passes it to its second arg.  If it is then it makes a 
>> new one.
> This is all well and good for the situation where there is a high cost 
> associated with the object creation. However, in Matthew's example, the 
> method was so small and its scope so narrowly defined, that I think 
> using 'One' is massively overkill.

I agree.  Especially in the multi-threaded case, the call to 
Thread.atomicBegin will be very expensive -- it essentially serves as a 
global lock.

Now, the ONE signature may suffice with a different implementation (say, 
with a compare-and-swap serving to guard access to the global object).

> I think my version (with the inline creation) should be preferable on 
> the grounds of simplicity and thread-safety. If things really need to be 
> optimized by the user, then your above solution is certainly appropriate.
>> It is way better than having to re-allocate things every time.
> Ok, I understand that the vector gets allocated on the heap. But the 
> naive programmer in me says: this should have been allocated on the 
> stack, ala alloca()!

It is difficult to allocate variable sized objects on the stack, since 
MLton needs to be able to walk the stack for garbage collection.

MLton will flatten away some tuples so that they are never allocated on 
the heap.  I could imagine doing something similar with arrays/vectors 
of statically known size; it would effectively turn the array/vector 
into a tuple, which would be flattened.

Unfortunately, in this particular example, where we are using the array 
to coerce between Word32.word and Real32.real, it wouldn't really work, 
since we're necessarily accessing multiple Word8.word elements at a time.

More information about the MLton-user mailing list