diff --git a/include/networktables/NetworkTable.h b/include/networktables/NetworkTable.h index beccab3251..73e860a04f 100644 --- a/include/networktables/NetworkTable.h +++ b/include/networktables/NetworkTable.h @@ -1,6 +1,7 @@ #ifndef _NETWORKTABLE_H_ #define _NETWORKTABLE_H_ +#include #include #include "tables/ITable.h" @@ -10,6 +11,7 @@ class NetworkTable : public ITable { struct private_init {}; std::string m_path; + std::mutex m_mutex; typedef std::pair Listener; std::vector m_listeners; diff --git a/src/networktables/NetworkTable.cpp b/src/networktables/NetworkTable.cpp index 200ec5631f..b82f03cb89 100644 --- a/src/networktables/NetworkTable.cpp +++ b/src/networktables/NetworkTable.cpp @@ -65,6 +65,7 @@ void NetworkTable::AddTableListener(ITableListener* listener) { void NetworkTable::AddTableListener(ITableListener* listener, bool immediateNotify) { + std::lock_guard lock(m_mutex); llvm::SmallString<128> path(m_path); path += PATH_SEPARATOR_CHAR; std::size_t prefix_len = path.size(); @@ -83,6 +84,7 @@ void NetworkTable::AddTableListener(ITableListener* listener, void NetworkTable::AddTableListener(StringRef key, ITableListener* listener, bool immediateNotify) { + std::lock_guard lock(m_mutex); llvm::SmallString<128> path(m_path); path += PATH_SEPARATOR_CHAR; std::size_t prefix_len = path.size(); @@ -99,6 +101,7 @@ void NetworkTable::AddTableListener(StringRef key, } void NetworkTable::RemoveTableListener(ITableListener* listener) { + std::lock_guard lock(m_mutex); auto matches_begin = std::remove_if(m_listeners.begin(), m_listeners.end(), [=](const Listener& x) { return x.first == listener; });