Merge in SNORT/snort3 from ~AMUTTUVA/snort3:fix_race_tid to master
Squashed commit of the following:
commit
0cf251b8ff63df57a9bae11d31ef16b7c3bad3e0
Author: Akhilesh MY <amuttuva@cisco.com>
Date: Tue Jan 24 04:08:15 2023 -0500
main: Avoid race conditions when accessing id to tid map
#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"
// 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(
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() { }
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<int, int> instance_id_to_tid;
struct 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<std::mutex> 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<std::mutex> lock(instance_mutex);
int ret = -1;
auto iter = instance_id_to_tid.find(id);
if ( iter != instance_id_to_tid.end() )
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;
};
std::map<TypeIdPair, CpuSet*, TypeIdPairComparer> thread_affinity;
std::map<std::string, CpuSet*> named_thread_affinity;
- std::map<int, int> instance_id_to_tid;
};
}