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:
parent
328bc71776
commit
c869536ce9
4 changed files with 96 additions and 0 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue