(file) Return to HTTPAcceptor.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/HTTPAcceptor.cpp between version 1.87 and 1.88.6.1

version 1.87, 2006/09/29 19:40:57 version 1.88.6.1, 2006/11/03 05:04:20
Line 68 
Line 68 
     {     {
         if (local)         if (local)
         {         {
   #ifndef PEGASUS_OS_TYPE_WINDOWS
   
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
             address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);             address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);
             address_size = sizeof(struct sockaddr_un);             address_size = sizeof(struct sockaddr_un);
 #else #else
             PEGASUS_ASSERT(false);             PEGASUS_ASSERT(false);
 #endif #endif
   #endif
         }         }
         else         else
         {         {
Line 91 
Line 94 
     Mutex _connection_mut;     Mutex _connection_mut;
  
     SocketHandle socket;     SocketHandle socket;
   // Added for NamedPipe implementation for windows
   #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
       NamedPipeServer* namedPipeServer;
   #endif
   
     Array<HTTPConnection*> connections;     Array<HTTPConnection*> connections;
 }; };
  
 //------------------------------------------------------------------------------  
 //  
 // _setTCPNoDelay()  
 //  
 //------------------------------------------------------------------------------  
   
 inline void _setTCPNoDelay(SocketHandle socket)  
 {  
     // This function disables "Nagle's Algorithm" also known as "the TCP delay  
     // algorithm", which causes read operations to obtain whatever data is  
     // already in the input queue and then wait a little longer to see if  
     // more data arrives. This algorithm optimizes the case in which data is  
     // sent in only one direction but severely impairs performance of round  
     // trip servers. Disabling TCP delay is a standard technique for round  
     // trip servers.  
   
    int opt = 1;  
    setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (char*)&opt, sizeof(opt));  
 }  
  
 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
 // //
Line 211 
Line 200 
      break;      break;
       }       }
  
   // Added for NamedPipe implementation for windows
   #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
           case NAMEDPIPE_MESSAGE:
           {
               NamedPipeMessage* namedPipeMessage = (NamedPipeMessage*)message;
   
               if (((namedPipeMessage->namedPipe.getPipe()) == ( _rep->namedPipeServer->getPipe())) &&
                   (namedPipeMessage->events & NamedPipeMessage::READ))
               {
                   _acceptNamedPipeConnection();
               }
               else
               {
               // ATTN! this can't happen!
               Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                   "HTTPAcceptor::handleEnqueue: Invalid NAMEDPIPE_MESSAGE received.");
               }
               break;
           }
   #endif
   
       case CLOSE_CONNECTION_MESSAGE:       case CLOSE_CONNECTION_MESSAGE:
       {       {
      CloseConnectionMessage* closeConnectionMessage      CloseConnectionMessage* closeConnectionMessage
Line 221 
Line 231 
      for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)      for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)
      {      {
         HTTPConnection* connection = _rep->connections[i];         HTTPConnection* connection = _rep->connections[i];
   // Added for NamedPipe implementation for windows
   #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
                   if(!connection->isNamedPipeConnection())
                   {
   #endif
   
         SocketHandle socket = connection->getSocket();         SocketHandle socket = connection->getSocket();
  
         if (socket == closeConnectionMessage->socket)         if (socket == closeConnectionMessage->socket)
Line 230 
Line 246 
                delete connection;                delete connection;
            break;            break;
         }         }
   // Added for NamedPipe implementation for windows
   #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
                   }
                   else
                   {
                       NamedPipe namedPipe = connection->getNamedPipe();
                       //NamedPipeMessage* namedPipeMessage = (NamedPipeMessage*)message;
   
                       if (namedPipe.getPipe() == closeConnectionMessage->namedPipe.getPipe())
                       {
                           _monitor->unsolicitPipeMessages(namedPipe);
                           _rep->connections.remove(i);
                           delete connection;
                           break;
                       }
                   }
   #endif
   
      }      }
  
      break;      break;
