[ntcore] Provide mechanism to reset internals of NT instance (#4653)

This commit is contained in:
Dustin Spicuzza
2022-11-18 13:21:05 -05:00
committed by GitHub
parent 13aceea8dc
commit 388e7a4265
9 changed files with 62 additions and 0 deletions

View File

@@ -174,3 +174,15 @@ std::shared_ptr<INetworkClient> InstanceImpl::GetClient() {
std::scoped_lock lock{m_mutex};
return m_networkClient;
}
void InstanceImpl::Reset() {
std::scoped_lock lock{m_mutex};
m_networkServer.reset();
m_networkClient.reset();
m_servers.clear();
networkMode = NT_NET_MODE_NONE;
listenerStorage.Reset();
// connectionList should have been cleared by destroying networkClient/server
localStorage.Reset();
}

View File

@@ -56,6 +56,8 @@ class InstanceImpl {
std::shared_ptr<NetworkServer> GetServer();
std::shared_ptr<INetworkClient> GetClient();
void Reset();
ListenerStorage listenerStorage;
LoggerImpl logger_impl;
wpi::Logger logger;

View File

@@ -320,6 +320,19 @@ bool ListenerStorage::WaitForListenerQueue(double timeout) {
return wpi::WaitForObject(h, timeout, &timedOut);
}
void ListenerStorage::Reset() {
std::scoped_lock lock{m_mutex};
m_pollers.clear();
m_listeners.clear();
m_connListeners.clear();
m_topicListeners.clear();
m_valueListeners.clear();
m_logListeners.clear();
if (m_thread) {
m_thread.Stop();
}
}
std::vector<std::pair<NT_Listener, unsigned int>>
ListenerStorage::DoRemoveListeners(std::span<const NT_Listener> handles) {
std::vector<std::pair<NT_Listener, unsigned int>> rv;

View File

@@ -59,6 +59,8 @@ class ListenerStorage final : public IListenerStorage {
bool WaitForListenerQueue(double timeout);
void Reset();
private:
// these assume the mutex is already held
NT_Listener DoAddListener(NT_ListenerPoller pollerHandle);

View File

@@ -2187,3 +2187,9 @@ void LocalStorage::StopDataLog(NT_DataLogger logger) {
}
}
}
void LocalStorage::Reset() {
std::scoped_lock lock{m_mutex};
m_impl = std::make_unique<Impl>(m_impl->m_inst, m_impl->m_listenerStorage,
m_impl->m_logger);
}

View File

@@ -209,6 +209,8 @@ class LocalStorage final : public net::ILocalStorage {
std::string_view logPrefix);
void StopDataLog(NT_DataLogger logger);
void Reset();
private:
class Impl;
std::unique_ptr<Impl> m_impl;

View File

@@ -45,6 +45,12 @@ NT_Inst CreateInstance() {
return Handle{InstanceImpl::Alloc(), 0, Handle::kInstance};
}
void ResetInstance(NT_Inst inst) {
if (auto ii = InstanceImpl::GetTyped(inst, Handle::kInstance)) {
ii->Reset();
}
}
void DestroyInstance(NT_Inst inst) {
int i = Handle{inst}.GetTypedInst(Handle::kInstance);
if (i < 0) {