From patchwork Fri Feb 1 12:24:21 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1/2] eloop: Add a timer cancel that returns the remaining time From: Pontus Fuchs X-Patchwork-Id: 217445 Message-Id: <1359721462-3780-2-git-send-email-pontus.fuchs@gmail.com> To: hostap@lists.shmoo.com Date: Fri, 1 Feb 2013 13:24:21 +0100 This new cancel timer will give back the remaining time if it was pending. Signed-hostap: Pontus Fuchs --- src/utils/eloop.c | 27 +++++++++++++++++++++++++++ src/utils/eloop.h | 15 +++++++++++++++ 2 files changed, 42 insertions(+) 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 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