From: "Peter Wächtler" <pwaechtler@loewe-komp.de>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Futexes IV (Fast Lightweight Userspace Semaphores)
Date: Mon, 25 Mar 2002 10:47:46 +0100 [thread overview]
Message-ID: <3C9EF242.6080106@loewe-komp.de> (raw)
In-Reply-To: <E16pKE0-0004Rb-00@wagner.rustcorp.com.au>
Rusty Russell wrote:
> In message <3C9E1A10.F7AA6D6E@loewe-komp.de> you write:
>
>>I can't see a reason why the ack-futex is needed. I think we can simply
>>delete it.
>>When deleted, the broadcast wouldn't block on ack (also preventing
>>schedule ping-pong). With the cond->lock it's save to have several
>>broadcasters. That's fine.
>>
>
> No, you might end up waking someone who did the pthread_cond_wait()
> after you did the pthread_cond_broadcast in place of one of the
> existing pthread_cond_wait() threads.
>
> I don't believe this is allowed.
>
Indeed, I suspect that this isn't wanted.
With the cond->lock you almost prevent this: an ongoing broadcast
can't be intermixed with newly incoming waiters (they will block
on futex_down(&cond->lock))
But there is the window between a->b...
>
>>But:
>>static int __pthread_cond_wait(pthread_cond_t *cond,
>> pthread_mutex_t *mutex,
>> const struct timespec *reltime)
>>{
>> int ret;
>>
>> /* Increment first so broadcaster knows we are waiting. */
>> futex_down(&cond->lock);
>> atomic_inc(cond->num_waiting);
>>(*) futex_up(&mutex, 1);
>>a) futex_up(&cond->lock, 1); [move into syscall]
>> do {
>>b) ret = futex_down_time(&cond, ABSTIME); [cond_timed_wait]
>> } while (ret < 0 && errno == EINTR);
>> [futex_up(&cond->lock, 1); /* release condvar */]
>>
>> futex_down(&mutex->futex);
>> return ret;
>>}
>>
>>With the original code, we have a "signal/broadcast lost window (a->b)"
>>that shouldn't be there:
>>
>
> Where? Having done the inc, the futex_up at (a) will fall through,
> giving the "thread behaves as if it [signal or broadcast] were issued
> after the about-to-block thread has blocked."
>
Right after (a) another thread gets scheduled, issueing a signal/broadcast.
Ah, and then the futex_down_timed() wouldn't block, OK ;-)
But this way you have to use the ack->lock
I strongly believe, that the implementation of a condvar needs a lock
to prevent intermixed calls. You will see my comment on your implementation
with uwaitq. ;-)
next prev parent reply other threads:[~2002-03-25 9:48 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-03-13 9:12 [PATCH] Futexes IV (Fast Lightweight Userspace Semaphores) Martin Wirth
2002-03-13 19:41 ` Bill Davidsen
2002-03-13 19:52 ` Dave McCracken
2002-03-13 22:17 ` Bill Davidsen
2002-03-13 20:06 ` Alan Cox
2002-03-15 7:31 ` Rusty Russell
2002-03-15 8:41 ` Martin Wirth
2002-03-15 15:29 ` Hubertus Franke
2002-03-15 16:23 ` Peter Wächtler
2002-03-16 0:12 ` Rusty Russell
2002-03-16 11:23 ` Martin Wirth
2002-03-17 6:50 ` Rusty Russell
2002-03-18 0:52 ` Ulrich Drepper
2002-03-19 3:28 ` Rusty Russell
2002-03-19 4:05 ` Ulrich Drepper
2002-03-20 6:20 ` Rusty Russell
2002-03-20 10:42 ` Peter Wächtler
2002-03-20 17:20 ` Ulrich Drepper
2002-03-19 8:34 ` Martin Wirth
2002-03-20 6:45 ` Rusty Russell
2002-03-21 6:48 ` Martin Wirth
2002-03-24 18:25 ` Peter Wächtler
2002-03-25 2:28 ` Rusty Russell
2002-03-25 4:46 ` Rusty Russell
2002-03-25 11:56 ` Peter Wächtler
2002-03-26 1:02 ` Rusty Russell
2002-03-26 8:17 ` Martin Wirth
2002-03-26 23:10 ` Rusty Russell
2002-03-27 21:05 ` Hubertus Franke
2002-03-27 23:53 ` Rusty Russell
2002-03-25 9:47 ` Peter Wächtler [this message]
2002-03-16 19:48 ` Peter Wächtler
-- strict thread matches above, loose matches on Subject: below --
2002-03-05 7:01 Rusty Russell
2002-03-05 22:39 ` Davide Libenzi
2002-03-05 23:16 ` Hubertus Franke
2002-03-05 23:26 ` Davide Libenzi
2002-03-05 23:37 ` Peter Svensson
2002-03-05 23:50 ` Davide Libenzi
2002-03-08 0:07 ` Richard Henderson
2002-03-06 1:46 ` Rusty Russell
2002-03-06 2:03 ` Davide Libenzi
2002-03-08 18:07 ` Linus Torvalds
2002-03-08 19:03 ` Hubertus Franke
2002-03-08 19:22 ` Linus Torvalds
2002-03-08 20:29 ` Hubertus Franke
2002-03-08 20:48 ` Matthew Kirkwood
2002-03-08 21:02 ` Linus Torvalds
2002-03-08 23:15 ` Hubertus Franke
2002-03-08 23:36 ` Alan Cox
2002-03-08 23:41 ` Linus Torvalds
2002-03-08 23:56 ` Hubertus Franke
2002-03-09 2:12 ` Linus Torvalds
2002-03-11 14:14 ` Hubertus Franke
2002-03-09 0:03 ` H. Peter Anvin
2002-03-09 1:15 ` Alan Cox
2002-03-10 19:41 ` Linus Torvalds
2002-03-11 20:49 ` Pavel Machek
2002-03-13 7:40 ` Rusty Russell
2002-03-13 16:37 ` Alan Cox
2002-03-10 19:58 ` Martin J. Bligh
2002-03-10 20:40 ` Alan Cox
2002-03-10 20:28 ` Martin J. Bligh
2002-03-10 21:05 ` Alan Cox
2002-03-12 9:35 ` Helge Hafting
2002-03-08 20:40 ` Alan Cox
2002-03-08 20:57 ` Linus Torvalds
2002-03-08 23:43 ` H. Peter Anvin
2002-03-08 22:55 ` Hubertus Franke
2002-03-08 23:38 ` Alan Cox
2002-03-08 23:44 ` H. Peter Anvin
2002-03-08 20:47 ` george anzinger
2002-03-08 23:02 ` Hubertus Franke
2002-03-08 23:47 ` george anzinger
2002-03-09 1:11 ` Alan Cox
2002-03-09 1:20 ` Linus Torvalds
2002-03-09 4:49 ` Rusty Russell
2002-03-11 22:45 ` Linus Torvalds
2002-03-11 23:12 ` Hubertus Franke
2002-03-12 7:20 ` Rusty Russell
2002-03-12 14:56 ` Hubertus Franke
2002-03-13 4:02 ` Rusty Russell
2002-03-12 17:17 ` Linus Torvalds
2002-03-13 2:57 ` Rusty Russell
2002-03-09 4:51 ` Rusty Russell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3C9EF242.6080106@loewe-komp.de \
--to=pwaechtler@loewe-komp.de \
--cc=linux-kernel@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.