summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/Ice/Initialize.h1
-rw-r--r--cpp/src/Ice/ImplicitContextI.cpp9
-rw-r--r--cpp/src/Ice/Instance.cpp2
-rw-r--r--cpp/src/Ice/SharedContext.h4
-rw-r--r--cpp/test/Ice/operations/AllTests.cpp15
-rw-r--r--cpp/test/Ice/operations/Client.cpp5
-rw-r--r--cpp/test/Ice/operations/Collocated.cpp4
-rw-r--r--cpp/test/Ice/operations/Twoways.cpp59
-rw-r--r--cpp/test/Ice/operations/TwowaysAMI.cpp76
9 files changed, 153 insertions, 22 deletions
diff --git a/cpp/include/Ice/Initialize.h b/cpp/include/Ice/Initialize.h
index 9fbf7a23825..0ba05a05c2d 100644
--- a/cpp/include/Ice/Initialize.h
+++ b/cpp/include/Ice/Initialize.h
@@ -59,7 +59,6 @@ struct InitializationData
PropertiesPtr properties;
LoggerPtr logger;
StatsPtr stats;
- Context defaultContext;
StringConverterPtr stringConverter;
WstringConverterPtr wstringConverter;
ThreadNotificationPtr threadHook;
diff --git a/cpp/src/Ice/ImplicitContextI.cpp b/cpp/src/Ice/ImplicitContextI.cpp
index ab57af890d9..b6b8294210b 100644
--- a/cpp/src/Ice/ImplicitContextI.cpp
+++ b/cpp/src/Ice/ImplicitContextI.cpp
@@ -362,7 +362,7 @@ PerThreadImplicitContext::getThreadContext(bool allocate) const
return 0;
}
- val = new std::vector<Context*>(_index);
+ val = new std::vector<Context*>(_index + 1);
#ifdef _WIN32
if(TlsSetValue(_key, val) != 0)
{
@@ -377,7 +377,7 @@ PerThreadImplicitContext::getThreadContext(bool allocate) const
}
else
{
- if(val->size() < _index)
+ if(val->size() <= _index)
{
if(!allocate)
{
@@ -386,6 +386,7 @@ PerThreadImplicitContext::getThreadContext(bool allocate) const
else
{
val->resize(_index + 1);
+ assert((*val)[_index] == 0);
}
}
}
@@ -409,8 +410,9 @@ PerThreadImplicitContext::clearThreadContext() const
#else
ContextVector* val = static_cast<ContextVector*>(pthread_getspecific(_key));
#endif
- if(val != 0 && val->size() < _index)
+ if(val != 0 && _index < val->size())
{
+ delete (*val)[_index];
(*val)[_index] = 0;
int i = val->size() - 1;
@@ -465,6 +467,7 @@ PerThreadImplicitContext::setContext(const Context& newContext)
else
{
Context* ctx = getThreadContext(true);
+ assert(ctx != 0);
*ctx = newContext;
}
}
diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp
index 427bb3a5585..7d552f62d27 100644
--- a/cpp/src/Ice/Instance.cpp
+++ b/cpp/src/Ice/Instance.cpp
@@ -466,7 +466,7 @@ IceInternal::Instance::Instance(const CommunicatorPtr& communicator, const Initi
_serverACM(0),
_threadPerConnection(0),
_threadPerConnectionStackSize(0),
- _defaultContext(new SharedContext(initData.defaultContext)),
+ _defaultContext(new SharedContext),
_memoryPool(0),
_implicitContext(0)
{
diff --git a/cpp/src/Ice/SharedContext.h b/cpp/src/Ice/SharedContext.h
index 00982f43b78..729f0ada564 100644
--- a/cpp/src/Ice/SharedContext.h
+++ b/cpp/src/Ice/SharedContext.h
@@ -26,6 +26,10 @@ namespace IceInternal
class SharedContext : public IceUtil::Shared
{
public:
+
+ SharedContext()
+ {
+ }
SharedContext(const Ice::Context& val) :
_val(val)
diff --git a/cpp/test/Ice/operations/AllTests.cpp b/cpp/test/Ice/operations/AllTests.cpp
index 0b241176635..14cee1c4b6e 100644
--- a/cpp/test/Ice/operations/AllTests.cpp
+++ b/cpp/test/Ice/operations/AllTests.cpp
@@ -15,8 +15,7 @@
using namespace std;
Test::MyClassPrx
-allTests(const Ice::CommunicatorPtr& communicator,
- const Ice::InitializationData& initData, bool collocated)
+allTests(const Ice::CommunicatorPtr& communicator, bool collocated)
{
cout << "testing stringToProxy... " << flush;
string ref = "test:default -p 12010 -t 10000";
@@ -217,18 +216,18 @@ allTests(const Ice::CommunicatorPtr& communicator,
}
cout << "testing twoway operations... " << flush;
- void twoways(const Ice::CommunicatorPtr&, const Ice::InitializationData&, const Test::MyClassPrx&);
- twoways(communicator, initData, cl);
- twoways(communicator, initData, derived);
+ void twoways(const Ice::CommunicatorPtr&, const Test::MyClassPrx&);
+ twoways(communicator, cl);
+ twoways(communicator, derived);
derived->opDerived();
cout << "ok" << endl;
if(!collocated)
{
cout << "testing twoway operations with AMI... " << flush;
- void twowaysAMI(const Ice::CommunicatorPtr&, const Ice::InitializationData&, const Test::MyClassPrx&);
- twowaysAMI(communicator, initData, cl);
- twowaysAMI(communicator, initData, derived);
+ void twowaysAMI(const Ice::CommunicatorPtr&, const Test::MyClassPrx&);
+ twowaysAMI(communicator, cl);
+ twowaysAMI(communicator, derived);
cout << "ok" << endl;
cout << "testing batch oneway operations... " << flush;
diff --git a/cpp/test/Ice/operations/Client.cpp b/cpp/test/Ice/operations/Client.cpp
index 6669a1f041a..d6a343d6a32 100644
--- a/cpp/test/Ice/operations/Client.cpp
+++ b/cpp/test/Ice/operations/Client.cpp
@@ -18,9 +18,8 @@ run(int argc, char* argv[],
const Ice::CommunicatorPtr& communicator,
const Ice::InitializationData& initData)
{
- Test::MyClassPrx allTests(const Ice::CommunicatorPtr&,
- const Ice::InitializationData&, bool);
- Test::MyClassPrx myClass = allTests(communicator, initData, false);
+ Test::MyClassPrx allTests(const Ice::CommunicatorPtr&, bool);
+ Test::MyClassPrx myClass = allTests(communicator, false);
cout << "testing server shutdown... " << flush;
myClass->shutdown();
diff --git a/cpp/test/Ice/operations/Collocated.cpp b/cpp/test/Ice/operations/Collocated.cpp
index ca0e74e0563..58a734b368c 100644
--- a/cpp/test/Ice/operations/Collocated.cpp
+++ b/cpp/test/Ice/operations/Collocated.cpp
@@ -23,8 +23,8 @@ run(int argc, char* argv[], const Ice::CommunicatorPtr& communicator,
adapter->add(new TestCheckedCastI, communicator->stringToIdentity("context"));
adapter->activate();
- Test::MyClassPrx allTests(const Ice::CommunicatorPtr&, const Ice::InitializationData&, bool);
- allTests(communicator, initData, true);
+ Test::MyClassPrx allTests(const Ice::CommunicatorPtr&, bool);
+ allTests(communicator, true);
return EXIT_SUCCESS;
}
diff --git a/cpp/test/Ice/operations/Twoways.cpp b/cpp/test/Ice/operations/Twoways.cpp
index 03aa0f46a53..817fb88b262 100644
--- a/cpp/test/Ice/operations/Twoways.cpp
+++ b/cpp/test/Ice/operations/Twoways.cpp
@@ -25,8 +25,7 @@
using namespace std;
void
-twoways(const Ice::CommunicatorPtr& communicator, const Ice::InitializationData& initializationData,
- const Test::MyClassPrx& p)
+twoways(const Ice::CommunicatorPtr& communicator, const Test::MyClassPrx& p)
{
{
p->opVoid();
@@ -685,6 +684,62 @@ twoways(const Ice::CommunicatorPtr& communicator, const Ice::InitializationData&
communicator->setDefaultContext(Ice::Context());
}
+
+ {
+ //
+ // Test implicit context propagation
+ //
+
+ string impls[] = {"Shared", "SharedWithoutLocking", "PerThread"};
+ for(int i = 0; i < 3; i++)
+ {
+ Ice::InitializationData initData;
+ initData.properties = Ice::createProperties();
+ initData.properties->setProperty("Ice.ImplicitContext", impls[i]);
+
+ Ice::CommunicatorPtr ic = Ice::initialize(initData);
+
+ Ice::Context ctx;
+ ctx["one"] = "ONE";
+ ctx["two"] = "TWO";
+ ctx["three"] = "THREE";
+
+
+ Test::MyClassPrx p = Test::MyClassPrx::uncheckedCast(
+ ic->stringToProxy("test:default -p 12010 -t 10000"));
+
+
+ ic->getImplicitContext()->setContext(ctx);
+ test(ic->getImplicitContext()->getContext() == ctx);
+ test(p->opContext() == ctx);
+
+ ic->getImplicitContext()->set("zero", "ZERO");
+ test(ic->getImplicitContext()->get("zero") == "ZERO");
+ test(ic->getImplicitContext()->getWithDefault("foobar", "foo") == "foo");
+
+ ctx = ic->getImplicitContext()->getContext();
+ test(p->opContext() == ctx);
+
+ Ice::Context prxContext;
+ prxContext["one"] = "UN";
+ prxContext["four"] = "QUATRE";
+
+ Ice::Context combined = prxContext;
+ combined.insert(ctx.begin(), ctx.end());
+ test(combined["one"] == "UN");
+
+ p = Test::MyClassPrx::uncheckedCast(p->ice_context(prxContext));
+
+ ic->getImplicitContext()->setContext(Ice::Context());
+ test(p->opContext() == prxContext);
+
+ ic->getImplicitContext()->setContext(ctx);
+ test(p->opContext() == combined);
+
+ ic->destroy();
+ }
+ }
+
}
{
diff --git a/cpp/test/Ice/operations/TwowaysAMI.cpp b/cpp/test/Ice/operations/TwowaysAMI.cpp
index 7993d4fb497..36262a2fbd9 100644
--- a/cpp/test/Ice/operations/TwowaysAMI.cpp
+++ b/cpp/test/Ice/operations/TwowaysAMI.cpp
@@ -872,8 +872,7 @@ public:
typedef IceUtil::Handle<AMI_MyClass_opDoubleMarshalingI> AMI_MyClass_opDoubleMarshalingIPtr;
void
-twowaysAMI(const Ice::CommunicatorPtr& communicator,
- const Ice::InitializationData& initializationData, const Test::MyClassPrx& p)
+twowaysAMI(const Ice::CommunicatorPtr& communicator, const Test::MyClassPrx& p)
{
{
// Check that a call to a void operation raises TwowayOnlyException
@@ -1322,6 +1321,79 @@ twowaysAMI(const Ice::CommunicatorPtr& communicator,
communicator->setDefaultContext(Ice::Context());
}
+
+ {
+ //
+ // Test implicit context propagation
+ //
+
+ string impls[] = {"Shared", "SharedWithoutLocking", "PerThread"};
+ for(int i = 0; i < 3; i++)
+ {
+ Ice::InitializationData initData;
+ initData.properties = Ice::createProperties();
+ initData.properties->setProperty("Ice.ImplicitContext", impls[i]);
+
+ Ice::CommunicatorPtr ic = Ice::initialize(initData);
+
+ Ice::Context ctx;
+ ctx["one"] = "ONE";
+ ctx["two"] = "TWO";
+ ctx["three"] = "THREE";
+
+
+ Test::MyClassPrx p = Test::MyClassPrx::uncheckedCast(
+ ic->stringToProxy("test:default -p 12010 -t 10000"));
+
+
+ ic->getImplicitContext()->setContext(ctx);
+ test(ic->getImplicitContext()->getContext() == ctx);
+ {
+ AMI_MyClass_opContextEqualIPtr cb = new AMI_MyClass_opContextEqualI(ctx);
+ p->opContext_async(cb);
+ test(cb->check());
+ }
+
+ ic->getImplicitContext()->set("zero", "ZERO");
+ test(ic->getImplicitContext()->get("zero") == "ZERO");
+ test(ic->getImplicitContext()->getWithDefault("foobar", "foo") == "foo");
+
+ ctx = ic->getImplicitContext()->getContext();
+ {
+ AMI_MyClass_opContextEqualIPtr cb = new AMI_MyClass_opContextEqualI(ctx);
+ p->opContext_async(cb);
+ test(cb->check());
+ }
+
+ Ice::Context prxContext;
+ prxContext["one"] = "UN";
+ prxContext["four"] = "QUATRE";
+
+ Ice::Context combined = prxContext;
+ combined.insert(ctx.begin(), ctx.end());
+ test(combined["one"] == "UN");
+
+ p = Test::MyClassPrx::uncheckedCast(p->ice_context(prxContext));
+
+ ic->getImplicitContext()->setContext(Ice::Context());
+ {
+ AMI_MyClass_opContextEqualIPtr cb = new AMI_MyClass_opContextEqualI(prxContext);
+ p->opContext_async(cb);
+ test(cb->check());
+ }
+
+ ic->getImplicitContext()->setContext(ctx);
+ {
+ AMI_MyClass_opContextEqualIPtr cb = new AMI_MyClass_opContextEqualI(combined);
+ p->opContext_async(cb);
+ test(cb->check());
+ }
+
+ ic->destroy();
+ }
+ }
+
+
}
{