summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2016-07-26 18:07:13 -0400
committerBernard Normier <bernard@zeroc.com>2016-07-26 18:07:13 -0400
commit6b130bc0088cdb0d55efc1e4f0fe36033bad770a (patch)
treeac9c5ed4272e9b2fbde2f8e9adf72caea1cd1595 /cpp/src
parentICE-7252 - Disable optimizer for non-VC140 builds (diff)
downloadice-6b130bc0088cdb0d55efc1e4f0fe36033bad770a.tar.bz2
ice-6b130bc0088cdb0d55efc1e4f0fe36033bad770a.tar.xz
ice-6b130bc0088cdb0d55efc1e4f0fe36033bad770a.zip
C++11 mapping for PropertiesAdminUpdateCallback
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/Instance.cpp6
-rw-r--r--cpp/src/Ice/PropertiesAdminI.cpp48
-rw-r--r--cpp/src/Ice/PropertiesAdminI.h27
3 files changed, 76 insertions, 5 deletions
diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp
index ae4a2a07a61..cd9feeca62b 100644
--- a/cpp/src/Ice/Instance.cpp
+++ b/cpp/src/Ice/Instance.cpp
@@ -1425,7 +1425,13 @@ IceInternal::Instance::finishSetup(int& argc, char* argv[], const Ice::Communica
//
if(propsAdmin)
{
+#ifdef ICE_CPP11_MAPPING
+ auto metricsAdmin = observer->getFacet();
+ propsAdmin->addUpdateCallback(
+ [metricsAdmin](const PropertyDict& changes) { metricsAdmin->updated(changes); });
+#else
propsAdmin->addUpdateCallback(observer->getFacet());
+#endif
}
}
}
diff --git a/cpp/src/Ice/PropertiesAdminI.cpp b/cpp/src/Ice/PropertiesAdminI.cpp
index a7e6174c79c..3b5198531dd 100644
--- a/cpp/src/Ice/PropertiesAdminI.cpp
+++ b/cpp/src/Ice/PropertiesAdminI.cpp
@@ -21,10 +21,12 @@ const char* traceCategory = "Admin.Properties";
}
+#ifndef ICE_CPP11_MAPPING
PropertiesAdminUpdateCallback::~PropertiesAdminUpdateCallback()
{
// Out of line to avoid weak vtable
}
+#endif
NativePropertiesAdmin::~NativePropertiesAdmin()
{
@@ -198,12 +200,32 @@ PropertiesAdminI::setProperties_async(const AMD_PropertiesAdmin_setPropertiesPtr
//
// Copy the callbacks to allow callbacks to update the callbacks.
//
+
+#ifdef ICE_CPP11_MAPPING
+ auto callbacks = _updateCallbacks;
+#else
vector<PropertiesAdminUpdateCallbackPtr> callbacks = _updateCallbacks;
+#endif
+
if(!callbacks.empty())
{
PropertyDict changes = added;
changes.insert(changed.begin(), changed.end());
changes.insert(removed.begin(), removed.end());
+
+#ifdef ICE_CPP11_MAPPING
+ for(const auto& cb: callbacks)
+ {
+ try
+ {
+ cb(changes);
+ }
+ catch(...)
+ {
+ // Ignore.
+ }
+ }
+#else
for(vector<PropertiesAdminUpdateCallbackPtr>::const_iterator p = callbacks.begin(); p != callbacks.end(); ++p)
{
try
@@ -215,9 +237,33 @@ PropertiesAdminI::setProperties_async(const AMD_PropertiesAdmin_setPropertiesPtr
// Ignore.
}
}
+#endif
}
}
+
+#ifdef ICE_CPP11_MAPPING
+
+std::function<void()>
+PropertiesAdminI::addUpdateCallback(std::function<void(const Ice::PropertyDict&)> cb)
+{
+ Lock sync(*this);
+
+ auto p = _updateCallbacks.insert(_updateCallbacks.end(), std::move(cb));
+ auto propertiesAdmin = shared_from_this();
+
+ return [p, propertiesAdmin] { propertiesAdmin->removeUpdateCallback(p); };
+}
+
+void
+PropertiesAdminI::removeUpdateCallback(std::list<std::function<void(const Ice::PropertyDict&)>>::iterator p)
+{
+ Lock sync(*this);
+ _updateCallbacks.erase(p);
+}
+
+#else
+
void
PropertiesAdminI::addUpdateCallback(const PropertiesAdminUpdateCallbackPtr& cb)
{
@@ -232,4 +278,6 @@ PropertiesAdminI::removeUpdateCallback(const PropertiesAdminUpdateCallbackPtr& c
_updateCallbacks.erase(remove(_updateCallbacks.begin(), _updateCallbacks.end(), cb), _updateCallbacks.end());
}
+#endif
+
}
diff --git a/cpp/src/Ice/PropertiesAdminI.h b/cpp/src/Ice/PropertiesAdminI.h
index 6e852c7b583..8fcdc891cfe 100644
--- a/cpp/src/Ice/PropertiesAdminI.h
+++ b/cpp/src/Ice/PropertiesAdminI.h
@@ -16,36 +16,53 @@
#include <Ice/NativePropertiesAdmin.h>
#include <Ice/LoggerF.h>
+#ifdef ICE_CPP11_MAPPING
+#include <list>
+#endif
+
namespace IceInternal
{
-class PropertiesAdminI : public Ice::PropertiesAdmin, public Ice::NativePropertiesAdmin, private IceUtil::RecMutex
+class PropertiesAdminI : public Ice::PropertiesAdmin, public Ice::NativePropertiesAdmin,
+#ifdef ICE_CPP11_MAPPING
+ public std::enable_shared_from_this<PropertiesAdminI>,
+#endif
+ private IceUtil::RecMutex
{
public:
PropertiesAdminI(const Ice::PropertiesPtr&, const Ice::LoggerPtr&);
#ifdef ICE_CPP11_MAPPING
- virtual std::string getProperty(std::string, const Ice::Current&);
- virtual Ice::PropertyDict getPropertiesForPrefix(std::string, const Ice::Current&);
+ virtual std::string getProperty(std::string, const Ice::Current&) override;
+ virtual Ice::PropertyDict getPropertiesForPrefix(std::string, const Ice::Current&) override;
virtual void setPropertiesAsync(::Ice::PropertyDict,
::std::function<void()>,
::std::function<void(::std::exception_ptr)>,
- const Ice::Current&);
+ const Ice::Current&) override;
+
+ virtual std::function<void()> addUpdateCallback(std::function<void(const Ice::PropertyDict&)>) override;
+ void removeUpdateCallback(std::list<std::function<void(const Ice::PropertyDict&)>>::iterator);
+
#else
virtual std::string getProperty(const std::string&, const Ice::Current&);
virtual Ice::PropertyDict getPropertiesForPrefix(const std::string&, const Ice::Current&);
virtual void setProperties_async(const Ice::AMD_PropertiesAdmin_setPropertiesPtr&, const Ice::PropertyDict&, const Ice::Current&);
-#endif
virtual void addUpdateCallback(const Ice::PropertiesAdminUpdateCallbackPtr&);
virtual void removeUpdateCallback(const Ice::PropertiesAdminUpdateCallbackPtr&);
+#endif
private:
const Ice::PropertiesPtr _properties;
const Ice::LoggerPtr _logger;
+
+#ifdef ICE_CPP11_MAPPING
+ std::list<std::function<void(const Ice::PropertyDict&)>> _updateCallbacks;
+#else
std::vector<Ice::PropertiesAdminUpdateCallbackPtr> _updateCallbacks;
+#endif
};
ICE_DEFINE_PTR(PropertiesAdminIPtr, PropertiesAdminI);