summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/CommunicatorI.cpp19
-rw-r--r--cpp/src/Ice/CommunicatorI.h5
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp8
-rw-r--r--cpp/src/Ice/ObjectAdapterI.h4
-rw-r--r--cpp/src/Ice/ThreadPool.cpp24
-rw-r--r--cpp/src/Ice/ThreadPool.h12
-rw-r--r--cpp/src/slice2cpp/Gen.cpp7
7 files changed, 77 insertions, 2 deletions
diff --git a/cpp/src/Ice/CommunicatorI.cpp b/cpp/src/Ice/CommunicatorI.cpp
index 36198c82d75..4355ad80977 100644
--- a/cpp/src/Ice/CommunicatorI.cpp
+++ b/cpp/src/Ice/CommunicatorI.cpp
@@ -18,6 +18,9 @@
#include <IceUtil/Mutex.h>
#include <IceUtil/MutexPtrLock.h>
#include <Ice/UUID.h>
+#ifdef ICE_SWIFT
+#include <Ice/ThreadPool.h>
+#endif
using namespace std;
using namespace Ice;
@@ -378,6 +381,22 @@ Ice::CommunicatorI::getValueFactoryManager() const ICE_NOEXCEPT
return _instance->initializationData().valueFactoryManager;
}
+#ifdef ICE_SWIFT
+
+dispatch_queue_t
+Ice::CommunicatorI::getClientDispatchQueue() const ICE_NOEXCEPT
+{
+ return _instance->clientThreadPool()->getDispatchQueue();
+}
+
+dispatch_queue_t
+Ice::CommunicatorI::getServerDispatchQueue() const ICE_NOEXCEPT
+{
+ return _instance->serverThreadPool()->getDispatchQueue();
+}
+
+#endif
+
namespace
{
diff --git a/cpp/src/Ice/CommunicatorI.h b/cpp/src/Ice/CommunicatorI.h
index f28b49a2299..ae0f4e817c8 100644
--- a/cpp/src/Ice/CommunicatorI.h
+++ b/cpp/src/Ice/CommunicatorI.h
@@ -97,6 +97,11 @@ public:
virtual ValueFactoryManagerPtr getValueFactoryManager() const ICE_NOEXCEPT;
+#ifdef ICE_SWIFT
+ virtual dispatch_queue_t getClientDispatchQueue() const ICE_NOEXCEPT;
+ virtual dispatch_queue_t getServerDispatchQueue() const ICE_NOEXCEPT;
+#endif
+
#ifdef ICE_CPP11_MAPPING
virtual ::std::function<void()>
flushBatchRequestsAsync(CompressBatch,
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index 937c74e54cc..102636af70d 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -735,6 +735,14 @@ Ice::ObjectAdapterI::setPublishedEndpoints(const EndpointSeq& newEndpoints)
}
}
+#ifdef ICE_SWIFT
+dispatch_queue_t
+Ice::ObjectAdapterI::getDispatchQueue() const ICE_NOEXCEPT
+{
+ return getThreadPool()->getDispatchQueue();
+}
+#endif
+
bool
Ice::ObjectAdapterI::isLocal(const ObjectPrxPtr& proxy) const
{
diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h
index 9c024a90b64..00496d9133d 100644
--- a/cpp/src/Ice/ObjectAdapterI.h
+++ b/cpp/src/Ice/ObjectAdapterI.h
@@ -85,6 +85,10 @@ public:
virtual EndpointSeq getPublishedEndpoints() const ICE_NOEXCEPT;
virtual void setPublishedEndpoints(const EndpointSeq&);
+#ifdef ICE_SWIFT
+ virtual dispatch_queue_t getDispatchQueue() const ICE_NOEXCEPT;
+#endif
+
bool isLocal(const ObjectPrxPtr&) const;
void flushAsyncBatchRequests(const IceInternal::CommunicatorFlushBatchAsyncPtr&, CompressBatch);
diff --git a/cpp/src/Ice/ThreadPool.cpp b/cpp/src/Ice/ThreadPool.cpp
index b836137170a..2994f292d86 100644
--- a/cpp/src/Ice/ThreadPool.cpp
+++ b/cpp/src/Ice/ThreadPool.cpp
@@ -245,7 +245,11 @@ IceInternal::ThreadPoolWorkQueue::getNativeInfo()
IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, const string& prefix, int timeout) :
_instance(instance),
+#ifdef ICE_SWIFT
+ _dispatchQueue(dispatch_queue_create(prefix.c_str(), DISPATCH_QUEUE_CONCURRENT)),
+#else
_dispatcher(_instance->initializationData().dispatcher),
+#endif
_destroyed(false),
_prefix(prefix),
_selector(instance),
@@ -417,6 +421,9 @@ IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, const string& p
IceInternal::ThreadPool::~ThreadPool()
{
assert(_destroyed);
+#ifdef ICE_SWIFT
+ dispatch_release(_dispatchQueue);
+#endif
}
void
@@ -531,6 +538,12 @@ IceInternal::ThreadPool::ready(const EventHandlerPtr& handler, SocketOperation o
void
IceInternal::ThreadPool::dispatchFromThisThread(const DispatchWorkItemPtr& workItem)
{
+#ifdef ICE_SWIFT
+ dispatch_sync(_dispatchQueue, ^
+ {
+ workItem->run();
+ });
+#else
if(_dispatcher)
{
try
@@ -566,6 +579,7 @@ IceInternal::ThreadPool::dispatchFromThisThread(const DispatchWorkItemPtr& workI
{
workItem->run();
}
+#endif
}
void
@@ -603,6 +617,16 @@ IceInternal::ThreadPool::prefix() const
return _prefix;
}
+#ifdef ICE_SWIFT
+
+dispatch_queue_t
+IceInternal::ThreadPool::getDispatchQueue() const
+{
+ return _dispatchQueue;
+}
+
+#endif
+
void
IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread)
{
diff --git a/cpp/src/Ice/ThreadPool.h b/cpp/src/Ice/ThreadPool.h
index f9641296a14..daff7373f1a 100644
--- a/cpp/src/Ice/ThreadPool.h
+++ b/cpp/src/Ice/ThreadPool.h
@@ -110,6 +110,10 @@ public:
std::string prefix() const;
+#ifdef ICE_SWIFT
+ dispatch_queue_t getDispatchQueue() const;
+#endif
+
private:
void run(const EventHandlerThreadPtr&);
@@ -127,10 +131,14 @@ private:
std::string nextThreadId();
const InstancePtr _instance;
-#ifdef ICE_CPP11_MAPPING
+#ifdef ICE_SWIFT
+ const dispatch_queue_t _dispatchQueue;
+#else // Ice for Swift does not support a dispatcher
+# ifdef ICE_CPP11_MAPPING
std::function<void(std::function<void()>, const std::shared_ptr<Ice::Connection>&)> _dispatcher;
-#else
+# else
const Ice::DispatcherPtr _dispatcher;
+# endif
#endif
ThreadPoolWorkQueuePtr _workQueue;
bool _destroyed;
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index 6315c900650..afb8f2976c7 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -5686,6 +5686,13 @@ Slice::Gen::MetaDataVisitor::validate(const SyntaxTreeBasePtr& cont, const Strin
}
}
+ if(BuiltinPtr::dynamicCast(cont) &&
+ BuiltinPtr::dynamicCast(cont)->kind() == Builtin::KindLocalObject &&
+ ss.find("type:") == 0)
+ {
+ continue;
+ }
+
dc->warning(InvalidMetaData, file, line, "ignoring invalid metadata `" + s + "'");
newMetaData.remove(s);
continue;