Patchwork [1/2] eloop: Add a timer cancel that returns the remaining time

login
register
mail settings
Submitter Pontus Fuchs
Date Feb. 1, 2013, 12:24 p.m.
Message ID <1359721462-3780-2-git-send-email-pontus.fuchs@gmail.com>
Download mbox | patch
Permalink /patch/217445/
State Accepted
Commit c869536ce9ed0755ff0138ccdafeae8a996a5e3a
Headers show

Comments

Pontus Fuchs - Feb. 1, 2013, 12:24 p.m.
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 |   27 +++++++++++++++++++++++++++
 src/utils/eloop.h |   15 +++++++++++++++
 2 files changed, 42 insertions(+)

Patch

diff --git a/src/utils/eloop.c b/src/utils/eloop.c
index d01ae64..8ee4fec 100644
--- a/src/utils/eloop.c
+++ b/src/utils/eloop.c
@@ -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)
 {
diff --git a/src/utils/eloop.h b/src/utils/eloop.h
index db03a73..53f5d39 100644
--- a/src/utils/eloop.h
+++ b/src/utils/eloop.h
@@ -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 in remaining.
+ */
+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