RS_ASSERT(ret);
}
- if (request->event) {
- ret = fr_timer_delete(&request->event);
- if (ret < 0) {
- fr_perror("Failed deleting timer");
- RS_ASSERT(0 == 1);
- }
+ if (fr_timer_armed(request->event)) {
+ FR_TIMER_DELETE(&request->event);
}
fr_packet_free(&request->packet);
*/
fr_pair_list_free(&original->link_vps);
fr_packet_free(&original->linked);
- fr_timer_delete(&original->event);
+ FR_TIMER_DELETE(&original->event);
/*
* ...nope it's the first response to a request.
*/
fr_pair_list_append(&original->expect_vps, &search.expect_vps);
/* Disarm the timer for the cleanup event for the original request */
- fr_timer_delete(&original->event);
+ FR_TIMER_DELETE(&original->event);
/*
* ...nope it's a new request.
*/
fr_assert(!fr_bio_prev(&my->bio));
fr_assert(!fr_bio_next(&my->bio));
- if (unlikely(fr_timer_delete(&my->connect.ev) < 0)) fr_assert_msg(0, "failed deleting connection timer");
-
+ FR_TIMER_DELETE(&my->connect.ev);
if (my->connect.el) {
(void) fr_event_fd_delete(my->connect.el, my->info.socket.fd, FR_EVENT_FILTER_IO);
my->connect.el = NULL;
fr_assert(my->connect.success);
- if (unlikely(fr_timer_delete(&my->connect.ev) < 0)) fr_assert_msg(0, "failed deleting connection timer");
+ FR_TIMER_DELETE(&my->connect.ev);
my->connect.el = NULL;
/*
/*
* Stop any connection timeout.
*/
- if (my->ev) talloc_const_free(&my->ev);
+ FR_TIMER_DELETE(&my->ev);
/*
* Tell the application that the packet BIO is now usable.
*/
int fr_load_generator_stop(fr_load_t *l)
{
- if (!l->ev) return 0;
+ if (!fr_timer_armed(l->ev)) return 0;
return fr_timer_delete(&l->ev);
}
static int track_free(fr_io_track_t *track)
{
- if (track->ev) (void) fr_timer_delete(&track->ev);
-
+ if (fr_cond_assert_msg(fr_timer_delete(&track->ev) == 0, "failed deleting tracking timer")) return -1;
talloc_free_children(track);
fr_assert(track->client->packets > 0);
* struct while the packet is in the outbound
* queue.
*/
- if (old->ev) (void) fr_timer_delete(&old->ev);
+ FR_TIMER_DISARM(old->ev);
return old;
}
if (!fr_rb_delete(client->table, old)) {
fr_assert(0);
}
- if (old->ev) (void) fr_timer_delete(&old->ev);
+ FR_TIMER_DELETE(&old->ev);
talloc_set_destructor(old, track_free);
* connection. It's still in use, so we don't
* want to clean it up.
*/
- if (client->ev) {
- talloc_const_free(client->ev);
+ if (fr_timer_armed(client->ev)) {
+ if (fr_cond_assert_msg(fr_timer_delete(&client->ev) == 0,
+ "failed deleting client timer")) {
+ return -1;
+ }
client->ready_to_delete = false;
}
/*
* The timer is already set, don't do anything.
*/
- if (client->ev) return;
+ if (fr_timer_armed(client->ev)) return;
switch (client->state) {
case PR_CLIENT_CONNECTED:
/*
* Remove the timeout event
*/
- if (query->ev) fr_timer_delete(&query->ev);
-
+ FR_TIMER_DELETE(&query->ev);
query->result = result;
/*
STATE_TRANSITION(CONNECTION_STATE_CLOSED);
- fr_timer_delete(&conn->ev);
+ FR_TIMER_DISARM(conn->ev);
/*
* If there's a close callback, call it, so that the
/*
* Explicit error occurred, delete the connection timer
*/
- fr_timer_delete(&conn->ev);
+ FR_TIMER_DISARM(conn->ev);
/*
* Record what state the connection is currently in
BAD_STATE_TRANSITION(CONNECTION_STATE_HALTED);
}
- fr_timer_delete(&conn->ev);
+ FR_TIMER_DISARM(conn->ev);
STATE_TRANSITION(CONNECTION_STATE_HALTED);
WATCH_PRE(conn);
STATE_TRANSITION(CONNECTION_STATE_CONNECTED);
- fr_timer_delete(&conn->ev);
+ FR_TIMER_DISARM(conn->ev);
WATCH_PRE(conn);
if (conn->open) {
HANDLER_BEGIN(conn, conn->open);
/*
* Explicitly cancel any pending events
*/
- fr_timer_delete(&conn->ev);
+ if (!fr_cond_assert_msg(fr_timer_delete(&conn->ev) == 0, "failed deleting connection timer")) {
+ return -1;
+ }
/*
* Don't allow the connection to be
exec->pid = -1;
}
- if (exec->ev) fr_timer_delete(&exec->ev);
+ FR_TIMER_DELETE(&exec->ev);
}
/*
}
exec->pid = -1; /* pid_t is signed */
- if (exec->ev) fr_timer_delete(&exec->ev);
+ FR_TIMER_DELETE(&exec->ev);
/*
* Process exit notifications (EV_PROC) and file
/*
* Child has already exited - unlang can resume
*/
- if (exec->ev) fr_timer_delete(&exec->ev);
+ FR_TIMER_DELETE(&exec->ev);
unlang_interpret_mark_runnable(exec->request);
}
}
if (under_systemd) {
INFO("Informing systemd we're stopping");
sd_notify(0, "STOPPING=1");
- fr_timer_delete(&sd_watchdog_ev);
+ FR_TIMER_DELETE(&sd_watchdog_ev);
}
}
#endif
#include <freeradius-devel/server/trunk.h>
#include <freeradius-devel/server/trigger.h>
+#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/util/misc.h>
#include <freeradius-devel/util/syserror.h>
#include <freeradius-devel/util/minmax_heap.h>
{
trunk_t *trunk = tconn->pub.trunk;
- if (tconn->lifetime_ev) fr_timer_delete(&tconn->lifetime_ev);
+ FR_TIMER_DISARM(tconn->lifetime_ev);
switch (tconn->pub.state) {
case TRUNK_CONN_ACTIVE:
/*
* Remove the reconnect event
*/
- if (fr_time_delta_ispos(trunk->conf.lifetime)) fr_timer_delete(&tconn->lifetime_ev);
+ if (fr_time_delta_ispos(trunk->conf.lifetime)) FR_TIMER_DELETE(&tconn->lifetime_ev);
/*
* Remove the I/O events
* We really don't want this firing after
* we've freed everything.
*/
- fr_timer_delete(&trunk->manage_ev);
+ if (!fr_cond_assert_msg(fr_timer_delete(&trunk->manage_ev) == 0, "failed deleting trunk management event")) {
+ return -1;
+ }
/*
* Now free the connections in each of the lists.
#include <ctype.h>
#include <freeradius-devel/unlang/xlat_priv.h>
+#include <freeradius-devel/util/debug.h>
#include "unlang_priv.h" /* Fixme - Should create a proper semi-public interface for the interpret */
/** State of an xlat expansion
*/
static int _unlang_xlat_event_free(unlang_xlat_event_t *ev)
{
- if (ev->ev) {
- (void) fr_timer_delete(&(ev->ev));
- return 0;
+ if (!fr_cond_assert_msg(fr_timer_delete(&(ev->ev)) == 0, "failed freeing xlat event timer")) {
+ return -1;
}
if (ev->fd >= 0) {
if (!state->event_ctx) MEM(state->event_ctx = talloc_zero(state, bool));
- ev = talloc_zero(state->event_ctx, unlang_xlat_event_t);
- if (unlikely(!ev)) return -1;
-
+ MEM(ev = talloc_zero(state->event_ctx, unlang_xlat_event_t));
ev->request = request;
ev->fd = -1;
ev->timeout = callback;
*/
static int _unlang_xlat_retry_free(unlang_xlat_retry_t *ev)
{
- if (ev->ev) (void) fr_timer_delete(&(ev->ev));
+ if (!fr_cond_assert_msg(fr_timer_delete(&(ev->ev)) == 0, "failed to deleting xlat retry timer")) {
+ return -1;
+ }
return 0;
}
if (!state->event_ctx) MEM(state->event_ctx = talloc_zero(state, bool));
- ev = talloc_zero(state->event_ctx, unlang_xlat_retry_t);
- if (unlikely(!ev)) return XLAT_ACTION_FAIL;
+ MEM(ev = talloc_zero(state->event_ctx, unlang_xlat_retry_t));
ev->request = request;
fr_assert(state->exp->type == XLAT_FUNC);
int fr_timer_disarm(fr_timer_t *ev); /* disarms but does not free */
+#define FR_TIMER_DISARM(_ev) \
+ do { \
+ if (likely((_ev) != NULL) && unlikely(fr_timer_disarm(_ev) < 0)) { \
+ fr_assert_msg(0, "Failed to disarm timer %p", (_ev)); \
+ } \
+ } while (0)
+
int fr_timer_delete(fr_timer_t **ev_p) CC_HINT(nonnull); /* disarms AND frees */
+#define FR_TIMER_DELETE(_ev_p) \
+ do { \
+ if ((likely((*(_ev_p)) != NULL) && unlikely(fr_timer_delete(_ev_p) < 0))) { \
+ fr_assert_msg(0, "Failed to delete timer %p", (_ev_p)); \
+ } \
+ } while (0)
+
fr_time_t fr_timer_when(fr_timer_t *ev) CC_HINT(nonnull);
bool _fr_timer_armed(fr_timer_t *ev);
/*
* Reset the timers.
*/
- fr_timer_delete(&session->ev_packet);
+ FR_TIMER_DISARM(session->ev_packet);
if (fr_time_delta_cmp(session->desired_min_tx_interval, session->remote_min_rx_interval) >= 0) {
interval = fr_time_delta_unwrap(session->desired_min_tx_interval);
uint64_t delay;
fr_time_delta_t delta;
- fr_timer_delete(&session->ev_timeout);
-
delay = fr_time_delta_unwrap(session->detection_time);
delay *= session->detect_multi;
*/
static int bfd_stop_control(bfd_session_t *session)
{
- fr_timer_delete(&session->ev_timeout);
- fr_timer_delete(&session->ev_packet);
+ FR_TIMER_DISARM(session->ev_timeout);
+ FR_TIMER_DISARM(session->ev_packet);
return 1;
}
if (has_worker) return;
- if (thread->ev) fr_timer_delete(&thread->ev);
+ FR_TIMER_DISARM(thread->ev);
work_init(thread, false);
}
u->num_replies = 0; /* Reset */
u->retry.start = fr_time_wrap(0);
- if (u->ev) (void) fr_timer_delete(&u->ev);
+ FR_TIMER_DISARM(u->ev);
bio_request_reset(u);
}
fr_assert(h->fd >= 0);
- if (h->status_u) fr_timer_delete(&h->status_u->ev);
+ if (h->status_u) {
+ if (!fr_cond_assert_msg(fr_timer_delete(&h->status_u->ev) == 0,
+ "failed deleting status check timer")) {
+ return -1;
+ }
+ }
/*
* The connection code will take care of deleting the FD from the event loop.
/*
* Reset the Status-Server checks.
*/
- if (h->status_u && h->status_u->ev) (void) fr_timer_delete(&h->status_u->ev);
- }
+ if (h->status_u) FR_TIMER_DISARM(h->status_u->ev);
break;
default:
break;
}
+ }
return CONNECTION_STATE_INIT;
}
/*
* If we're status checking OR already zombie, don't go to zombie
*/
- if (h->status_checking || h->zombie_ev) return true;
+ if (h->status_checking || fr_timer_armed(h->zombie_ev)) return true;
if (fr_time_eq(now, fr_time_wrap(0))) now = fr_time();
* queued for sendmmsg but never actually
* sent.
*/
- if (u->ev) (void) fr_timer_delete(&u->ev);
+ FR_TIMER_DISARM(u->ev);
}
/*
bio_request_t *u = preq_to_reset;
bio_handle_t *h = talloc_get_type_abort(conn->h, bio_handle_t);
- if (u->ev) (void)fr_timer_delete(&u->ev);
+ FR_TIMER_DISARM(u->ev);
bio_request_reset(u);
if (h->ctx.inst->mode == RLM_RADIUS_MODE_REPLICATE) return;
}
#endif
- fr_assert_msg(!u->ev, "bio_request_t freed with active timer");
+ fr_assert_msg(!fr_timer_armed(u->ev), "bio_request_t freed with active timer");
- if (u->ev) (void) fr_timer_delete(&u->ev);
+ if (!fr_cond_assert_msg(fr_timer_delete(&u->ev) == 0,
+ "failed deleting request timer")) {
+ return -1;
+ }
fr_assert(u->rr == NULL);
switch (notify_on) {
case TRUNK_CONN_EVENT_NONE:
- if (c->read_ev) fr_timer_delete(&c->read_ev);
- if (c->write_ev) fr_timer_delete(&c->write_ev);
+ FR_TIMER_DISARM(c->read_ev);
+ FR_TIMER_DISARM(c->write_ev);
return;
case TRUNK_CONN_EVENT_BOTH:
uint poll_interval = (query_ctx && query_ctx->type != SQL_QUERY_SELECT) ? c->query_interval : c->select_interval;
switch (notify_on) {
case TRUNK_CONN_EVENT_NONE:
- if (c->read_ev) fr_timer_delete(&c->read_ev);
- if (c->write_ev) fr_timer_delete(&c->write_ev);
+ FR_TIMER_DISARM(c->read_ev);
+ FR_TIMER_DISARM(c->write_ev);
return;
case TRUNK_CONN_EVENT_BOTH:
{
rlm_sql_unixodbc_conn_t *c = talloc_get_type_abort(h, rlm_sql_unixodbc_conn_t);
- if (c->read_ev) fr_timer_delete(&c->read_ev);
- if (c->write_ev) fr_timer_delete(&c->write_ev);
-
if (c->stmt) SQLFreeHandle(SQL_HANDLE_STMT, c->stmt);
if (c->dbc) {
uint poll_interval = (query_ctx && query_ctx->type != SQL_QUERY_SELECT) ? c->query_interval : c->select_interval;
switch (notify_on) {
case TRUNK_CONN_EVENT_NONE:
- if (c->read_ev) fr_timer_delete(&c->read_ev);
- if (c->write_ev) fr_timer_delete(&c->write_ev);
+ FR_TIMER_DISARM(c->read_ev);
+ FR_TIMER_DISARM(c->write_ev);
return;
case TRUNK_CONN_EVENT_BOTH:
u->outstanding = false;
h->active--;
- if (u->ev) (void)fr_timer_delete(&u->ev);
+ FR_TIMER_DISARM(u->ev);
/*
* We've sent 255 packets, and received all replies. Shut the connection down.
#define LOG_PREFIX "unbound"
#include <freeradius-devel/server/log.h>
+#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/util/event.h>
#include <freeradius-devel/util/syserror.h>
* that it fired. This is imperfect but unbound
* doesn't have a callback for receiving errors.
*/
- if (fr_timer_delete(&ev->timer) < 0) {
- PERROR("ubound event %p - Failed disarming timeout", ev);
- }
+ FR_TIMER_DISARM(ev->timer);
ev->cb(-1, UB_EV_TIMEOUT, ev->uctx); /* Call libunbound - pretend this is a timeout */
}
if (ev->events & UB_EV_TIMEOUT) {
DEBUG4("unbound event %p - Disarming timeout", ev);
- if (ev->timer && (fr_timer_delete(&ev->timer) < 0)) {
- PERROR("ubound event %p - Failed disarming timeout", ev);
-
+ if (!fr_cond_assert_msg(fr_timer_disarm(ev->timer) == 0, "failed disarming timeout")) {
ret = -1;
}
}
ev, uctx, ev->uctx);
ev->uctx = uctx;
}
- if (ev->timer && (fr_timer_delete(&ev->timer) < 0)) {
- PERROR("ubound event %p - Failed disarming timeout", ev);
-
+ if (!fr_cond_assert_msg(fr_timer_disarm(ev->timer) == 0, "ubound event %p - Failed disarming timeout", ev)) {
ret = -1; /* Continue ? */
}
DEBUG4("unbound event %p - Disarming timeout", ev);
- if (ev->timer && (fr_timer_delete(&ev->timer) < 0)) {
- PERROR("unbound event %p - Failed disarming timeout", ev);
-
- return -1;
- }
+ if (!fr_cond_assert_msg(fr_timer_disarm(ev->timer) == 0, "failed disarming timeout")) return -1;
return 0;
}
* Request has completed remove timeout event and set
* async_id to 0 so ub_cancel() is not called when ur is freed
*/
- if (ur->ev) (void)fr_timer_delete(&ur->ev);
+ FR_TIMER_DISARM(ur->ev);
ur->async_id = 0;
/*
{
unbound_request_t *ur = talloc_get_type_abort(xctx->rctx, unbound_request_t);
- if (ur->ev) (void)fr_timer_delete(&ur->ev);
+ FR_TIMER_DISARM(ur->ev);
RDEBUG2("Forcefully cancelling pending unbound request");
}