]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Implement C API to obtain timeouts information
authorVsevolod Stakhov <vsevolod@rspamd.com>
Fri, 19 Aug 2022 16:47:07 +0000 (17:47 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Fri, 19 Aug 2022 16:47:07 +0000 (17:47 +0100)
src/libserver/rspamd_symcache.h
src/libserver/symcache/symcache_c.cxx

index ee3f4862a9c7bd96ea4e5fa5c33ea8d2c90ea6f9..597245ca7d6508f7b89b3f233b3f78130478f16e 100644 (file)
@@ -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
index bd1c1abc4e9b98db3a0ceb1a8743e97ee2e625fb..f957aa9b67a78958356276c2fb21d3413357b9c6 100644 (file)
@@ -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<std::pair<double, const rspamd::symcache::cache_item *>> 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<struct rspamd_symcache_timeout_item *>(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<rspamd_symcache_real_timeout_result *>(res);
+       delete real_result;
+}
+
 gboolean
 rspamd_symcache_is_checked(struct rspamd_task *task,
                                                   struct rspamd_symcache *cache,