#ifdef SHELL
void Request::send_queued_response()
{
- const char* qr = queued_response;
- if ( qr )
+ if ( queued_response )
{
- write_response(qr);
+ write_response(queued_response);
queued_response = nullptr;
}
}
#ifndef REQUEST_H
#define REQUEST_H
-#include <atomic>
-
#include "main/snort_types.h"
class Request
int fd;
char read_buf[1024];
size_t bytes_read;
- std::atomic<const char*> queued_response;
+ const char* queued_response;
};
#endif
#include <algorithm>
#include <cassert>
#include <iostream>
-#include <mutex>
#include <string>
#include <unordered_map>
#include <vector>
static unsigned s_errors = 0;
-std::set<uint32_t> ModuleManager::gids;
+set<uint32_t> ModuleManager::gids;
+mutex ModuleManager::stats_mutex;
static string s_current;
static string s_name;
// for callbacks from Lua
static SnortConfig* s_config = nullptr;
-static std::mutex stats_mutex;
-
// forward decls
extern "C"
{
{
if ( !skip || !strstr(skip, mh->mod->get_name()) )
{
- std::lock_guard<std::mutex> lock(stats_mutex);
+ lock_guard<mutex> lock(stats_mutex);
if ( dynamic )
mh->mod->show_dynamic_stats();
else
for ( auto* mh : mod_hooks )
{
- std::lock_guard<std::mutex> lock(stats_mutex);
+ lock_guard<mutex> lock(stats_mutex);
mh->mod->prep_counts();
mh->mod->sum_stats(true);
}
ModHook* mh = get_hook(name);
if ( mh )
{
- std::lock_guard<std::mutex> lock(stats_mutex);
+ lock_guard<mutex> lock(stats_mutex);
mh->mod->prep_counts();
mh->mod->sum_stats(true);
}
for ( auto* mh : mod_hooks )
{
- std::lock_guard<std::mutex> lock(stats_mutex);
+ lock_guard<mutex> lock(stats_mutex);
mh->mod->reset_stats();
}
}
// Modules are strictly used during parse time.
#include <cstdint>
-#include <set>
#include <list>
+#include <mutex>
+#include <set>
#include "main/snort_types.h"
static void reset_stats(SnortConfig*);
static std::set<uint32_t> gids;
+ SO_PUBLIC static std::mutex stats_mutex;
};
}
#include "base_tracker.h" // FIXIT-W Returning null reference (from <vector>)
+#include "managers/module_manager.h"
+
#ifdef UNIT_TEST
#include "catch/snort_catch.h"
#include "utils/util.h"
write();
- for ( const ModuleConfig& mod : modules )
- if ( !summary )
+ if ( !summary )
+ {
+ for ( const ModuleConfig& mod : modules )
+ {
+ lock_guard<mutex> lock(ModuleManager::stats_mutex);
mod.ptr->sum_stats(false);
+ }
+ }
}
#ifdef UNIT_TEST
{ CountType::SUM, "preemptive_prunes", "sessions pruned during preemptive pruning" },
{ CountType::SUM, "memcap_prunes", "sessions pruned due to memcap" },
{ CountType::SUM, "ha_prunes", "sessions pruned by high availability sync" },
+ { CountType::SUM, "stale_prunes", "sessions pruned due to stale connection" },
{ CountType::SUM, "expected_flows", "total expected flows created within snort" },
{ CountType::SUM, "expected_realized", "number of expected flows realized" },
{ CountType::SUM, "expected_pruned", "number of expected flows pruned" },
stream_base_stats.preemptive_prunes = flow_con->get_prunes(PruneReason::PREEMPTIVE);
stream_base_stats.memcap_prunes = flow_con->get_prunes(PruneReason::MEMCAP);
stream_base_stats.ha_prunes = flow_con->get_prunes(PruneReason::HA);
+ stream_base_stats.stale_prunes = flow_con->get_prunes(PruneReason::STALE);
stream_base_stats.reload_freelist_flow_deletes = flow_con->get_deletes(FlowDeleteState::FREELIST);
stream_base_stats.reload_allowed_flow_deletes = flow_con->get_deletes(FlowDeleteState::ALLOWED);
stream_base_stats.reload_offloaded_flow_deletes= flow_con->get_deletes(FlowDeleteState::OFFLOADED);
PegCount preemptive_prunes;
PegCount memcap_prunes;
PegCount ha_prunes;
+ PegCount stale_prunes;
PegCount expected_flows;
PegCount expected_realized;
PegCount expected_pruned;
CHECK(mem_blocks[i]);
CHECK(mca->get_mem_allocated() == bytes_allocated);
if ( i < MAX_ALLOCATIONS_10000 - 1 )
+ {
CHECK(mca->is_space_available());
+ }
else
+ {
CHECK(!mca->is_space_available());
-
+ }
CHECK(!mca->is_over_capacity());
}
CHECK(mca->get_allocation_requests() == MAX_ALLOCATIONS_10000);