<This message was supposed to be sent to the whole list, but I
accidently sent it only to Fabrizio. So sorry Fabrizio for getting
this twice.>
Hi Fabrizio,
I see that I did miss the case where the message is placed into the
queue. However, my comments about using a smart pointer (although
you'd need a shared smart pointer instead of an auto_ptr) still
remains. I did a little more poking around the code and found
XrdClientConn::ReadPartialAnswer(...)
...
Xmsg = ConnectionManager->ReadMsg(fLogConnID);
...
if (HasToAlloc) {
tmp2MoreData = realloc(*tmpMoreData, TotalBlkSize +
Xmsg->DataLen());
if (!tmp2MoreData) {
Error("ReadPartialAnswer", "Error reallocating " <<
TotalBlkSize << " bytes.");
free(*tmpMoreData);
*tmpMoreData = 0;
what_to_do = kTSRHReturnNullMex;
return 0;
}
So here Xmsg (which normally is returned from this routine if
everything was OK) is obtained from a method that does not put the
message on a queue. So if we have this allocation problem, the message
is not passed up the chain nor is it deleted. I understand that this
is an unlikely condition, but using smart pointers to manage the memory
would take care of the standard and the unusual conditions. [Note: I
found this after looking at the code for less than 10 minutes and have
spent no further time. Therefore I do not know if this is the only
leak or if there are others.]
Resource management is tough in C++ and using smart pointers makes the
compiler do the work for you (which I like since I'm lazy).
Chris
On Oct 13, 2004, at 3:33 AM, Fabrizio Furano wrote:
> Hi Chris,
>
> I know them all, and will put my eye on them in a short time. Anyway
> it's alpha code and I am revisiting it all in these days.
>
> BTW, this remark:
>
> > Code:
> > XrdClientPhyConnection::BuildMessage returns a new
> XrdClientMessage,
> > but in SocketReaderThread we see
> >
> > while (1) {
> > thisObj->BuildMessage(TRUE, TRUE);
> > thisObj->CheckAutoTerm();
> > }
> > the return value is ignored
> >
> > Resolution:
> > -delete the value returned from the line '
> > thisObj->BuildMessage(TRUE, TRUE);'
> > -better solution is to have XrdClientPhyConnection::BuildMessage
> > return a
> > std::auto_ptr<XrdClientMessage>
>
> is not correct, since the BuildMessage parameters tell it to enqueue
> what it created. So it's not a good idea to delete a message that has
> been enqueued somewhere else.
> That leak is related to a condition for the message deletion inside
> SendGenCommand/ClientServerCmd. It does not loose all the messages.
> Only one in a particular situation. This does not mean that it won't
> be fixed.
>
> Fabrizio
|