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,
|
int eloop_is_timeout_registered(eloop_timeout_handler handler,
|
||||||
void *eloop_data, void *user_data)
|
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,
|
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
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue