Hi!
On Fri, Jun 09, 2006 at 10:03:14PM -0400, Dave Robillard wrote:
> > > The big question is: who cares? :) sem_post() is. A mutex/cond pair is
> > > just a big ugly slow non-RT-safe semaphore anyway.
> >
> > As far as I understand from the linux-2.6.16.16 and glibc-2.3.6 code,
> > a semaphore has similar problems, as sem_post() is implemented in terms
> > of futexes on newer linuxes, and futexes have a list of waiters, which
> > is protected by a lock within the kernel.
>
> Well, sem_post is supposed to be async-signal safe (meaning it can't be
> preempted, meaning it's realtime safe). If the Linux people have broken
> that, they have done an evil stupid thing. POSIX semaphores are great,
> especially since you can (or at least should, apparently) signal things
> from signal callbacks and realtime threads with them (they work great
> for event-driven systems).
>
> Are you sure? Link?
The userspace code of sem_post() can be found in
glibc-2.3.6/nptl/sysdeps/unix/sysv/linux/sem_post.c:
int
__new_sem_post (sem_t *sem)
{
int *futex = (int *) sem;
int nr = atomic_increment_val (futex);
int err = lll_futex_wake (futex, nr);
if (__builtin_expect (err, 0) < 0)
{
__set_errno (-err);
return -1;
}
return 0;
}
There are assembler versions, but they also need the futex_wake syscall,
so it doesn't matter which version you read.
And here is the kernel code from linux-2.6.16.16/kernel/futex.c:
static int futex_wake(unsigned long uaddr, int nr_wake)
{
union futex_key key;
struct futex_hash_bucket *bh;
struct list_head *head;
struct futex_q *this, *next;
int ret;
down_read(¤t->mm->mmap_sem);
ret = get_futex_key(uaddr, &key);
if (unlikely(ret != 0))
goto out;
bh = hash_futex(&key);
spin_lock(&bh->lock);
head = &bh->chain;
list_for_each_entry_safe(this, next, head, list) {
if (match_futex (&this->key, &key)) {
wake_futex(this);
if (++ret >= nr_wake)
break;
}
}
spin_unlock(&bh->lock);
out:
up_read(¤t->mm->mmap_sem);
return ret;
}
The spin_lock(&bh->lock) is the one I was referring to in my earlier
mail.
Cu... Stefan
-- Stefan Westerfeld, Hamburg/Germany, http://space.twc.de/~stefanReceived on Tue Jun 20 00:15:10 2006
This archive was generated by hypermail 2.1.8 : Tue Jun 20 2006 - 00:15:10 EEST