* [KJ] [RFC][UPDATE PATCH 1/5] add poll_event*()
@ 2005-03-04 18:53 Nishanth Aravamudan
2005-03-04 19:40 ` Alexey Dobriyan
2005-03-05 0:05 ` Nishanth Aravamudan
0 siblings, 2 replies; 3+ messages in thread
From: Nishanth Aravamudan @ 2005-03-04 18:53 UTC (permalink / raw)
To: kernel-janitors
[-- Attachment #1: Type: text/plain, Size: 3619 bytes --]
On Thu, Mar 03, 2005 at 05:05:47PM -0800, Nishanth Aravamudan wrote:
> On Thu, Mar 03, 2005 at 10:22:38AM -0800, Nishanth Aravamudan wrote:
> > Hi,
> >
> > Description: Add the poll_event(), poll_event_timeout(),
> > poll_event_interruptible() and poll_event_interruptible_timeout()
> > interfaces. These macros encapsulate typical sleeping code usage in a
> > sane way.
>
> Macros broken in some subtle & not-so-subtle ways. I will try and get a
> cleaned-up new version for everyone to examine by tomorrow.
Hopefully this patch fixes some of the issues and makes the interfaces a
little better, as recommended by Walter Harms and Alexey Dobriyan. I will
update the examples I've given patches 2-5, as appropriate.
A further question, though, should I make the interfaces more similar in
code to wait_event*() and have a called version and then that version
call and __ version?
Thanks,
Nish
Description: Add the poll_event(), poll_event_timeout(),
poll_event_interruptible() and poll_event_interruptible_timeout()
interfaces. These macros encapsulate typical sleeping code usage in
a sane way.
Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
--- 2.6.11-kj-v/include/linux/delay.h 2005-03-01 23:37:51.000000000 -0800
+++ 2.6.11-kj/include/linux/delay.h 2005-03-04 10:49:55.000000000 -0800
@@ -47,4 +47,81 @@ static inline void ssleep(unsigned int s
msleep(seconds * 1000);
}
+/*
+ * poll_event* check if an @condition is true every @interval milliseconds,
+ * up to a @timeout maximum, if specified, else forever.
+ * The *_interruptible versions will sleep in TASK_INTERRUPTIBLE
+ * (instead of TASK_UNINTERRUPTIBLE) and will return early on signals
+ * Note that these interfaces are distinctly different than
+ * wait_event*() in two ways:
+ * 1) No wait-queues
+ * 2) Specify the time you want to sleep, not when you want to
+ * wake-up. Thus, callers should not add the current time to
+ * @timeout before calling, as it will be done by the macro.
+ */
+
+/* no return value */
+#define poll_event(condition, interval) \
+do { \
+ while (!(condition)) \
+ msleep(interval); \
+} while(0)
+
+/* return 0 if condition caused return, -ETIME if timeout */
+#define poll_event_timeout(condition, interval, timeout) \
+({ \
+ int __ret = 0; \
+ unsigned long stop = jiffies + msecs_to_jiffies(timeout); \
+ \
+ for (;;) { \
+ if (condition) \
+ break; \
+ msleep(interval); \
+ if (time_after(jiffies, stop)) { \
+ __ret = -ETIME; \
+ break; \
+ } \
+ } \
+ __ret; \
+})
+
+/* return 0 if condition caused return, -EINTR if signal */
+#define poll_event_interruptible(condition, interval) \
+({ \
+ int __ret = 0; \
+ \
+ for (;;) { \
+ if (condition) \
+ break; \
+ msleep_interruptible(interval); \
+ if (signal_pending(current)) { \
+ __ret = -EINTR; \
+ break; \
+ } \
+ } \
+ __ret;
+})
+
+/* return 0 if condition caused return, -EINTR if signal, -ETIME if
+ * timeout */
+#define poll_event_interruptible_timeout(conditition, interval, timeout) \
+({ \
+ int __ret = 0; \
+ unsigned long stop = jiffies + msecs_to_jiffies(timeout); \
+ \
+ for (;;) { \
+ if (condition) \
+ break; \
+ msleep_interruptible(interval); \
+ if (signal_pending(current)) { \
+ __ret = -EINTR; \
+ break; \
+ } \
+ if (time_after(jiffies, stop)) { \
+ __ret = -ETIME; \
+ break; \
+ } \
+ } \
+})
+
#endif /* defined(_LINUX_DELAY_H) */
[-- Attachment #2: Type: text/plain, Size: 167 bytes --]
_______________________________________________
Kernel-janitors mailing list
Kernel-janitors@lists.osdl.org
http://lists.osdl.org/mailman/listinfo/kernel-janitors
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [KJ] [RFC][UPDATE PATCH 1/5] add poll_event*()
2005-03-04 18:53 [KJ] [RFC][UPDATE PATCH 1/5] add poll_event*() Nishanth Aravamudan
@ 2005-03-04 19:40 ` Alexey Dobriyan
2005-03-05 0:05 ` Nishanth Aravamudan
1 sibling, 0 replies; 3+ messages in thread
From: Alexey Dobriyan @ 2005-03-04 19:40 UTC (permalink / raw)
To: kernel-janitors
[-- Attachment #1: Type: text/plain, Size: 989 bytes --]
On Friday 04 March 2005 20:53, Nishanth Aravamudan wrote:
> Add the poll_event(), poll_event_timeout(), poll_event_interruptible() and
> poll_event_interruptible_timeout() interfaces. These macros encapsulate
> typical sleeping code usage in a sane way.
> --- 2.6.11-kj-v/include/linux/delay.h
> +++ 2.6.11-kj/include/linux/delay.h
> +#define poll_event_interruptible_timeout(conditition, interval, timeout) \
> +({ \
> + int __ret = 0; \
> + unsigned long stop = jiffies + msecs_to_jiffies(timeout); \
> + \
> + for (;;) { \
> + if (condition) \
> + break; \
> + msleep_interruptible(interval); \
> + if (signal_pending(current)) { \
> + __ret = -EINTR; \
> + break; \
> + } \
> + if (time_after(jiffies, stop)) { \
> + __ret = -ETIME; \
> + break; \
> + } \
> + } \
__ret;
> +})
Also, can you add kernel-doc comments? Rules are the same as for functions.
Alexey
[-- Attachment #2: Type: text/plain, Size: 167 bytes --]
_______________________________________________
Kernel-janitors mailing list
Kernel-janitors@lists.osdl.org
http://lists.osdl.org/mailman/listinfo/kernel-janitors
^ permalink raw reply [flat|nested] 3+ messages in thread
* [KJ] [RFC][UPDATE PATCH 1/5] add poll_event*()
2005-03-04 18:53 [KJ] [RFC][UPDATE PATCH 1/5] add poll_event*() Nishanth Aravamudan
2005-03-04 19:40 ` Alexey Dobriyan
@ 2005-03-05 0:05 ` Nishanth Aravamudan
1 sibling, 0 replies; 3+ messages in thread
From: Nishanth Aravamudan @ 2005-03-05 0:05 UTC (permalink / raw)
To: kernel-janitors
[-- Attachment #1: Type: text/plain, Size: 4844 bytes --]
On Fri, Mar 04, 2005 at 10:37:40PM +0200, Alexey Dobriyan wrote:
> On Friday 04 March 2005 20:53, Nishanth Aravamudan wrote:
>
> > Add the poll_event(), poll_event_timeout(), poll_event_interruptible() and
> > poll_event_interruptible_timeout() interfaces. These macros encapsulate
> > typical sleeping code usage in a sane way.
>
> > --- 2.6.11-kj-v/include/linux/delay.h
> > +++ 2.6.11-kj/include/linux/delay.h
>
> > +#define poll_event_interruptible_timeout(conditition, interval, timeout) \
> > +({ \
> > + int __ret = 0; \
> > + unsigned long stop = jiffies + msecs_to_jiffies(timeout); \
> > + \
> > + for (;;) { \
> > + if (condition) \
> > + break; \
> > + msleep_interruptible(interval); \
> > + if (signal_pending(current)) { \
> > + __ret = -EINTR; \
> > + break; \
> > + } \
> > + if (time_after(jiffies, stop)) { \
> > + __ret = -ETIME; \
> > + break; \
> > + } \
> > + } \
>
> __ret;
>
> > +})
>
> Also, can you add kernel-doc comments? Rules are the same as for functions.
Code error fixed below.
This is my first try at kernel-doc style comments. Please indicate any
problems.
Thanks,
Nish
Description: Add the poll_event(), poll_event_timeout(),
poll_event_interruptible() and poll_event_interruptible_timeout()
interfaces. These macros encapsulate typical sleeping code usage in
a sane way.
Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
--- 2.6.11-kj-v/include/linux/delay.h 2005-03-01 23:37:51.000000000 -0800
+++ 2.6.11-kj/include/linux/delay.h 2005-03-04 16:03:24.000000000 -0800
@@ -47,4 +47,106 @@ static inline void ssleep(unsigned int s
msleep(seconds * 1000);
}
+/*
+ * poll_event* check if an @condition is true every @interval milliseconds,
+ * up to a @timeout maximum, if specified, else forever.
+ * The *_interruptible versions will sleep in TASK_INTERRUPTIBLE
+ * (instead of TASK_UNINTERRUPTIBLE) and will return early on signals
+ * Note that these interfaces are distinctly different than
+ * wait_event*() in two ways:
+ * 1) No wait-queues
+ * 2) Specify the time you want to sleep, not when you want to
+ * wake-up. Thus, callers should not add the current time to
+ * @timeout before calling, as it will be done by the macro.
+ */
+
+/**
+ * poll_event - check a condition at regular intervals
+ * @condition: Condition to check
+ * @interval: Number of milliseconds between checks
+ */
+#define poll_event(condition, interval) \
+do { \
+ while (!(condition)) \
+ msleep(interval); \
+} while(0)
+
+/**
+ * poll_event_timeout - check a condition at regular intervals with a timeout
+ * @condition: Condition to check
+ * @interval: Number of milliseconds between checks
+ * @timeout: Maximum total number of milliseconds to take
+ * returns: 0, if condition caused return
+ * -ETIME, if timeout
+ */
+#define poll_event_timeout(condition, interval, timeout) \
+({ \
+ int __ret = 0; \
+ unsigned long stop = jiffies + msecs_to_jiffies(timeout); \
+ \
+ for (;;) { \
+ if (condition) \
+ break; \
+ msleep(interval); \
+ if (time_after(jiffies, stop)) { \
+ __ret = -ETIME; \
+ break; \
+ } \
+ } \
+ __ret; \
+})
+
+/**
+ * poll_event_interruptible - check a condition at regular intervals, returning early on signals
+ * @condition: Condition to check
+ * @interval: Number of milliseconds between checks
+ * returns: 0, if condition caused return
+ * -EINTR, if a signal
+ */
+#define poll_event_interruptible(condition, interval) \
+({ \
+ int __ret = 0; \
+ \
+ for (;;) { \
+ if (condition) \
+ break; \
+ msleep_interruptible(interval); \
+ if (signal_pending(current)) { \
+ __ret = -EINTR; \
+ break; \
+ } \
+ } \
+ __ret;
+})
+
+/**
+ * poll_event_interruptible_timeout - check a condition at regular intervals with a timeout, returning early on signals
+ * @condition: Condition to check
+ * @interval: Number of milliseconds between checks
+ * @timeout: Maximum total number of milliseconds to take
+ * returns 0, if condition caused return
+ * -EINTR, if a signal
+ * -ETIME, if timeout
+ */
+#define poll_event_interruptible_timeout(conditition, interval, timeout) \
+({ \
+ int __ret = 0; \
+ unsigned long stop = jiffies + msecs_to_jiffies(timeout); \
+ \
+ for (;;) { \
+ if (condition) \
+ break; \
+ msleep_interruptible(interval); \
+ if (signal_pending(current)) { \
+ __ret = -EINTR; \
+ break; \
+ } \
+ if (time_after(jiffies, stop)) { \
+ __ret = -ETIME; \
+ break; \
+ } \
+ } \
+ __ret; \
+})
+
#endif /* defined(_LINUX_DELAY_H) */
[-- Attachment #2: Type: text/plain, Size: 167 bytes --]
_______________________________________________
Kernel-janitors mailing list
Kernel-janitors@lists.osdl.org
http://lists.osdl.org/mailman/listinfo/kernel-janitors
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-03-05 0:05 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-03-04 18:53 [KJ] [RFC][UPDATE PATCH 1/5] add poll_event*() Nishanth Aravamudan
2005-03-04 19:40 ` Alexey Dobriyan
2005-03-05 0:05 ` Nishanth Aravamudan
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.