Re: question on macros in wait.h

David Brownell (david-b@pacbell.net)
Thu, 20 Mar 2003 22:52:06 -0800


This is a MIME-formatted message. If you see this text it means that your
E-mail software does not support MIME-formatted messages.

--=_courier-31909-1048228909-0001-2
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

> is there some deeper reason that there's no macro for waiting
> uninterruptablely with a timeout? Or did just nobody feel a need
> as yet?

Those macros seem to have moved out of <linux/sched.h> (2.4)
and wait_event_interruptible_timeout() was added about 6
months ago; the changelog entry says it was for smbfs.
So I'd guess "no need yet".

Here's an updated version of your patch, now using the same
calling convention that the other two "can return 'early'"
calls there provide. It's behaved in my testing, to replace the
chaos in the usb synchronous call wrappers.

- Dave

--=_courier-31909-1048228909-0001-2
Content-Type: text/plain; name="sched3.patch"; charset=iso-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="sched3.patch"

--- 1.7/include/linux/wait.h Sun Nov 17 12:30:14 2002
+++ edited/include/linux/wait.h Thu Mar 20 21:57:52 2003
@@ -173,6 +173,32 @@
__ret; \
})

+#define __wait_event_timeout(wq, condition, ret) \
+do { \
+ wait_queue_t __wait; \
+ init_waitqueue_entry(&__wait, current); \
+ \
+ add_wait_queue(&wq, &__wait); \
+ for (;;) { \
+ set_current_state(TASK_UNINTERRUPTIBLE); \
+ if (condition) \
+ break; \
+ ret = schedule_timeout(ret); \
+ if (!ret) \
+ break; \
+ } \
+ current->state = TASK_RUNNING; \
+ remove_wait_queue(&wq, &__wait); \
+} while (0)
+
+#define wait_event_timeout(wq, condition, timeout) \
+({ \
+ long __ret = timeout; \
+ if (!(condition)) \
+ __wait_event_timeout(wq, condition, __ret); \
+ __ret; \
+})
+
#define __wait_event_interruptible_timeout(wq, condition, ret) \
do { \
wait_queue_t __wait; \

--=_courier-31909-1048228909-0001-2--