diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/Ice/Initialize.h | 1 | ||||
-rw-r--r-- | cpp/src/Ice/ImplicitContextI.cpp | 9 | ||||
-rw-r--r-- | cpp/src/Ice/Instance.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Ice/SharedContext.h | 4 | ||||
-rw-r--r-- | cpp/test/Ice/operations/AllTests.cpp | 15 | ||||
-rw-r--r-- | cpp/test/Ice/operations/Client.cpp | 5 | ||||
-rw-r--r-- | cpp/test/Ice/operations/Collocated.cpp | 4 | ||||
-rw-r--r-- | cpp/test/Ice/operations/Twoways.cpp | 59 | ||||
-rw-r--r-- | cpp/test/Ice/operations/TwowaysAMI.cpp | 76 |
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(); + } + } + + } { |