From db297c384562aa51b976d3efe55e3c71f63cd265 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Wed, 18 Nov 2020 17:06:57 +0000 Subject: [PATCH] Dataest & Co: Clear server side caches on internal server reboot resolves #77 --- include/FluidSCWrapper.hpp | 30 ++++++++++++++++++- .../Classes/FluidManipulationClient.sc | 9 ++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/include/FluidSCWrapper.hpp b/include/FluidSCWrapper.hpp index cc6c8eb..75b0458 100644 --- a/include/FluidSCWrapper.hpp +++ b/include/FluidSCWrapper.hpp @@ -698,6 +698,7 @@ struct LifetimePolicy } static void destroyClass(Unit* unit) { static_cast(unit)->~Wrapper(); } static void setup(InterfaceTable*, const char*){} + static void unload(){} }; /// Model objects @@ -763,7 +764,18 @@ struct LifetimePolicy auto pos = mRegistry.find(objectID); if(pos != mRegistry.end()) mRegistry.erase(objectID); }, &mRegistry); + + auto flushName = std::stringstream(); + flushName << "flush" << name; + + ft->fDefinePlugInCmd(flushName.str().c_str(), + [](World*, void*, sc_msg_iter*,void*) + { + unload(); + },nullptr); } + + static void unload(){ mRegistry.clear(); } private: static std::unordered_map mRegistry; @@ -825,8 +837,24 @@ struct LifetimePolicy mClientRegistry.erase(objectName); mParamsRegistry.erase(objectName); }, &mClientRegistry); - + + + auto flushName = std::stringstream(); + flushName << "flush" << name; + + ft->fDefinePlugInCmd(flushName.str().c_str(), + [](World*, void*, sc_msg_iter*,void*) + { + unload(); + },nullptr); } + + static void unload() + { + mClientRegistry.clear(); + mParamsRegistry.clear(); + } + private: static ClientPointer getClientPointer(Wrapper* wrapper) { diff --git a/release-packaging/Classes/FluidManipulationClient.sc b/release-packaging/Classes/FluidManipulationClient.sc index c39bebb..abf6015 100644 --- a/release-packaging/Classes/FluidManipulationClient.sc +++ b/release-packaging/Classes/FluidManipulationClient.sc @@ -53,9 +53,18 @@ FluidManipulationClient { if(server.serverRunning.not,{ (this.asString + "– server not running").error; ^nil }); + + NotificationCenter.register(server, \newAllocators, this, { + this.flush(server); + }); + ^super.newCopyArgs(server ?? {Server.default});//.baseinit(objectID,*args) } + *flush { |s| + s.sendMsg("/cmd","flush"++this.name); + } + makeDef { |defName,objectID,args| var initialVals = []; args!? { if(args.size > 0) {initialVals = args.unlace(2)[1].flatten}};