[cpp-threads] modes, pass 2
    Alexander Terekhov 
    alexander.terekhov at gmail.com
       
    Mon May  9 19:17:36 BST 2005
    
    
  
On 5/9/05, Peter Dimov <pdimov at mmltd.net> wrote:
> Alexander Terekhov wrote:
> > I think that the trick can be used for your get_acquire().
> 
> Yep. In "compilable pseudocode":
> 
> template<class T, class M> T atomic_load( M msync, T * addr )
> {
>    if( msync & msync_ssb )
>    {
>        _sync();
>    }
>    else if( msync & msync_slb )
>    {
>        _lwsync();
>    }
> 
>    T r = _load( addr );
> 
>    if( msync & msync_acq )
>    {
>        _inject_conditional_branch();
>    }
> 
>    if( msync & msync_hlb )
>    {
>        _isync();
>    }
> 
>    return r;
> }
Yup. With compile time ifs, "_inject_conditional_branch()" meaning 
r->CR0->branch-never-taken hack, msync_acq == msync_hsb | msync_hlb, 
and Doug's "lightest barrier" stuff implied.
regards,
alexander.
    
    
More information about the cpp-threads
mailing list