From: Vsevolod Stakhov Date: Fri, 19 Aug 2022 16:47:07 +0000 (+0100) Subject: [Minor] Implement C API to obtain timeouts information X-Git-Tag: 3.3~67 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=256a3e0a2967893ba3106fd99f64d16e5b7d21e9;p=rspamd.git [Minor] Implement C API to obtain timeouts information --- diff --git a/src/libserver/rspamd_symcache.h b/src/libserver/rspamd_symcache.h index ee3f4862a..597245ca7 100644 --- a/src/libserver/rspamd_symcache.h +++ b/src/libserver/rspamd_symcache.h @@ -542,6 +542,30 @@ const struct rspamd_symcache_item_stat * */ void rspamd_symcache_enable_profile (struct rspamd_task *task); +struct rspamd_symcache_timeout_item { + double timeout; + const struct rspamd_symcache_item *item; +}; + +struct rspamd_symcache_timeout_result { + double max_timeout; + struct rspamd_symcache_timeout_item *items; + size_t nitems; +}; +/** + * Gets maximum timeout announced by symbols cache + * @param cache + * @return new symcache timeout_result structure, that should be freed by call + * `rspamd_symcache_timeout_result_free` + */ +struct rspamd_symcache_timeout_result* rspamd_symcache_get_max_timeout(struct rspamd_symcache *cache); + +/** + * Frees results obtained from the previous function + * @param res + */ +void rspamd_symcache_timeout_result_free(struct rspamd_symcache_timeout_result *res); + /** * Destroy internal state of the symcache runtime * @param task diff --git a/src/libserver/symcache/symcache_c.cxx b/src/libserver/symcache/symcache_c.cxx index bd1c1abc4..f957aa9b6 100644 --- a/src/libserver/symcache/symcache_c.cxx +++ b/src/libserver/symcache/symcache_c.cxx @@ -491,6 +491,32 @@ void rspamd_symcache_enable_symbol_static (struct rspamd_symcache *cache, real_cache->enable_symbol_delayed(symbol); } +/* A real structure to match C results without extra copying */ +struct rspamd_symcache_real_timeout_result { + struct rspamd_symcache_timeout_result c_api_result; + std::vector> elts; +}; + +struct rspamd_symcache_timeout_result* +rspamd_symcache_get_max_timeout(struct rspamd_symcache *cache) +{ + auto *real_cache = C_API_SYMCACHE(cache); + auto *res = new rspamd_symcache_real_timeout_result; + + res->c_api_result.max_timeout = real_cache->get_max_timeout(res->elts); + res->c_api_result.items = reinterpret_cast(res->elts.data()); + res->c_api_result.nitems = res->elts.size(); + + return &res->c_api_result; +} + +void +rspamd_symcache_timeout_result_free(struct rspamd_symcache_timeout_result *res) +{ + auto *real_result = reinterpret_cast(res); + delete real_result; +} + gboolean rspamd_symcache_is_checked(struct rspamd_task *task, struct rspamd_symcache *cache,