From 34229aab7167c61f8c98854d62eee82fce968f3d Mon Sep 17 00:00:00 2001 From: Ismo Puustinen Date: Tue, 3 Jul 2012 16:14:16 +0300 Subject: [PATCH] signalling: support for transaction timeouts. --- src/plugins/signalling/transaction.c | 25 +++++++++++++++++++++++++ src/plugins/signalling/transaction.h | 7 ++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/plugins/signalling/transaction.c b/src/plugins/signalling/transaction.c index 79ef360..223c3bc 100644 --- a/src/plugins/signalling/transaction.c +++ b/src/plugins/signalling/transaction.c @@ -20,6 +20,9 @@ void free_transaction(transaction_t *tx) { uint i; + if (tx->timer) + mrp_del_timer(tx->timer); + for (i = 0; i < tx->data.n_rows; i++) { mrp_free(tx->data.rows[i]); } @@ -95,6 +98,24 @@ static int is_interested(void *key, void *entry, void *user_data) } +static void signalling_timeout(mrp_mainloop_t *ml, mrp_timer_t *timer, + void *user_data) +{ + uint32_t id = p_to_u(user_data); + data_t *ctx = signalling_plugin->data; + transaction_t *tx; + + MRP_UNUSED(ml); + MRP_UNUSED(timer); + + tx = get_transaction(ctx, id); + + if (tx) { + complete_transaction(ctx, tx); + } +} + + int fire_transaction(data_t *ctx, transaction_t *tx) { /* TODO: make proper queuing */ @@ -108,6 +129,9 @@ int fire_transaction(data_t *ctx, transaction_t *tx) } } + mrp_add_timer(ctx->ctx->ml, tx->timeout, signalling_timeout, + u_to_p(tx->id)); + return 0; } @@ -140,6 +164,7 @@ static uint32_t mrp_tx_open_signal_with_id(uint32_t id) tx->id = id; tx->data.row_array_size = 32; tx->data.rows = mrp_allocz(tx->data.row_array_size); + tx->timeout = MRP_SiGNALLING_DEFAULT_TIMEOUT; tx->data.domain_array_size = 8; tx->data.rows = mrp_allocz(tx->data.domain_array_size); diff --git a/src/plugins/signalling/transaction.h b/src/plugins/signalling/transaction.h index db1c5ff..c5ff10a 100644 --- a/src/plugins/signalling/transaction.h +++ b/src/plugins/signalling/transaction.h @@ -8,6 +8,8 @@ #include "plugin.h" +#define MRP_SiGNALLING_DEFAULT_TIMEOUT 5000 /* msecs */ + typedef struct { char **domains; uint32_t n_domains; @@ -25,7 +27,10 @@ typedef struct { /* an ongoing transaction */ typedef struct { uint32_t id; /* The real ID. */ - uint32_t caller_id; /* Id assigned by caller. */ + uint32_t caller_id; /* TODO: id assigned by caller. */ + uint32_t timeout; + mrp_timer_t *timer; + char **acked; char **nacked; char **not_answered; -- 2.7.4