From: Tomasz M. <tm...@du...> - 2004-08-07 14:28:26
|
On Fri, Aug 06, 2004 at 01:17:27AM +0200, Tomasz Malesinski wrote: > I commented out nullDup call in ExMgr::sessionServiceOutput and > everything started to work fine. I have not yet written a more elegant > solution, but it seems that after a failed write to a session socket, > ptal-mlcd should continue to read from the socket, but drop buffers > waiting to be written to it and all the buffers that will be added to > pReverseBdrQueue later. Here is a patch that works for me: diff -ur hpoj/mlcd/ExMgr.cpp hpoj.1/mlcd/ExMgr.cpp --- hpoj/mlcd/ExMgr.cpp Tue Nov 4 02:03:18 2003 +++ hpoj.1/mlcd/ExMgr.cpp Sat Aug 7 15:18:40 2004 @@ -1365,6 +1365,7 @@ session[scd].scdlink=ERROR; session[scd].pmlTrapsRegistered=0; session[scd].bitbucketSocket=0; + session[scd].outBitbucketSocket=0; if (oldState==SESSION_STATE_STARTUP) break; if (session[scd].pCommandBdr) { forwardDataResponse(scd,session[scd].pCommandBdr, @@ -2308,6 +2309,15 @@ LOG_ASSERT(pBdr,cEXBP,0,0); LOG_ASSERT(status==MLCD_STATUS_SUCCESSFUL,cEXBP,0,0); + if (session[scd].outBitbucketSocket) { + while (pBdr) { + next=pBdr->getNext(); + pBdr->returnBuffer(); + pBdr=next; + } + return; + } + if (session[scd].state==SESSION_STATE_OPEN_PENDING) { if (scd>=FIRST_TRANSPORT_SESSION && scd<=LAST_TRANSPORT_SESSION) { @@ -2357,7 +2367,10 @@ data=pBdr->getStartAddress()+pBdr->getDataOffset(); r=sessionWrite(scd,data,datalen); if (r<0) { - nullDup(session[scd].fd); + session[scd].outBitbucketSocket = 1; + session[scd].pReverseBdrQueue->empty(); + fdRegister(session[scd].fd,0,-1); + break; } else if (r!=datalen) { pBdr->unprependData(r); break; diff -ur hpoj/mlcd/ExMgr.h hpoj.1/mlcd/ExMgr.h --- hpoj/mlcd/ExMgr.h Tue Nov 4 02:03:18 2003 +++ hpoj.1/mlcd/ExMgr.h Sat Aug 7 15:04:02 2004 @@ -834,6 +834,7 @@ ExBdr *pCommandBdr; int pmlTrapsRegistered; int bitbucketSocket; + int outBitbucketSocket; } session[MAX_SESSIONS]; protected: #ifdef JD_DEBUGLITE |