diff options
author | Bernard Normier <bernard@zeroc.com> | 2007-02-16 21:19:13 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2007-02-16 21:19:13 +0000 |
commit | 7b5360ff74ff2375ca934e76a8b4c840c1c5565d (patch) | |
tree | cf211fb26f29617d9da2ee12b2311a9f348918ce /cpp/src/Ice/ImplicitContextI.cpp | |
parent | Remove *.config files frmo BV/C# Remove all windows project files (diff) | |
download | ice-7b5360ff74ff2375ca934e76a8b4c840c1c5565d.tar.bz2 ice-7b5360ff74ff2375ca934e76a8b4c840c1c5565d.tar.xz ice-7b5360ff74ff2375ca934e76a8b4c840c1c5565d.zip |
ImplicitContext updates
Diffstat (limited to 'cpp/src/Ice/ImplicitContextI.cpp')
-rw-r--r-- | cpp/src/Ice/ImplicitContextI.cpp | 244 |
1 files changed, 88 insertions, 156 deletions
diff --git a/cpp/src/Ice/ImplicitContextI.cpp b/cpp/src/Ice/ImplicitContextI.cpp index a2991b12e14..1a398c269d4 100644 --- a/cpp/src/Ice/ImplicitContextI.cpp +++ b/cpp/src/Ice/ImplicitContextI.cpp @@ -16,43 +16,23 @@ using namespace Ice; namespace { -class SharedImplicitContextWithoutLocking : public ImplicitContextI +class SharedImplicitContext : public ImplicitContextI { public: virtual Context getContext() const; virtual void setContext(const Context&); + virtual bool containsKey(const string&) const; virtual string get(const string&) const; - virtual string getWithDefault(const string&, const string&) const; - virtual void set(const string&, const string&); - virtual void remove(const string&); - - virtual void write(const Context&, ::IceInternal::BasicStream*) const; - virtual void combine(const Context&, Context&) const; - -protected: - - Context _context; -}; - -class SharedImplicitContext : public SharedImplicitContextWithoutLocking -{ -public: - - virtual Context getContext() const; - virtual void setContext(const Context&); - - virtual string get(const string&) const; - virtual string getWithDefault(const string&, const string&) const; - virtual void set(const string&, const string&); - virtual void remove(const string&); + virtual string put(const string&, const string&); + virtual string remove(const string&); virtual void write(const Context&, ::IceInternal::BasicStream*) const; virtual void combine(const Context&, Context&) const; private: - + Context _context; IceUtil::Mutex _mutex; }; @@ -67,10 +47,10 @@ public: virtual Context getContext() const; virtual void setContext(const Context&); + virtual bool containsKey(const string&) const; virtual string get(const string&) const; - virtual string getWithDefault(const string&, const string&) const; - virtual void set(const string&, const string&); - virtual void remove(const string&); + virtual string put(const string&, const string&); + virtual string remove(const string&); virtual void write(const Context&, ::IceInternal::BasicStream*) const; virtual void combine(const Context&, Context&) const; @@ -135,10 +115,6 @@ ImplicitContextI::create(const std::string& kind) { return new SharedImplicitContext; } - else if(kind == "SharedWithoutLocking") - { - return new SharedImplicitContextWithoutLocking; - } else if(kind == "PerThread") { return new PerThreadImplicitContext; @@ -164,81 +140,100 @@ ImplicitContextI::cleanupThread() } #endif + // -// SharedImplicitContextWithoutLocking implementation +// SharedImplicitContext implementation // -inline Context -SharedImplicitContextWithoutLocking::getContext() const +Context +SharedImplicitContext::getContext() const { + IceUtil::Mutex::Lock lock(_mutex); return _context; } -inline void -SharedImplicitContextWithoutLocking::setContext(const Context& newContext) +void +SharedImplicitContext::setContext(const Context& newContext) { + IceUtil::Mutex::Lock lock(_mutex); _context = newContext; } -inline string -SharedImplicitContextWithoutLocking::get(const string& k) const +bool +SharedImplicitContext::containsKey(const string& k) const { + IceUtil::Mutex::Lock lock(_mutex); Context::const_iterator p = _context.find(k); - if(p == _context.end()) - { - throw NotSetException(__FILE__, __LINE__, k); - } - return p->second; + return p != _context.end(); } -inline string -SharedImplicitContextWithoutLocking::getWithDefault(const string& k, const string& d) const +string +SharedImplicitContext::get(const string& k) const { + IceUtil::Mutex::Lock lock(_mutex); Context::const_iterator p = _context.find(k); if(p == _context.end()) { - return d; + return ""; } return p->second; } -inline void -SharedImplicitContextWithoutLocking::set(const string& k, const string& v) + +string +SharedImplicitContext::put(const string& k, const string& v) { - _context[k] = v; + IceUtil::Mutex::Lock lock(_mutex); + string& val = _context[k]; + + string oldVal = val; + val = v; + return oldVal; } -inline void -SharedImplicitContextWithoutLocking::remove(const string& k) +string +SharedImplicitContext::remove(const string& k) { - if(_context.erase(k) == 0) + IceUtil::Mutex::Lock lock(_mutex); + Context::iterator p = _context.find(k); + if(p == _context.end()) { - throw NotSetException(__FILE__, __LINE__, k); + return ""; + } + else + { + string oldVal = p->second; + _context.erase(p); + return oldVal; } } void -SharedImplicitContextWithoutLocking::write(const Context& proxyCtx, ::IceInternal::BasicStream* s) const +SharedImplicitContext::write(const Context& proxyCtx, ::IceInternal::BasicStream* s) const { + IceUtil::Mutex::Lock lock(_mutex); if(proxyCtx.size() == 0) { __write(s, _context, __U__Context()); } else if(_context.size() == 0) { + lock.release(); __write(s, proxyCtx, __U__Context()); } else { Context combined = proxyCtx; combined.insert(_context.begin(), _context.end()); + lock.release(); __write(s, combined, __U__Context()); } } void -SharedImplicitContextWithoutLocking::combine(const Context& proxyCtx, Context& ctx) const +SharedImplicitContext::combine(const Context& proxyCtx, Context& ctx) const { + IceUtil::Mutex::Lock lock(_mutex); if(proxyCtx.size() == 0) { ctx = _context; @@ -252,82 +247,6 @@ SharedImplicitContextWithoutLocking::combine(const Context& proxyCtx, Context& c ctx = proxyCtx; ctx.insert(_context.begin(), _context.end()); } - -} - -// -// SharedImplicitContext implementation -// - -Context -SharedImplicitContext::getContext() const -{ - IceUtil::Mutex::Lock lock(_mutex); - return SharedImplicitContextWithoutLocking::getContext(); -} - -void -SharedImplicitContext::setContext(const Context& newContext) -{ - IceUtil::Mutex::Lock lock(_mutex); - SharedImplicitContextWithoutLocking::setContext(newContext); -} - -string -SharedImplicitContext::get(const string& k) const -{ - IceUtil::Mutex::Lock lock(_mutex); - return SharedImplicitContextWithoutLocking::get(k); -} - -string -SharedImplicitContext::getWithDefault(const string& k, const string& d) const -{ - IceUtil::Mutex::Lock lock(_mutex); - return SharedImplicitContextWithoutLocking::getWithDefault(k, d); -} - -void -SharedImplicitContext::set(const string& k, const string& v) -{ - IceUtil::Mutex::Lock lock(_mutex); - SharedImplicitContextWithoutLocking::set(k, v); -} - -void -SharedImplicitContext::remove(const string& k) -{ - IceUtil::Mutex::Lock lock(_mutex); - SharedImplicitContextWithoutLocking::remove(k); -} - -void -SharedImplicitContext::write(const Context& proxyCtx, ::IceInternal::BasicStream* s) const -{ - IceUtil::Mutex::Lock lock(_mutex); - if(proxyCtx.size() == 0) - { - __write(s, _context, __U__Context()); - } - else if(_context.size() == 0) - { - lock.release(); - __write(s, proxyCtx, __U__Context()); - } - else - { - Context combined = proxyCtx; - combined.insert(_context.begin(), _context.end()); - lock.release(); - __write(s, combined, __U__Context()); - } -} - -void -SharedImplicitContext::combine(const Context& proxyCtx, Context& ctx) const -{ - IceUtil::Mutex::Lock lock(_mutex); - SharedImplicitContextWithoutLocking::combine(proxyCtx, ctx); } // @@ -579,64 +498,77 @@ PerThreadImplicitContext::setContext(const Context& newContext) } } -string -PerThreadImplicitContext::get(const string& k) const +bool +PerThreadImplicitContext::containsKey(const string& k) const { - Context* ctx = getThreadContext(false); + const Context* ctx = getThreadContext(false); if(ctx == 0) { - throw NotSetException(__FILE__, __LINE__, k); + return false; } Context::const_iterator p = ctx->find(k); - if(p == ctx->end()) - { - throw NotSetException(__FILE__, __LINE__, k); - } - return p->second; + return p != ctx->end(); } string -PerThreadImplicitContext::getWithDefault(const string& k, const string& d) const +PerThreadImplicitContext::get(const string& k) const { - Context* ctx = getThreadContext(false); + const Context* ctx = getThreadContext(false); if(ctx == 0) { - return d; + return ""; } Context::const_iterator p = ctx->find(k); if(p == ctx->end()) { - return d; + return ""; } return p->second; } -void -PerThreadImplicitContext::set(const string& k, const string& v) +string +PerThreadImplicitContext::put(const string& k, const string& v) { - Context* ctx = getThreadContext(true); - (*ctx)[k] = v; + Context* ctx = getThreadContext(true); + + string& val = (*ctx)[k]; + + string oldVal = val; + val = v; + return oldVal; } -void +string PerThreadImplicitContext::remove(const string& k) { Context* ctx = getThreadContext(false); - if(ctx == 0 || ctx->erase(k) == 0) + if(ctx == 0) { - throw NotSetException(__FILE__, __LINE__, k); + return ""; } - if(ctx->size() == 0) + Context::iterator p = ctx->find(k); + if(p == ctx->end()) { - clearThreadContext(); + return ""; } + else + { + string oldVal = p->second; + ctx->erase(p); + + if(ctx->size() == 0) + { + clearThreadContext(); + } + return oldVal; + } } void PerThreadImplicitContext::write(const Context& proxyCtx, ::IceInternal::BasicStream* s) const { - Context* threadCtx = getThreadContext(false); + const Context* threadCtx = getThreadContext(false); if(threadCtx == 0 || threadCtx->size() == 0) { @@ -657,7 +589,7 @@ PerThreadImplicitContext::write(const Context& proxyCtx, ::IceInternal::BasicStr void PerThreadImplicitContext::combine(const Context& proxyCtx, Context& ctx) const { - Context* threadCtx = getThreadContext(false); + const Context* threadCtx = getThreadContext(false); if(threadCtx == 0 || threadCtx->size() == 0) { |