Re: Multi-threading

Andi Kleen (ak@suse.de)
Tue, 12 Mar 2002 08:10:02 +0100


On Mon, Mar 11, 2002 at 05:02:50PM -0700, Brad Pepers wrote:
> > atomic_dec_and_return() doesn't strike me as too useful, because
> > it would need to lie to you. When you have a reference count
> > and you unlink the object first from public view you can trust
> > a 0 check (as atomic_dec_and_test does). As long as the object
> > is in public view someone else can change the counts and any
> > "atomic return" of that would be just lying. You can of course
> > always use atomic_read(), but it's not really atomic. I doubt the
> > microsoft equivalent is atomic neither, they are probably equivalent
> > to atomic_inc(); atomic_read(); or atomic_dec(); atomic_read() and
> > some hand weaving.
>
> Apparently the Microsoft one really is in Windows 98 and up (not in 95).
> I've had it explained that the asm code (semi-pseudo code here) is like this:
>
> movl reg, #-1
> lock xadd reg, counter
> decl reg
> movl result, reg
>
> This is in comparison to the current code which does something like this:
>
> lock decl counter
> sete result
>
> I don't see how the first asm code lies to you. It is returning the value as
> it was decremented to and the lock on the xadd keeps it safe.

Just it might change immediately afterwards if you don't remove the
object from public view first. An "atomic" value that you cannot depend
on is not very useful. The Linux convention of using atomic_dec_and_test()
is also only safe when you remove it first, but the dec_and_test encourages
this at least. atomic_inc_and_read() could only be safe when you remove
the object first too, but I don't see how it could be ever useful assuming
you keep the convention that reference count == 0 means freeable object.

>
> > BTW regarding atomic.h: while it is nicely usable on i386 in userspace
> > it isn't completely portable. Some architectures require helper functions
> > that are hard to implement in user space.
>
> Its too bad Linux didn't have a nice wrapper around atom inc/dec/test that
> was completely portable. Do you know what arch's have trouble implementing
> this?

sparc32 at least.
I think pa-risc32 too.

-Andi
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/