eloop: Add a timer cancel that returns the remaining time

This new cancel timer will give back the remaining time if it was
pending.

Signed-hostap: Pontus Fuchs <pontus.fuchs@gmail.com>
This commit is contained in:
Pontus Fuchs 2013-02-03 17:17:08 +02:00 committed by Jouni Malinen
parent 328bc71776
commit c869536ce9
4 changed files with 96 additions and 0 deletions

View 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, int eloop_is_timeout_registered(eloop_timeout_handler handler,
void *eloop_data, void *user_data) void *eloop_data, void *user_data)
{ {

View file

@ -194,6 +194,21 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs,
int eloop_cancel_timeout(eloop_timeout_handler handler, int eloop_cancel_timeout(eloop_timeout_handler handler,
void *eloop_data, void *user_data); 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 * eloop_is_timeout_registered - Check if a timeout is already registered
* @handler: Matching callback function * @handler: Matching callback function

View 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, int eloop_is_timeout_registered(eloop_timeout_handler handler,
void *eloop_data, void *user_data) void *eloop_data, void *user_data)
{ {

View 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, int eloop_is_timeout_registered(eloop_timeout_handler handler,
void *eloop_data, void *user_data) void *eloop_data, void *user_data)
{ {