On Mon, Jun 21, 2010 at 10:40 AM, erik quanstrom <[email protected]>wrote:

> void
> lock(ulong *l)
> {
>        ulong old;
>        ushort next, owner;
>
>        old = _xadd(l, 1);
>        for(;;){
>                next = old;
>                owner = old>>16;
>                old = *l;
>                if(next == owner)
>                        break;
>        }
> }
>
> void
> unlock(ulong *l)
> {
>        _xadd(l, 1<<16);
> }


Sure, that's reasonable in C; (i wasn't sure how to do it in asm for 8_a_,
that was what I was asking about). Just also remember to provide xadd; the
distribution 8a and 8l didn't support it last I checked.

Just another observation, we can bypass the load of old in the uncontended
case if we reverse old = *l and the compare/break in lock.

Anyway, thoughts on this lock?

-- vs

Reply via email to