Line 294 
Line 328 
    PEGASUS_ASSERT(_rep != 0);    PEGASUS_ASSERT(_rep != 0);
    // Create address:    // Create address:
  
    memset(_rep->address, 0, sizeof(*_rep->address));  #if defined PEGASUS_OS_TYPE_WINDOWS
      if (!_localConnection)
      {
   #endif
  
      memset(_rep->address, 0, sizeof(*_rep->address));
   #if defined PEGASUS_OS_TYPE_WINDOWS
      }
   #endif
    if (_localConnection)    if (_localConnection)
    {    {
   // Added for NamedPipe implementation for windows
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
   # ifdef PEGASUS_OS_TYPE_WINDOWS
   #  ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
          {
              AutoMutex automut(Monitor::_cout_mut);
              PEGASUS_STD(cout) << "in HTTPAcceptor::_bind before calling _createNamedPipe() "
                                << PEGASUS_STD(endl);
          }
   #  endif
          _createNamedPipe();
   # ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
          {
              AutoMutex automut(Monitor::_cout_mut);
              PEGASUS_STD(cout) << "in HTTPAcceptor::_bind after calling _createNamedPipe() " << PEGASUS_STD(endl);
          }
   # endif
          return;
   # else // Other than Windows platform
   
        reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_family =        reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_family =
            AF_UNIX;            AF_UNIX;
        strcpy(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path,        strcpy(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path,
Line 307 
Line 367 
        AtoE(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);        AtoE(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
 #endif #endif
        ::unlink(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);        ::unlink(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
   # endif
 #else #else
        PEGASUS_ASSERT(false);        PEGASUS_ASSERT(false);
 #endif #endif
Line 325 
Line 386 
  
    if (_localConnection)    if (_localConnection)
    {    {
        _rep->socket = socket(AF_UNIX, SOCK_STREAM, 0);         _rep->socket = Socket::createSocket(AF_UNIX, SOCK_STREAM, 0);
    }    }
    else    else
    {    {
        _rep->socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);         _rep->socket = Socket::createSocket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  
        _setTCPNoDelay(_rep->socket);  
    }    }
  
    if (_rep->socket < 0)    if (_rep->socket < 0)
Line 506 
Line 566 
       // Unlink Local Domain Socket Bug# 3312       // Unlink Local Domain Socket Bug# 3312
       if (_localConnection)       if (_localConnection)
       {       {
   #ifndef PEGASUS_OS_TYPE_WINDOWS
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,           PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,
                         "HTTPAcceptor::closeConnectionSocket Unlinking local connection." );                         "HTTPAcceptor::closeConnectionSocket Unlinking local connection." );
Line 514 
Line 575 
 #else #else
          PEGASUS_ASSERT(false);          PEGASUS_ASSERT(false);
 #endif #endif
   #endif
       }       }
  
    }    }
Line 540 
Line 602 
    }    }
 } }
  
   
   /**
      reconnectConnectionSocket - creates a new server socket.
   */
   void HTTPAcceptor::reconnectConnectionSocket()
   {
      if (_rep)
      {
         // unregister the socket
         _monitor->unsolicitSocketMessages(_rep->socket);
         // close the socket
         Socket::close(_rep->socket);
         // Unlink Local Domain Socket Bug# 3312
         if (_localConnection)
         {
   
   #ifndef PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
             PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,
                           "HTTPAcceptor::reconnectConnectionSocket Unlinking local connection." );
            ::unlink(
                reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
   #else
            PEGASUS_ASSERT(false);
   #endif
   
         }
         // open the socket
         _bind();
      }
      else
      {
         PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                           "HTTPAcceptor::reconnectConnectionSocket failure _rep is null." );
      }
   }
   
 /** /**
    getOutstandingRequestCount - returns the number of outstanding requests.    getOutstandingRequestCount - returns the number of outstanding requests.
 */ */
Line 582 
Line 680 
       if (_localConnection)       if (_localConnection)
       {       {
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
   # ifndef PEGASUS_OS_TYPE_WINDOWS
          ::unlink(          ::unlink(
              reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);              reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
   # endif
 #else #else
          PEGASUS_ASSERT(false);          PEGASUS_ASSERT(false);
 #endif #endif
       }       }
   #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
        if (!_localConnection)
        {
   #endif
       delete _rep;       delete _rep;
   #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
        }
   #endif
       _rep = 0;       _rep = 0;
    }    }
    else    else
Line 609 
Line 715 
      for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)      for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)
      {      {
         HTTPConnection* connection = _rep->connections[i];         HTTPConnection* connection = _rep->connections[i];
   // Added for NamedPipe implementation for windows
   #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
           if(!connection->isNamedPipeConnection())
           {
   #endif
         SocketHandle socket = connection->getSocket();         SocketHandle socket = connection->getSocket();
  
         // Unsolicit SocketMessages:         // Unsolicit SocketMessages:
  
         _monitor->unsolicitSocketMessages(socket);         _monitor->unsolicitSocketMessages(socket);
  
   // Added for NamedPipe implementation for windows
         // Destroy the connection (causing it to close):         // Destroy the connection (causing it to close):
   #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
           }
           else
           {
               NamedPipe namedPipe = connection->getNamedPipe();
               _monitor->unsolicitPipeMessages(namedPipe);
           }
   #endif
         while (connection->refcount.get()) { }         while (connection->refcount.get()) { }
         delete connection;         delete connection;
      }      }
