[brlcad-commits] SF.net SVN: brlcad:[40702]
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <dav...@us...> - 2010-09-27 17:30:53
|
Revision: 40702 http://brlcad.svn.sourceforge.net/brlcad/?rev=40702&view=rev Author: davidloman Date: 2010-09-27 17:30:41 +0000 (Mon, 27 Sep 2010) Log Message: ----------- Made 'listening' on a PortalManager optional. Allows for a testServer and testClient to be run on the same machine without bashing your head against an IP Bind issue. Also put in NULL checking in PortalManager::connectToHost() so as to prevent segfaults. Modified Paths: -------------- rt^3/trunk/include/PortalManager.h rt^3/trunk/src/libNet/PortalManager.cxx Modified: rt^3/trunk/include/PortalManager.h =================================================================== --- rt^3/trunk/include/PortalManager.h 2010-09-27 17:25:05 UTC (rev 40701) +++ rt^3/trunk/include/PortalManager.h 2010-09-27 17:30:41 UTC (rev 40702) @@ -40,7 +40,7 @@ class PortalManager : public ControlledThread { public: - PortalManager(quint16 port); + PortalManager(quint16 port = 0); ~PortalManager(); Portal* connectToHost(QString host, quint16 port); Modified: rt^3/trunk/src/libNet/PortalManager.cxx =================================================================== --- rt^3/trunk/src/libNet/PortalManager.cxx 2010-09-27 17:25:05 UTC (rev 40701) +++ rt^3/trunk/src/libNet/PortalManager.cxx 2010-09-27 17:30:41 UTC (rev 40702) @@ -45,15 +45,22 @@ PortalManager::connectToHost(QString host, quint16 port) { PkgTcpClient* pkgc = (PkgTcpClient* )this->tcpServer->connectToHost(host.toStdString(), port); - return this->makeNewPortal(pkgc); + + if (pkgc == NULL) { + return NULL; + } else { + return this->makeNewPortal(pkgc); + } } void PortalManager::_run() { + struct timeval timeout; fd_set readfds; fd_set writefds; fd_set exceptionfds; + int listener; this->masterFDSLock.lock(); FD_ZERO(&masterfds); @@ -63,19 +70,25 @@ FD_ZERO(&writefds); FD_ZERO(&exceptionfds); - int listener = this->tcpServer->listen(this->port); - if (listener < 0) { - this->log->logERROR("PortalManager", "Failed to listen"); - return; - } + if (this->port != 0) { + listener = this->tcpServer->listen(this->port); + if (listener < 0) { + this->log->logERROR("PortalManager", "Failed to listen"); + return; + } - this->masterFDSLock.lock(); - FD_SET(listener, &masterfds); - fdmax = listener; - this->masterFDSLock.unlock(); + this->masterFDSLock.lock(); + FD_SET(listener, &masterfds); + fdmax = listener; + this->masterFDSLock.unlock(); + } while (this->runCmd) { + //Set values EVERY loop since select() on *nix modifies this. + timeout.tv_sec = 1; + timeout.tv_usec = 0; + this->masterFDSLock.lock(); readfds = masterfds; writefds = masterfds; @@ -83,7 +96,17 @@ this->masterFDSLock.unlock(); //Shelect!! - int retval = select(fdmax+1, &readfds, &writefds, &exceptionfds, NULL); + int retval = select(fdmax+1, &readfds, &writefds, NULL, &timeout); + + QString out("Loop start. Select returned: "); + out.append(QString::number(retval)); + this->log->logINFO("PortalManager", out); + + //Save time on the loop: + if (retval == 0) { + continue; + } + if(retval <0) { //got a selector error @@ -103,14 +126,18 @@ } for (int i = 0; i <= fdmax; ++i) { + /* if (FD_ISSET(i, &exceptionfds)) { //TODO handle exceptions perror("Exception on FileDescriptor"); } +*/ if (FD_ISSET(i, &readfds)) { + this->log->logINFO("PortalManager", "Read On Listener."); + //If we are 'reading' on listener - if (i == listener) { + if (port != 0 && i == listener) { PkgTcpClient* client = (PkgTcpClient*) this->tcpServer->waitForClient(42); if (client == 0) { @@ -122,6 +149,7 @@ //else we are plain reading. } else { + this->log->logINFO("PortalManager", "Read On Normal FD."); //Portal->read here. if (this->fdPortalMap->contains(i)) { this->portalsLock->lock(); @@ -146,8 +174,11 @@ /* * Do we really need Write checking? - * + */ if (FD_ISSET(i, &writefds)) { + this->log->logINFO("PortalManager", "Write."); + + /* //Portal->write here. if (this->fdPortalMap->contains(i)) { this->portalsLock->lock(); @@ -167,8 +198,9 @@ this->closeFD(i,"Attempting to write to FD not associated with a Portal, dropping connection to remote host.", &masterfds); continue; } + */ } - */ + } //end FOR } //end while }//end fn This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |