summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ImplicitContextI.cpp
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2007-02-16 21:19:13 +0000
committerBernard Normier <bernard@zeroc.com>2007-02-16 21:19:13 +0000
commit7b5360ff74ff2375ca934e76a8b4c840c1c5565d (patch)
treecf211fb26f29617d9da2ee12b2311a9f348918ce /cpp/src/Ice/ImplicitContextI.cpp
parentRemove *.config files frmo BV/C# Remove all windows project files (diff)
downloadice-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.cpp244
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)
{