diff options
| author | Aidan Skinner <aidan@apache.org> | 2009-09-17 16:21:13 +0000 |
|---|---|---|
| committer | Aidan Skinner <aidan@apache.org> | 2009-09-17 16:21:13 +0000 |
| commit | 7d6a028be9f6c47418e98a6fa74a359864428150 (patch) | |
| tree | 78083427e88c48edb3b23605309e57f1301cba19 /qpid/cpp/src/qmf/SequenceManager.cpp | |
| parent | 31bbc100ac6b3a31eb25d29f407d60ff23334d1f (diff) | |
| download | qpid-python-7d6a028be9f6c47418e98a6fa74a359864428150.tar.gz | |
Merge from trunk
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/java-network-refactor@816261 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/qmf/SequenceManager.cpp')
| -rw-r--r-- | qpid/cpp/src/qmf/SequenceManager.cpp | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/qpid/cpp/src/qmf/SequenceManager.cpp b/qpid/cpp/src/qmf/SequenceManager.cpp index f51ce9d8b8..3171e66fac 100644 --- a/qpid/cpp/src/qmf/SequenceManager.cpp +++ b/qpid/cpp/src/qmf/SequenceManager.cpp @@ -25,26 +25,72 @@ using namespace qpid::sys; SequenceManager::SequenceManager() : nextSequence(1) {} -uint32_t SequenceManager::reserve(SequenceContext* ctx) +void SequenceManager::setUnsolicitedContext(SequenceContext::Ptr ctx) +{ + unsolicitedContext = ctx; +} + +uint32_t SequenceManager::reserve(SequenceContext::Ptr ctx) { Mutex::ScopedLock _lock(lock); + if (ctx.get() == 0) + ctx = unsolicitedContext; uint32_t seq = nextSequence; while (contextMap.find(seq) != contextMap.end()) seq = seq < 0xFFFFFFFF ? seq + 1 : 1; nextSequence = seq < 0xFFFFFFFF ? seq + 1 : 1; contextMap[seq] = ctx; + ctx->reserve(); return seq; } void SequenceManager::release(uint32_t sequence) { Mutex::ScopedLock _lock(lock); - map<uint32_t, SequenceContext*>::iterator iter = contextMap.find(sequence); + + if (sequence == 0) { + if (unsolicitedContext.get() != 0) + unsolicitedContext->release(); + return; + } + + map<uint32_t, SequenceContext::Ptr>::iterator iter = contextMap.find(sequence); if (iter != contextMap.end()) { if (iter->second != 0) - iter->second->complete(); + iter->second->release(); contextMap.erase(iter); } } +void SequenceManager::releaseAll() +{ + Mutex::ScopedLock _lock(lock); + contextMap.clear(); +} + +void SequenceManager::dispatch(uint8_t opcode, uint32_t sequence, qpid::framing::Buffer& buffer) +{ + Mutex::ScopedLock _lock(lock); + bool done; + + if (sequence == 0) { + if (unsolicitedContext.get() != 0) { + done = unsolicitedContext->handleMessage(opcode, sequence, buffer); + if (done) + unsolicitedContext->release(); + } + return; + } + + map<uint32_t, SequenceContext::Ptr>::iterator iter = contextMap.find(sequence); + if (iter != contextMap.end()) { + if (iter->second != 0) { + done = iter->second->handleMessage(opcode, sequence, buffer); + if (done) { + iter->second->release(); + contextMap.erase(iter); + } + } + } +} |
