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 d01ae64..2de3e01 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 db03a73..0037c63 100644 (file)
@@ -195,6 +195,21 @@ 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
  * @eloop_data: Matching eloop_data
index 93049b3..cb5e922 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 206f1c3..eda412f 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)
 {