Print

Print


I tried running valgrind on suez using the XrdPosix interface. It  
kept failing.

This is the first problem that valgrind reported. There are others  
that I will get to in a little while.

According to the linux pthread_detach() manual

     "The effect of multiple pthread_detach() calls on the
      same target thread is unspecified."

This is standards-speak for "don't do dat!!". Alas, XrdClient is  
doing that in XrdClientPhyConnect.cc in the method  
XrdClientPhyConnection::StartReader().  The detach call is in a while  
loop, which can be greatly simplified, as it turns out. While waiting  
for the new thread to be scheduled at the bottom of the method, there  
is no need to read out fReaderthreadrunning in a critical section. It  
just slows this thread and possibly other threads down, and so the  
following will work fine, and is easier to understand. I was also  
concerned that if the new thread never runs, then the while loop will  
be infinite. I put in a limit on the number of waits. Set maxRetries  
to some reasonable amount.

You should probably not enter the while loop if the detach failed. I  
put in a return but you may want to do something else.

The approximate code that you need is below.

Share & Enjoy
  -----------

void XrdClientPhyConnection::StartReader()
{
    bool running;

    {
       XrdOucMutexHelper l(fMutex);
       running = fReaderthreadrunning;
    }
    // Start reader thread

    // Parametric asynchronous stuff.
    // If we are going Sync, then nothing has to be done,
    // otherwise the reader thread must be started
    if ( !running && EnvGetLong(NAME_GOASYNC) ) {

       Info(XrdClientDebug::kHIDEBUG,
            "StartReader", "Starting reader thread...");

       // Now we launch  the reader thread
       fReaderthreadhandler = new XrdClientThread(SocketReaderThread);
       if (!fReaderthreadhandler)
          Error("PhyConnection",
                "Can't create reader thread: out of system resources");

       fReaderthreadhandler->Run(this);
       if (0 != fReaderthreadhandler->Detach())
       {
          Error("PhyConnection", "Thread detach failed");
   // Do we need to take other action here???
          return; // ??
       }

       // Sleep until the detached thread starts running, which  
hopefully
       // is not forever.
       int maxRetries = 10;
       while (--maxRetries >= 0 && !fReaderthreadrunning)
       {
          fReaderCV.Wait(100);
       }
    }
}

--
Gregory J. Sharp                   email: [log in to unmask]
Wilson Synchrotron Laboratory      url: http://www.lepp.cornell.edu/ 
~gregor
Cornell University                 ph:  +1 607 255 4882
Ithaca, NY 14853                   fax: +1 607 255 8062