Mercurial > dovecot > core-2.2
changeset 21655:cb11cca4eaee
lib-index: Allow multiple hooks for transaction creation
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Mon, 20 Feb 2017 14:34:25 +0200 |
parents | 2c937505c112 |
children | 538853d82926 |
files | src/lib-index/mail-index-transaction-private.h src/lib-index/mail-index-transaction.c |
diffstat | 2 files changed, 39 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-transaction-private.h Tue Feb 21 14:20:22 2017 +0200 +++ b/src/lib-index/mail-index-transaction-private.h Mon Feb 20 14:34:25 2017 +0200 @@ -107,8 +107,10 @@ (array_is_created(&(t)->updates) && array_count(&(t)->updates) > 0) || \ (t)->index_deleted || (t)->index_undeleted) -extern void (*hook_mail_index_transaction_created) - (struct mail_index_transaction *t); +typedef void hook_mail_index_transaction_created_t(struct mail_index_transaction *t); + +void mail_index_transaction_hook_register(const hook_mail_index_transaction_created_t *hook); +void mail_index_transaction_hook_unregister(const hook_mail_index_transaction_created_t *hook); struct mail_index_record * mail_index_transaction_lookup(struct mail_index_transaction *t, uint32_t seq);
--- a/src/lib-index/mail-index-transaction.c Tue Feb 21 14:20:22 2017 +0200 +++ b/src/lib-index/mail-index-transaction.c Mon Feb 20 14:34:25 2017 +0200 @@ -9,9 +9,36 @@ #include "mail-transaction-log-private.h" #include "mail-index-transaction-private.h" +static ARRAY(const hook_mail_index_transaction_created_t *) + hook_mail_index_transaction_created; -void (*hook_mail_index_transaction_created) - (struct mail_index_transaction *t) = NULL; +void mail_index_transaction_hook_register(const hook_mail_index_transaction_created_t *hook) +{ + if (!array_is_created(&hook_mail_index_transaction_created)) + i_array_init(&hook_mail_index_transaction_created, 8); + array_append(&hook_mail_index_transaction_created, &hook, 1); +} + +void mail_index_transaction_hook_unregister(const hook_mail_index_transaction_created_t *hook) +{ + unsigned int idx; + bool found = FALSE; + + i_assert(array_is_created(&hook_mail_index_transaction_created)); + for(idx = 0; idx < array_count(&hook_mail_index_transaction_created); idx++) { + const hook_mail_index_transaction_created_t *const *hook_ptr = + array_idx(&hook_mail_index_transaction_created, idx); + if (*hook_ptr == hook) { + array_delete(&hook_mail_index_transaction_created, idx, 1); + found = TRUE; + break; + } + } + i_assert(found == TRUE); + if (array_count(&hook_mail_index_transaction_created) == 0) + array_free(&hook_mail_index_transaction_created); +} + struct mail_index_view * mail_index_transaction_get_view(struct mail_index_transaction *t) @@ -321,7 +348,11 @@ I_MIN(5, mail_index_module_register.id)); DLLIST_PREPEND(&view->transactions_list, t); - if (hook_mail_index_transaction_created != NULL) - hook_mail_index_transaction_created(t); + if (array_is_created(&hook_mail_index_transaction_created)) { + const hook_mail_index_transaction_created_t *const *ptr; + array_foreach(&hook_mail_index_transaction_created, ptr) { + (*ptr)(t); + } + } return t; }