gpointer ud;
rspamd_mempool_t *pool;
struct rspamd_task *task;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct rdns_request *req;
struct rdns_reply *reply;
};
struct rspamd_config;
struct rspamd_symcache;
struct rspamd_worker;
+struct rspamd_symcache_dynamic_item;
struct rspamd_symcache_item;
struct rspamd_config_settings_elt;
typedef void (*symbol_func_t) (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
gpointer user_data);
enum rspamd_symbol_type {
* @param cache
* @param symbol
*/
-void rspamd_symcache_inc_frequency (struct rspamd_symcache *cache,
+void rspamd_symcache_inc_frequency (struct rspamd_symcache *_cache,
struct rspamd_symcache_item *item);
/**
* @param task
* @return
*/
-struct rspamd_symcache_item *rspamd_symcache_get_cur_item (struct rspamd_task *task);
+struct rspamd_symcache_dynamic_item *rspamd_symcache_get_cur_item (struct rspamd_task *task);
/**
* Replaces the current item being processed.
* @param item
* @return
*/
-struct rspamd_symcache_item *rspamd_symcache_set_cur_item (struct rspamd_task *task,
- struct rspamd_symcache_item *item);
+struct rspamd_symcache_dynamic_item *rspamd_symcache_set_cur_item (struct rspamd_task *task,
+ struct rspamd_symcache_dynamic_item *item);
/**
* Finalize the current async element potentially calling its deps
*/
void rspamd_symcache_finalize_item (struct rspamd_task *task,
- struct rspamd_symcache_item *item);
+ struct rspamd_symcache_dynamic_item *item);
/*
* Increase number of async events pending for an item
*/
guint rspamd_symcache_item_async_inc_full (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
const gchar *subsystem,
const gchar *loc);
* Decrease number of async events pending for an item, asserts if no events pending
*/
guint rspamd_symcache_item_async_dec_full (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
const gchar *subsystem,
const gchar *loc);
* @return
*/
gboolean rspamd_symcache_item_async_dec_check_full (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
const gchar *subsystem,
const gchar *loc);
#define C_API_SYMCACHE(ptr) (reinterpret_cast<rspamd::symcache::symcache *>(ptr))
#define C_API_SYMCACHE_RUNTIME(ptr) (reinterpret_cast<rspamd::symcache::symcache_runtime *>(ptr))
#define C_API_SYMCACHE_ITEM(ptr) (reinterpret_cast<rspamd::symcache::cache_item *>(ptr))
+#define C_API_SYMCACHE_DYN_ITEM(ptr) (reinterpret_cast<rspamd::symcache::cache_dynamic_item *>(ptr))
void
rspamd_symcache_destroy(struct rspamd_symcache *cache)
return cache_runtime->is_symbol_enabled(task, *real_cache, symbol);
}
-struct rspamd_symcache_item *
+struct rspamd_symcache_dynamic_item *
rspamd_symcache_get_cur_item(struct rspamd_task *task)
{
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
return nullptr;
}
- return (struct rspamd_symcache_item *) cache_runtime->get_cur_item();
+ return (struct rspamd_symcache_dynamic_item *) cache_runtime->get_cur_item();
}
-struct rspamd_symcache_item *
-rspamd_symcache_set_cur_item(struct rspamd_task *task, struct rspamd_symcache_item *item)
+struct rspamd_symcache_dynamic_item *
+rspamd_symcache_set_cur_item(struct rspamd_task *task, struct rspamd_symcache_dynamic_item *item)
{
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
- auto *real_item = C_API_SYMCACHE_ITEM(item);
+ auto *real_dyn_item = C_API_SYMCACHE_DYN_ITEM(item);
- if (!cache_runtime || !real_item) {
+ if (!cache_runtime || !real_dyn_item) {
return nullptr;
}
- return (struct rspamd_symcache_item *) cache_runtime->set_cur_item(real_item);
+ return (struct rspamd_symcache_dynamic_item *) cache_runtime->set_cur_item(real_dyn_item);
}
void
guint
rspamd_symcache_item_async_inc_full(struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
const gchar *subsystem,
const gchar *loc)
{
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
- auto *real_item = C_API_SYMCACHE_ITEM(item);
+ auto *real_dyn_item = C_API_SYMCACHE_DYN_ITEM(item);
- auto *dyn_item = cache_runtime->get_dynamic_item(real_item->id, true);
+ auto *static_item = cache_runtime->get_item_by_dynamic_item(real_dyn_item);
msg_debug_cache_task("increase async events counter for %s(%d) = %d + 1; "
"subsystem %s (%s)",
- real_item->symbol.c_str(), real_item->id,
- dyn_item->async_events, subsystem, loc);
+ static_item->symbol.c_str(), static_item->id,
+ real_dyn_item->async_events, subsystem, loc);
- return ++dyn_item->async_events;
+ return ++real_dyn_item->async_events;
}
guint
rspamd_symcache_item_async_dec_full(struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
const gchar *subsystem,
const gchar *loc)
{
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
- auto *real_item = C_API_SYMCACHE_ITEM(item);
+ auto *real_dyn_item = C_API_SYMCACHE_DYN_ITEM(item);
- auto *dyn_item = cache_runtime->get_dynamic_item(real_item->id, true);
+ auto *static_item = cache_runtime->get_item_by_dynamic_item(real_dyn_item);
msg_debug_cache_task("increase async events counter for %s(%d) = %d + 1; "
"subsystem %s (%s)",
- real_item->symbol.c_str(), real_item->id,
- dyn_item->async_events, subsystem, loc);
- g_assert(dyn_item->async_events > 0);
+ static_item->symbol.c_str(), static_item->id,
+ real_dyn_item->async_events, subsystem, loc);
+ g_assert(real_dyn_item->async_events > 0);
- return --dyn_item->async_events;
+ return --real_dyn_item->async_events;
}
gboolean
rspamd_symcache_item_async_dec_check_full(struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
const gchar *subsystem,
const gchar *loc)
{
void
rspamd_symcache_finalize_item(struct rspamd_task *task,
- struct rspamd_symcache_item *item)
+ struct rspamd_symcache_dynamic_item *item)
{
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
auto *real_item = C_API_SYMCACHE_ITEM(item);
#include "symcache_id_list.hxx"
#include "contrib/expected/expected.hpp"
#include "contrib/libev/ev.h"
+#include "symcache_runtime.hxx"
namespace rspamd::symcache {
conditions.emplace_back(L, cbref);
}
- auto call(struct rspamd_task *task, struct rspamd_symcache_item *item) const -> void
+ auto call(struct rspamd_task *task, struct rspamd_symcache_dynamic_item *item) const -> void
{
func(task, item, user_data);
}
return false;
}
- auto call(struct rspamd_task *task) const -> void {
+ auto call(struct rspamd_task *task, cache_dynamic_item *dyn_item) const -> void {
if (std::holds_alternative<normal_item>(specific)) {
const auto &filter_data = std::get<normal_item>(specific);
- filter_data.call(task, (struct rspamd_symcache_item *)this);
+ filter_data.call(task, (struct rspamd_symcache_dynamic_item *)dyn_item);
}
}
profile_start) * 1e3;
}
dyn_item->async_events = 0;
- cur_item = item;
+ cur_item = dyn_item;
items_inflight++;
/* Callback now must finalize itself */
- item->call(task);
+ item->call(task, dyn_item);
cur_item = nullptr;
if (items_inflight == 0) {
}
}
+auto
+symcache_runtime::get_item_by_dynamic_item(cache_dynamic_item *dyn_item) const -> cache_item *
+{
+ auto idx = dyn_item - dynamic_items;
+
+ if (idx >= 0 && idx < order->size()) {
+ return order->d[idx].get();
+ }
+
+ msg_err("internal error: invalid index to get: %d", (int)idx);
+
+ return nullptr;
+}
+
}
struct ::rspamd_scan_result *rs;
- struct cache_item *cur_item;
+ struct cache_dynamic_item *cur_item;
order_generation_ptr order;
/* Cache of the last items to speed up lookups */
mutable std::pair<int, int> last_id_mappings[8];
* @param item
* @return
*/
- auto set_cur_item(cache_item *item) -> auto {
+ auto set_cur_item(cache_dynamic_item *item) -> auto {
std::swap(item, cur_item);
return item;
}
*/
auto get_dynamic_item(int id, bool save_in_cache) const -> cache_dynamic_item *;
+ /**
+ * Returns static cache item by dynamic cache item
+ * @return
+ */
+ auto get_item_by_dynamic_item(cache_dynamic_item *) const -> cache_item *;
+
/**
* Process symbols in the cache
* @param task
/* Dynamic data */
gint stack_level;
gint order;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
};
/*
static void
lua_metric_symbol_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
gpointer ud)
{
struct lua_callback_data *cd = ud;
static void
lua_metric_symbol_callback_coro (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
gpointer ud)
{
struct lua_callback_data *cd = ud;
struct thread_entry *thread;
struct rspamd_task *task;
struct rspamd_dns_resolver *resolver;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct rspamd_async_session *s;
};
gint cbref;
gchar *to_resolve;
gchar *user_str;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct rspamd_async_session *s;
};
struct rspamd_task *task = NULL;
GError *err = NULL;
gboolean forced = FALSE;
- struct rspamd_symcache_item *item = NULL;
+ struct rspamd_symcache_dynamic_item *item = NULL;
/* Check arguments */
if (!rspamd_lua_parse_table_arguments (L, first, &err,
struct lua_http_cbdata {
struct rspamd_http_connection *conn;
struct rspamd_async_session *session;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct rspamd_http_message *msg;
struct ev_loop *event_loop;
struct rspamd_config *cfg;
lua_http_dns_handler (struct rdns_reply *reply, gpointer ud)
{
struct lua_http_cbdata *cbd = (struct lua_http_cbdata *)ud;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct rspamd_task *task;
task = cbd->task;
struct lua_redis_userdata {
redisAsyncContext *ctx;
struct rspamd_task *task;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct rspamd_async_session *s;
struct ev_loop *event_loop;
struct rspamd_config *cfg;
struct lua_redis_result {
gboolean is_error;
gint result_ref;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct rspamd_async_session *s;
struct rspamd_task *task;
struct lua_redis_request_specific_userdata *sp_ud;
struct rspamd_lua_spf_cbdata {
struct rspamd_task *task;
lua_State *L;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
gint cbref;
ref_entry_t ref;
};
};
static void
-tokens_foreach_cb (struct rspamd_symcache_item *item, gpointer ud)
+tokens_foreach_cb (struct rspamd_symcache_dynamic_item *item, gpointer ud)
{
struct tokens_foreach_cbdata *cbd = ud;
struct rspamd_symbol_result *s;
struct lua_tcp_dtor *dtors;
ref_entry_t ref;
struct rspamd_task *task;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct thread_entry *thread;
struct rspamd_config *cfg;
struct rspamd_ssl_connection *ssl_conn;
struct rspamd_task *task;
rspamd_mempool_t *pool;
rspamd_inet_addr_t *addr;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct rspamd_async_session *s;
struct iovec *iov;
lua_State *L;
}
static void chartable_symbol_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *unused);
static void chartable_url_symbol_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *unused);
gint
static void
chartable_symbol_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *unused)
{
guint i;
static void
chartable_url_symbol_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *unused)
{
/* XXX: TODO: unbreak module once URLs unicode project is over */
struct rspamd_dkim_check_result *res;
gdouble mult_allow;
gdouble mult_deny;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct dkim_check_result *next, *prev, *first;
};
static void dkim_symbol_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *unused);
static void dkim_sign_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *unused);
static gint lua_dkim_sign_handler (lua_State *L);
static void
dkim_symbol_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *unused)
{
rspamd_dkim_context_t *ctx;
GPtrArray *commands;
GPtrArray *results;
struct rspamd_task *task;
- struct rspamd_symcache_item *item;
+ struct rspamd_symcache_dynamic_item *item;
struct upstream *server;
struct fuzzy_rule *rule;
struct ev_loop *event_loop;
static const char *default_headers = "Subject,Content-Type,Reply-To,X-Mailer";
static void fuzzy_symbol_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *unused);
/* Initialization */
/* This callback is called when we check message in fuzzy hashes storage */
static void
fuzzy_symbol_callback (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *unused)
{
struct fuzzy_rule *rule;
};
static void process_regexp_item (struct rspamd_task *task,
- struct rspamd_symcache_item *item,
+ struct rspamd_symcache_dynamic_item *item,
void *user_data);
static void
process_regexp_item (struct rspamd_task *task,
- struct rspamd_symcache_item *symcache_item,
+ struct rspamd_symcache_dynamic_item *symcache_item,
void *user_data)
{
struct regexp_module_item *item = user_data;