From: Rusty R. <ru...@ru...> - 2002-10-31 23:52:18
|
On 31 Oct 2002 16:45:58 +0000 Alan Cox <al...@lx...> wrote: > What is hard is multiple futex waits and livelock for that. I think it > can be done properly but I've not sat down and designed it all out - I > wonder what Rusty thinks. Hmm... Never thought about it. You mean an API like: struct futex_set *futex_set_init(); struct futex_set *futex_set_add(struct futex_set *, struct futex *); /* Returns futex obtained. */ struct futex *futex_set_wait(struct futex_set *); I think a naive implementation of futex_set_wait would look like: set = futex_set try: for each futex in set { if (grab in userspace) { close fds; return with futex; } close old fd for futex if any call FUTEX_FD to get fd notification of futex; } select on fds set = fds which are ready goto try You could, of course, loop through the fast path once before making any syscalls. Another optimization is to have FUTEX_FD reuse an existing fd rather than requiring the close. Not sure I get the point about livelock though: deadlock is possible if apps seek multiple locks at once without care, of course. Rusty. -- there are those who do and those who hang on and you don't see too many doers quoting their contemporaries. -- Larry McVoy |