From: Shanmugam S (shanms) Date: Tue, 31 Jan 2023 16:34:00 +0000 (+0000) Subject: Pull request #3748: main: Avoid race conditions when accessing id to tid map X-Git-Tag: 3.1.55.0~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5e6b1bb45e8d519bb5ebda0d9b807706969e2b66;p=thirdparty%2Fsnort3.git Pull request #3748: main: Avoid race conditions when accessing id to tid map Merge in SNORT/snort3 from ~AMUTTUVA/snort3:fix_race_tid to master Squashed commit of the following: commit 0cf251b8ff63df57a9bae11d31ef16b7c3bad3e0 Author: Akhilesh MY Date: Tue Jan 24 04:08:15 2023 -0500 main: Avoid race conditions when accessing id to tid map --- diff --git a/src/main/analyzer.cc b/src/main/analyzer.cc index 9ee93eb14..9de9399e3 100644 --- a/src/main/analyzer.cc +++ b/src/main/analyzer.cc @@ -67,7 +67,6 @@ #include "time/packet_time.h" #include "trace/trace_api.h" #include "utils/stats.h" -#include "utils/util.h" #include "analyzer_command.h" #include "oops_handler.h" @@ -743,7 +742,7 @@ void Analyzer::operator()(Swapper* ps, uint16_t run_num) // init here to pin separately from packet threads DetectionEngine::thread_init(); - SnortConfig::get_conf()->thread_config->set_instance_tid(id, (int)gettid()); + SnortConfig::get_conf()->thread_config->set_instance_tid(id); // Perform all packet thread initialization actions that need to be taken with escalated // privileges prior to starting the DAQ module. SnortConfig::get_conf()->thread_config->implement_thread_affinity( diff --git a/src/main/test/distill_verdict_stubs.h b/src/main/test/distill_verdict_stubs.h index 48d825a1f..10d84f943 100644 --- a/src/main/test/distill_verdict_stubs.h +++ b/src/main/test/distill_verdict_stubs.h @@ -224,7 +224,7 @@ InspectionPolicy* get_inspection_policy() { return nullptr; } Flow::Flow() = default; Flow::~Flow() = default; void ThreadConfig::implement_thread_affinity(SThreadType, unsigned) { } -void ThreadConfig::set_instance_tid(const int, const int) { } +void ThreadConfig::set_instance_tid(int) { } } void memory::MemoryCap::thread_init() { } diff --git a/src/main/thread_config.cc b/src/main/thread_config.cc index 0051ae972..f930d3dd9 100644 --- a/src/main/thread_config.cc +++ b/src/main/thread_config.cc @@ -43,6 +43,8 @@ static hwloc_topology_t topology = nullptr; static hwloc_cpuset_t process_cpuset = nullptr; static const struct hwloc_topology_support* topology_support = nullptr; static unsigned instance_max = 1; +static std::mutex instance_mutex; +static std::map instance_id_to_tid; struct CpuSet { @@ -162,13 +164,15 @@ void ThreadConfig::set_named_thread_affinity(const string& name, CpuSet* cpuset) ParseWarning(WARN_CONF, "This platform does not support setting thread affinity.\n"); } -void ThreadConfig::set_instance_tid(int id, int tid) +void ThreadConfig::set_instance_tid(int id) { - instance_id_to_tid.emplace(id,tid); + std::lock_guard lock(instance_mutex); + instance_id_to_tid.emplace(id, (int)gettid()); } -int ThreadConfig::get_instance_tid(int id) const +int ThreadConfig::get_instance_tid(int id) { + std::lock_guard lock(instance_mutex); int ret = -1; auto iter = instance_id_to_tid.find(id); if ( iter != instance_id_to_tid.end() ) diff --git a/src/main/thread_config.h b/src/main/thread_config.h index 602f6a038..acabe85d3 100644 --- a/src/main/thread_config.h +++ b/src/main/thread_config.h @@ -39,14 +39,14 @@ public: static unsigned get_instance_max(); static void term(); static void start_watchdog(); + static void set_instance_tid(int); + static int get_instance_tid(int); ~ThreadConfig(); void set_thread_affinity(SThreadType, unsigned id, CpuSet*); void set_named_thread_affinity(const std::string&, CpuSet*); void implement_thread_affinity(SThreadType, unsigned id); void implement_named_thread_affinity(const std::string& name); - void set_instance_tid(int, int); - int get_instance_tid(int) const; static constexpr unsigned int DEFAULT_THREAD_ID = 0; @@ -69,7 +69,6 @@ private: }; std::map thread_affinity; std::map named_thread_affinity; - std::map instance_id_to_tid; }; }