]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
eloop: Add a timer cancel that returns the remaining time
authorPontus Fuchs <pontus.fuchs@gmail.com>
Sun, 3 Feb 2013 15:17:08 +0000 (17:17 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 3 Feb 2013 15:17:08 +0000 (17:17 +0200)
This new cancel timer will give back the remaining time if it was
pending.

Signed-hostap: Pontus Fuchs <pontus.fuchs@gmail.com>

src/utils/eloop.c
src/utils/eloop.h
src/utils/eloop_none.c
src/utils/eloop_win.c

index d01ae64f8a628d81de932da7b3d53f321a6cf9a6..2de3e0140689ce158c307bb791aaff88b0148d68 100644 (file)
@@ -556,6 +556,33 @@ int eloop_cancel_timeout(eloop_timeout_handler handler,
 }
 
 
+int eloop_cancel_timeout_one(eloop_timeout_handler handler,
+                            void *eloop_data, void *user_data,
+                            struct os_time *remaining)
+{
+       struct eloop_timeout *timeout, *prev;
+       int removed = 0;
+       struct os_time now;
+
+       os_get_time(&now);
+       remaining->sec = remaining->usec = 0;
+
+       dl_list_for_each_safe(timeout, prev, &eloop.timeout,
+                             struct eloop_timeout, list) {
+               if (timeout->handler == handler &&
+                   (timeout->eloop_data == eloop_data) &&
+                   (timeout->user_data == user_data)) {
+                       removed = 1;
+                       if (os_time_before(&now, &timeout->time))
+                               os_time_sub(&timeout->time, &now, remaining);
+                       eloop_remove_timeout(timeout);
+                       break;
+               }
+       }
+       return removed;
+}
+
+
 int eloop_is_timeout_registered(eloop_timeout_handler handler,
                                void *eloop_data, void *user_data)
 {
index db03a735596f88f1a377c2cd99f9468a4964bff2..0037c6355fdce5bb828bd69793348a74f6388259 100644 (file)
@@ -194,6 +194,21 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs,
 int eloop_cancel_timeout(eloop_timeout_handler handler,
                         void *eloop_data, void *user_data);
 
+/**
+ * eloop_cancel_timeout_one - Cancel a single timeout
+ * @handler: Matching callback function
+ * @eloop_data: Matching eloop_data
+ * @user_data: Matching user_data
+ * @remaining: Time left on the cancelled timer
+ * Returns: Number of cancelled timeouts
+ *
+ * Cancel matching <handler,eloop_data,user_data> timeout registered with
+ * eloop_register_timeout() and return the remaining time left.
+ */
+int eloop_cancel_timeout_one(eloop_timeout_handler handler,
+                            void *eloop_data, void *user_data,
+                            struct os_time *remaining);
+
 /**
  * eloop_is_timeout_registered - Check if a timeout is already registered
  * @handler: Matching callback function
index 93049b308379c04db356dd581c94189485ffceb3..cb5e92291a5490e3646aecd3138cd62930f0de64 100644 (file)
@@ -185,6 +185,33 @@ int eloop_cancel_timeout(eloop_timeout_handler handler,
 }
 
 
+int eloop_cancel_timeout_one(eloop_timeout_handler handler,
+                            void *eloop_data, void *user_data,
+                            struct os_time *remaining)
+{
+       struct eloop_timeout *timeout, *prev;
+       int removed = 0;
+       struct os_time now;
+
+       os_get_time(&now);
+       remaining->sec = remaining->usec = 0;
+
+       dl_list_for_each_safe(timeout, prev, &eloop.timeout,
+                             struct eloop_timeout, list) {
+               if (timeout->handler == handler &&
+                   (timeout->eloop_data == eloop_data) &&
+                   (timeout->user_data == user_data)) {
+                       removed = 1;
+                       if (os_time_before(&now, &timeout->time))
+                               os_time_sub(&timeout->time, &now, remaining);
+                       eloop_remove_timeout(timeout);
+                       break;
+               }
+       }
+       return removed;
+}
+
+
 int eloop_is_timeout_registered(eloop_timeout_handler handler,
                                void *eloop_data, void *user_data)
 {
index 206f1c38a99e35fec67310a37d9f262709170b36..eda412f1b50feb10dd27e222ef46f18a7857875c 100644 (file)
@@ -311,6 +311,33 @@ int eloop_cancel_timeout(eloop_timeout_handler handler,
 }
 
 
+int eloop_cancel_timeout_one(eloop_timeout_handler handler,
+                            void *eloop_data, void *user_data,
+                            struct os_time *remaining)
+{
+       struct eloop_timeout *timeout, *prev;
+       int removed = 0;
+       struct os_time now;
+
+       os_get_time(&now);
+       remaining->sec = remaining->usec = 0;
+
+       dl_list_for_each_safe(timeout, prev, &eloop.timeout,
+                             struct eloop_timeout, list) {
+               if (timeout->handler == handler &&
+                   (timeout->eloop_data == eloop_data) &&
+                   (timeout->user_data == user_data)) {
+                       removed = 1;
+                       if (os_time_before(&now, &timeout->time))
+                               os_time_sub(&timeout->time, &now, remaining);
+                       eloop_remove_timeout(timeout);
+                       break;
+               }
+       }
+       return removed;
+}
+
+
 int eloop_is_timeout_registered(eloop_timeout_handler handler,
                                void *eloop_data, void *user_data)
 {