Line 638 
Line 757 
  
    if (_localConnection)    if (_localConnection)
    {    {
   #ifndef PEGASUS_OS_TYPE_WINDOWS
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
        accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);        accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);
        address_size = sizeof(struct sockaddr_un);        address_size = sizeof(struct sockaddr_un);
 #else #else
        PEGASUS_ASSERT(false);        PEGASUS_ASSERT(false);
 #endif #endif
   #endif
    }    }
    else    else
    {    {
Line 653 
Line 774 
  
    SocketHandle socket = accept(_rep->socket, accept_address, &address_size);    SocketHandle socket = accept(_rep->socket, accept_address, &address_size);
  
    if (socket < 0)     if (socket == PEGASUS_SOCKET_ERROR)
      {
          // the remote connection is invalid, destroy client address.
          delete accept_address;
   
          // TCPIP is down reconnect this acceptor
          if(getSocketError() == PEGASUS_NETWORK_TCPIP_STOPPED)
    {    {
  
              PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                       "Socket has an IO error. TCP/IP down. Try to reconnect." );
   
              reconnectConnectionSocket();
   
              return;
          }
        Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,        Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
            "HTTPAcceptor - accept() failure.  errno: $0"            "HTTPAcceptor - accept() failure.  errno: $0"
            ,errno);            ,errno);
Line 761 
Line 895 
    AutoMutex autoMut(_rep->_connection_mut);    AutoMutex autoMut(_rep->_connection_mut);
    _rep->connections.append(connection);    _rep->connections.append(connection);
 } }
   // Added for NamedPipe implementation for windows
   #if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
   void HTTPAcceptor::_createNamedPipe()
   {
   #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
       {
           AutoMutex automut(Monitor::_cout_mut);
           PEGASUS_STD(cout) << "Entering  HTTPAcceptor::_createNamedPipe()." << PEGASUS_STD(endl);
       }
   #endif
       _rep->namedPipeServer = new NamedPipeServer(PEGASUS_NAMEDPIPE_PATH);
   #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
       {
           AutoMutex automut(Monitor::_cout_mut);
           PEGASUS_STD(cout) << "in HTTPAcceptor::_createNamedPipe() after calling the pipe server constructor" << PEGASUS_STD(endl);
       }
   
       {
           AutoMutex automut(Monitor::_cout_mut);
           cout << "Named pipe...in _createNamedPipe..." << _rep->namedPipeServer->getPipe() << endl;
       }
   #endif
       // Register to receive Messages on Connection pipe:
   
      if ( -1 == ( _entry_index = _monitor->solicitPipeMessages(
         *_rep->namedPipeServer,
         NamedPipeMessage::READ | NamedPipeMessage::EXCEPTION,
         getQueueId(),
         Monitor::ACCEPTOR)))
      {
          ::CloseHandle(_rep->namedPipeServer->getPipe());
          delete _rep;
          _rep = 0;
          //l10n
          MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SOLICIT_SOCKET_MESSAGES",
                       "Failed to solicit socket messaeges");
          PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                      "HTTPAcceptor::_bind: Failed to solicit pipe messages(2).");
          throw BindFailedException(parms);
   #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
          {
              AutoMutex automut(Monitor::_cout_mut); //added
              PEGASUS_STD(cout) << "in HTTPAcceptor::_createNamedPipe() _monitor->solicitSocketMessages failed"
                                << PEGASUS_STD(endl);
          }
   #endif
      }
   #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
      {
          AutoMutex automut(Monitor::_cout_mut);
          PEGASUS_STD(cout) << "Leaving  HTTPAcceptor::_createNamedPipe()." << PEGASUS_STD(endl);
      }
   #endif
      return;
   }
   
   void HTTPAcceptor::_acceptNamedPipeConnection()
   {
       PEGASUS_ASSERT(_rep != 0);
   
       if (!_rep)
          return;
   #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
       {
           AutoMutex automut(Monitor::_cout_mut);
           cout <<"In HTTPAcceptor::_acceptNamedPipeConnection " << endl;
       }
   #endif
   
   
       NamedPipeServerEndPiont nPSEndPoint = _rep->namedPipeServer->accept();
       // Register to receive Messages on Connection pipe:
   #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
       {
           AutoMutex automut(Monitor::_cout_mut);
           cout << " In _acceptNamedPipeConnection -- after calling namedPipeServer->accept()" << endl;
       }
   #endif
       HTTPConnection* connection = new HTTPConnection(_monitor, nPSEndPoint,
           this, static_cast<MessageQueue *>(_outputMessageQueue),false);
   
       // Solicit events on this new connection's socket:
       int index;
   #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
       {
           AutoMutex automut(Monitor::_cout_mut);
           cout << endl << connection->getNamedPipe().getName() << " has a this as a QueueID " <<
            connection->getQueueId() << endl;
       }
   #endif
       if (-1 ==  (index = _monitor->solicitPipeMessages(
          connection->getNamedPipe(),
          NamedPipeMessage::READ | NamedPipeMessage::EXCEPTION,
          connection->getQueueId(), Monitor::ACCEPTOR)) )
       {
          // ATTN-DE-P2-2003100503::TODO::Need to enhance code to return
          // an error message to Client application.
          Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
              "HTTPAcceptor::_acceptPipeConnection: Attempt to allocate entry in _entries table failed.");
          delete connection;
          return;
       }
   
       // Save the socket for cleanup later:
       connection->_entry_index = index;
       AutoMutex autoMut(_rep->_connection_mut);
       _rep->connections.append(connection);
   #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
     {
         AutoMutex automut(Monitor::_cout_mut);
         PEGASUS_STD(cout)
          << "in HTTPAcceptor::_acceptNamedPipeConnection() at the end" << PEGASUS_STD(endl);
     }
   #endif
   }
   #endif
  
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


Legend:
Removed from v.1.87  
changed lines
  Added in v.1.88.6.1

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2