diff --git a/src/utils/eloop.c b/src/utils/eloop.c index d01ae64f8..2de3e0140 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 db03a7355..0037c6355 100644 --- a/src/utils/eloop.h +++ b/src/utils/eloop.h @@ -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 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 diff --git a/src/utils/eloop_none.c b/src/utils/eloop_none.c index 93049b308..cb5e92291 100644 --- a/src/utils/eloop_none.c +++ b/src/utils/eloop_none.c @@ -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) { diff --git a/src/utils/eloop_win.c b/src/utils/eloop_win.c index 206f1c38a..eda412f1b 100644 --- a/src/utils/eloop_win.c +++ b/src/utils/eloop_win.c @@ -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) {