http://bugzilla.gdcproject.org/show_bug.cgi?id=126

Martin Nowak <c...@dawg.eu> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |c...@dawg.eu

--- Comment #13 from Martin Nowak <c...@dawg.eu> ---
My answer to the topic from a mail exchange with Michael.

On 06/11/2014 12:45 PM, Mike Franklin wrote:
> Martin,
>
> If you are interested in this low level programming in D, you might also be 
> interested in DIP62 (http://wiki.dlang.org/DIP62).  
>
> If you remember from my presentation, there was a glaring problem with my 
> implementation:  using 'shared' for 'volatile' semantics.  This is 
> fundamentally incorrect.  There is a discussion about it here 
> (http://forum.dlang.org/post/mailman.1081.1400818840.2907.d....@puremagic.com).
>
> There aren't many people in the D community doing such low-level work, so I 
> fear that this issue will be marginalized.  I would like to see more 
> discussion about it, and hopefully some action.  Your input would be quite 
> valuable.
>
> Mike
>  
Didn't knew about this proposal, but it's flawed IMO, because read-modify-write
operations might get interrupted. So you do need atomic updates for volatile
data that is accessed from an interrupt handler. Adding a type qualifier for
memory mapped I/O is overkill IMO.
The simple solution is to use shared+core.atomic for interrupt sensitive data
and a few functions for volatile.

void volatileSet(T)(ref shared(T) t, HeadUnshared!T val) if (T.sizeof == 4)
{ asm { naked; str r1, [r0]; bx lr; } }
HeadUnshared!T volatileGet(T)(ref shared(T) t) if (T.sizeof == 4)
{ asm { naked; ldr r0, [r0]; bx lr; } }

And because it's very difficult to ensure that certain memory-mapped I/O (which
is essentially shared global state) isn't affected by an interrupt routine,
it's safer to use core.atomic all the time. I don't think that atomic ops
(using MemoryOrder.raw) will a big performance penalty, because memory-mapped
I/O is rare.
If it is, the volatile workaround is simple enough to be implemented in a
library.

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to