diff --git a/README.md b/README.md index d955ced..9b7981f 100644 --- a/README.md +++ b/README.md @@ -105,8 +105,6 @@ NormDeveloperGuide.html - HTML version of NORM Developer's Guide (nice for browsing) NormUserGuide.pdf - Guide to "norm" demo app usage - (this document needs corrections and - is currently incomplete) VERSION.TXT - NORM version history notes diff --git a/VERSION.TXT b/VERSION.TXT index 203c073..57b55a6 100644 --- a/VERSION.TXT +++ b/VERSION.TXT @@ -21,9 +21,8 @@ Version 1.4b3 - Fixed issue with NormSession::QueueTxObject() where ASSERT() failure occurred depending upon previous tx object enqueue/dequeue history (Thanks to Jeff Bush for finding this one) - - Changed repeated scheduling of receiver remote sender inactivity - timer to ensure that busy CPU doesn't result in premature - inactivity indication. + - Fixed issue with fix for stream lockup problem from below. + (this is in version 1.4b3a) Version 1.4b2 ============= diff --git a/common/normObject.cpp b/common/normObject.cpp index ba970e0..11b1c9a 100644 --- a/common/normObject.cpp +++ b/common/normObject.cpp @@ -1598,19 +1598,18 @@ bool NormObject::NextServerMsg(NormObjectMsg* msg) } block->TxInit(blockId, numData, session.ServerAutoParity()); - - if (blockId < max_pending_block) - block->SetFlag(NormBlock::IN_REPAIR); + if (blockId < max_pending_block) block->SetFlag(NormBlock::IN_REPAIR); while (!block_buffer.Insert(block)) { ASSERT(STREAM == type); if (blockId > block_buffer.RangeLo()) { - NormBlock* b = block_buffer.Find(block_buffer.RangeLo()); - ASSERT(NULL != b); - ASSERT(!b->IsPending()); + NormBlock* lowBlock = block_buffer.Find(block_buffer.RangeLo()); + ASSERT(NULL != lowBlock); + ASSERT(!lowBlock->IsPending()); + NormBlockId lowBlockId = lowBlock->GetId(); bool push = static_cast(this)->GetPushMode(); - if (!push && (b->IsRepairPending() || IsRepairSet(b->GetId()))) + if (!push && (lowBlock->IsRepairPending() || IsRepairSet(lowBlockId))) { // Pending repairs delaying stream advance DMSG(4, "NormObject::NextServerMsg() node>%lu pending repairs delaying stream progress\n", LocalNodeId()); @@ -1620,12 +1619,12 @@ bool NormObject::NextServerMsg(NormObjectMsg* msg) else { // Prune old non-pending block (or even pending if "push" enabled stream) - block_buffer.Remove(b); - repair_mask.Unset(blockId); // just in case - pending_mask.Unset(blockId); - if (IsStream()) - static_cast(this)->UnlockBlock(b->GetId()); - session.ServerPutFreeBlock(b); + block_buffer.Remove(lowBlock); + repair_mask.Unset(lowBlockId); // just in case + pending_mask.Unset(lowBlockId); + if (IsStream()) // always true + static_cast(this)->UnlockBlock(lowBlockId); + session.ServerPutFreeBlock(lowBlock); continue; } } @@ -1641,8 +1640,8 @@ bool NormObject::NextServerMsg(NormObjectMsg* msg) } else { - ASSERT(0); DMSG(0, "NormObject::NextServerMsg() invalid non-stream state!\n"); + ASSERT(0); return false; } } diff --git a/common/normVersion.h b/common/normVersion.h index 908a3c9..22dfe6d 100644 --- a/common/normVersion.h +++ b/common/normVersion.h @@ -32,6 +32,6 @@ #ifndef _NORM_VERSION #define _NORM_VERSION -#define VERSION "1.4b3" +#define VERSION "1.4b3a" #endif // _NORM_VERSION