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);
}

- erik

Reply via email to