Revision: 40742
http://brlcad.svn.sourceforge.net/brlcad/?rev=40742&view=rev
Author: davidloman
Date: 2010-09-28 17:39:47 +0000 (Tue, 28 Sep 2010)
Log Message:
-----------
Fixed the issue with pkg_switch not retaining values. Variable scope ftw.
Modified Paths:
--------------
rt^3/trunk/include/Portal.h
rt^3/trunk/include/PortalManager.h
rt^3/trunk/src/libNet/NetMsgFactory.cxx
rt^3/trunk/src/libNet/Portal.cxx
rt^3/trunk/src/libNet/PortalManager.cxx
rt^3/trunk/src/libPkgCpp/PkgServer.cxx
rt^3/trunk/src/libPkgCpp/PkgTcpClient.cxx
rt^3/trunk/tests/libNet/libNetTest.cxx
Modified: rt^3/trunk/include/Portal.h
===================================================================
--- rt^3/trunk/include/Portal.h 2010-09-28 16:54:13 UTC (rev 40741)
+++ rt^3/trunk/include/Portal.h 2010-09-28 17:39:47 UTC (rev 40742)
@@ -48,7 +48,7 @@
bool handleNetMsg(NetMsg* msg);
protected:
- Portal(PkgTcpClient* client);
+ Portal(PkgTcpClient* client, struct pkg_switch* table);
/*
* Returns:
@@ -60,6 +60,7 @@
private:
+ struct pkg_switch* callbackTable;
PkgTcpClient* pkgClient;
QString remoteNodeName;
Logger* log;
Modified: rt^3/trunk/include/PortalManager.h
===================================================================
--- rt^3/trunk/include/PortalManager.h 2010-09-28 16:54:13 UTC (rev 40741)
+++ rt^3/trunk/include/PortalManager.h 2010-09-28 17:39:47 UTC (rev 40742)
@@ -59,7 +59,8 @@
QMutex* portalsLock;
QMap<int, Portal*>* fdPortalMap;
- Portal* makeNewPortal(PkgTcpClient* client);
+ Portal* makeNewPortal(PkgTcpClient* client, struct pkg_switch* table);
+ struct pkg_switch* makeNewSwitchTable();
void closeFD(int fd, QString logComment);
};
Modified: rt^3/trunk/src/libNet/NetMsgFactory.cxx
===================================================================
--- rt^3/trunk/src/libNet/NetMsgFactory.cxx 2010-09-28 16:54:13 UTC (rev
40741)
+++ rt^3/trunk/src/libNet/NetMsgFactory.cxx 2010-09-28 17:39:47 UTC (rev
40742)
@@ -65,6 +65,23 @@
quint16 msgType = 0;
temp >> msgType;
+ QString s("Got msg. type: ");
+ s.append(QString::number(msgType));
+ s.append(" len: ");
+ s.append(QString::number(data.size()));
+ Logger::getInstance()->logDEBUG("NetMsgFactory", s);
+
+ QString dstr("Bytes: ");
+
+ data.data();
+
+ for (int i = 0; i < data.size(); ++i) {
+ quint8 b = data.data()[i];
+ dstr.append(QString::number(b));
+ dstr.append(", ");
+ }
+ Logger::getInstance()->logDEBUG("NetMsgFactory", dstr);
+
QDataStream* qds = new QDataStream(data);
//TODO Replace this with a map for registration scheme
Modified: rt^3/trunk/src/libNet/Portal.cxx
===================================================================
--- rt^3/trunk/src/libNet/Portal.cxx 2010-09-28 16:54:13 UTC (rev 40741)
+++ rt^3/trunk/src/libNet/Portal.cxx 2010-09-28 17:39:47 UTC (rev 40742)
@@ -30,22 +30,21 @@
#include "NetMsgTypes.h"
#include "RemoteNodenameSetMsg.h"
-Portal::Portal(PkgTcpClient* client)
+Portal::Portal(PkgTcpClient* client, struct pkg_switch* table)
{
- this->remoteNodeName = "NotSetYet-" + QUuid::createUuid().toString();
- this->pkgClient = client;
+ this->remoteNodeName = "NotSetYet-" + QUuid::createUuid().toString();
+ this->pkgClient = client;
+ this->callbackTable = table;
+ //set the struct's userdata
+ this->callbackTable[0].pks_user_data = this;
- //set the struct's userdata
- const struct pkg_switch* table = this->pkgClient->getCallBackTable();
- pkg_switch sw = table[0];
- sw.pks_user_data = this;
-
- this->log = Logger::getInstance();
- this->handshakeComplete = false;
+ this->log = Logger::getInstance();
+ this->handshakeComplete = false;
}
Portal::~Portal()
{
+ delete callbackTable;
}
@@ -92,8 +91,16 @@
int
Portal::read(){
int retval = 0;
+ this->log->logINFO("Portal", "Read");
+/*
+ const pkg_switch* table = this->pkgClient->getCallBackTable();
+ pkg_switch sw = table[0];
+ bu_log("P(1.1): Route[0] type: %d\n", sw.pks_type);
+ bu_log("P(1.1): Route[0] callback: %d\n", sw.pks_handler);
+ bu_log("P(1.1): Route[0] user_data: %d\n", sw.pks_user_data);
+*/
- //recv first
+//recv first
retval = this->pkgClient->processData();
if (retval < 0){
this->log->logERROR("Portal", "Unable to process packets? Weird. (1)
\n");
@@ -101,7 +108,7 @@
}//TODO do we need to check for ==0 ?
- retval = this->pkgClient->pullDataFromSocket();
+retval = this->pkgClient->pullDataFromSocket();
if (retval < 0) {
this->log->logERROR("Portal", "Seemed to have trouble pulling the
data from the socket.\n");
return retval;
@@ -110,6 +117,7 @@
this->log->logERROR("Portal", "Client closed the connection.\n");
return retval;
}
+ bu_log("Sucked in %d bytes.", retval);
retval = this->pkgClient->processData();
if (retval < 0){
@@ -162,11 +170,21 @@
QByteArray ba(buf);
- if (conn->pkc_user_data == 0) {
+ QString s("Got ");
+ s.append(QString::number(ba.size()));
+ s.append(" bytes.");
+ Logger::getInstance()->logINFO("Portal(s)", s);
+
+ if (conn->pkc_user_data == 0) {
bu_bomb("pkg callback returned a NULL user_data pointer!\n");
}
+
Portal* p = (Portal*)conn->pkc_user_data;
+ if (p == 0) {
+ bu_log("WARNING! NetMsg failed to deserialize properly.\n");
+ }
+
//TODO Split the code here? Fire off a Job?
Modified: rt^3/trunk/src/libNet/PortalManager.cxx
===================================================================
--- rt^3/trunk/src/libNet/PortalManager.cxx 2010-09-28 16:54:13 UTC (rev
40741)
+++ rt^3/trunk/src/libNet/PortalManager.cxx 2010-09-28 17:39:47 UTC (rev
40742)
@@ -44,17 +44,16 @@
Portal*
PortalManager::connectToHost(QString host, quint16 port)
{
- struct pkg_switch table[] = {
- {PKG_MAGIC2, &(Portal::callbackSpringboard), "SpringBoard", NULL},
- {0,0, (char*)0,0}
- };
+ struct pkg_switch* table = this->makeNewSwitchTable();
- PkgTcpClient* pkgc = (PkgTcpClient*
)this->tcpServer->connectToHost(host.toStdString(), port, table);
+ PkgTcpClient* pkgc = (PkgTcpClient*) this->tcpServer->connectToHost(
+ host.toStdString(), port, table);
if (pkgc == NULL) {
return NULL;
} else {
- return this->makeNewPortal(pkgc);
+ Portal* p = this->makeNewPortal(pkgc, table);
+ return p;
}
}
@@ -96,7 +95,7 @@
while (this->runCmd) {
//Set values EVERY loop since select() on *nix modifies this.
timeout.tv_sec = 0;
- timeout.tv_usec = 500*1000;
+ timeout.tv_usec = 500*1000 * 2;
this->masterFDSLock.lock();
readfds = masterfds;
@@ -105,11 +104,10 @@
this->masterFDSLock.unlock();
//Shelect!!
- this->log->logINFO("PortalManager", "At Select.");
int retval =
select(fdmax + 1, &readfds, NULL,
&exceptionfds, &timeout);
- QString out("Loop start. Select returned: ");
+ QString out("Select returned: ");
out.append(QString::number(retval));
out.append(". FD count: ");
out.append(QString::number(this->fdPortalMap->keys().size()));
@@ -176,31 +174,37 @@
log->logDEBUG("PortalManager", s);
+ //If nothing to do, then continue;
+ if (!readyRead && !readyWrite && !readyAccept && !
readyException){
+ continue;
+ }
+
+
//Handle exceptions
if (readyException) {
//TODO handle exceptions
perror("Exception on FileDescriptor");
}
- Portal* p;
+
+
+ Portal* p = NULL;
//Accept new connections:
if (readyAccept) {
log->logINFO("PortalManager", "Accept");
- struct pkg_switch table[] = { { PKG_MAGIC2,
- &(Portal::callbackSpringboard),
"SpringBoard", NULL },
- { 0, 0, (char*) 0, 0 } };
+ struct pkg_switch* table =
this->makeNewSwitchTable();
PkgTcpClient* client =
- (PkgTcpClient*)
this->tcpServer->waitForClient(table,
- 42);
+ (PkgTcpClient*)
this->tcpServer->waitForClient(table, 42);
if (client == 0) {
log->logERROR("PortalManager",
"Error on accepting new
client.");
} else {
//Handle new client here.
- p = this->makeNewPortal(client);
+ p = this->makeNewPortal(client, table);
+ GSThread::sleep(2);
p->sendGSNodeName();
}
}
@@ -226,13 +230,24 @@
this->closeFD(i, s);
continue;
}
-
+/*
+ const pkg_switch* table =
p->pkgClient->getCallBackTable();
+ pkg_switch sw = table[0];
+ bu_log("PM(3.1): Route[0] type: %d\n", sw.pks_type);
+ bu_log("PM(3.1): Route[0] callback: %d\n",
sw.pks_handler);
+ bu_log("PM(3.1): Route[0] user_data: %d\n",
sw.pks_user_data);
+*/
//read
if (readyRead) {
this->log->logINFO("PortalManager", "Read");
int readResult = p->read();
+ QString s("Got ");
+ s.append(QString::number(readResult));
+ s.append(" bytes.");
+
Logger::getInstance()->logINFO("PortalManager", s);
+
if (readResult == 0) {
this->closeFD(i, "Lost connection.");
continue;
@@ -260,8 +275,8 @@
Portal*
-PortalManager::makeNewPortal(PkgTcpClient* client) {
- Portal* newPortal = new Portal(client);
+PortalManager::makeNewPortal(PkgTcpClient* client, struct pkg_switch* table) {
+ Portal* newPortal = new Portal(client, table);
if (newPortal == 0) {
return 0;
@@ -287,6 +302,24 @@
return newPortal;
}
+struct pkg_switch*
+PortalManager::makeNewSwitchTable()
+{
+ struct pkg_switch* table = new pkg_switch[2];
+
+ table[0].pks_type = PKG_MAGIC2;
+ table[0].pks_handler = &(Portal::callbackSpringboard);
+ table[0].pks_title = "SpringBoard";
+ table[0].pks_user_data = 0;
+
+ table[1].pks_type = 0;
+ table[1].pks_handler = 0;
+ table[1].pks_title = (char*)0;
+ table[1].pks_user_data = 0;
+
+ return table;
+}
+
void
PortalManager::closeFD(int fd, QString logComment)
{
Modified: rt^3/trunk/src/libPkgCpp/PkgServer.cxx
===================================================================
--- rt^3/trunk/src/libPkgCpp/PkgServer.cxx 2010-09-28 16:54:13 UTC (rev
40741)
+++ rt^3/trunk/src/libPkgCpp/PkgServer.cxx 2010-09-28 17:39:47 UTC (rev
40742)
@@ -39,26 +39,6 @@
PkgServer::~PkgServer()
{}
-/**
- * Attempts to open a new connection to ipOrHostname:port. Returns NULL if
connection fails for any reason.
- */
-PkgClient*
-PkgServer::connectToHost(std::string ipOrHostname, short port, struct
pkg_switch* callbackTable)
-{
- std::stringstream ss;
- ss << port;
- std::string s_port = ss.str();
-
- pkg_conn* conn = pkg_open(ipOrHostname.c_str(), s_port.c_str(),
- this->proto.c_str(), NULL, NULL, callbackTable, NULL);
-
- if (conn == PKC_ERROR) {
- bu_log("Connection to %s, port %d, failed.\n",
ipOrHostname.c_str(), port);
- return NULL;
- }
- return this->getNewClient(conn);
-}
-
int
PkgServer::listen(unsigned short port)
{
@@ -84,10 +64,33 @@
return this->listenFD;
}
+
+/**
+ * Attempts to open a new connection to ipOrHostname:port. Returns NULL if
connection fails for any reason.
+ */
PkgClient*
+PkgServer::connectToHost(std::string ipOrHostname, short port, struct
pkg_switch* callbackTable)
+{
+ std::stringstream ss;
+ ss << port;
+ std::string s_port = ss.str();
+
+ pkg_conn* conn = pkg_open(ipOrHostname.c_str(), s_port.c_str(),
+ this->proto.c_str(), NULL, NULL, callbackTable, NULL);
+
+ if (conn == PKC_ERROR) {
+ bu_log("Connection to %s, port %d, failed.\n",
ipOrHostname.c_str(), port);
+ return NULL;
+ }
+ return this->getNewClient(conn);
+}
+
+
+PkgClient*
PkgServer::waitForClient(struct pkg_switch* callbackTable, int waitTime) {
- pkg_conn* clientStruct = pkg_getclient(this->listenFD, callbackTable,
NULL, waitTime);
- if (clientStruct == PKC_NULL)
+ pkg_conn* conn = pkg_getclient(this->listenFD, callbackTable, NULL,
waitTime);
+
+ if (conn == PKC_NULL)
{
if (waitTime == 0)
{
@@ -96,15 +99,15 @@
}
return NULL;
}
- else if (clientStruct == PKC_ERROR)
+ else if (conn == PKC_ERROR)
{
//Fatal error accepting client connection
bu_log("Fatal error accepting client connection.\n");
- pkg_close(clientStruct);
+ pkg_close(conn);
return NULL;
}
- PkgClient* pkgClientObj = this->getNewClient(clientStruct);
+ PkgClient* pkgClientObj = this->getNewClient(conn);
return pkgClientObj;
}
Modified: rt^3/trunk/src/libPkgCpp/PkgTcpClient.cxx
===================================================================
--- rt^3/trunk/src/libPkgCpp/PkgTcpClient.cxx 2010-09-28 16:54:13 UTC (rev
40741)
+++ rt^3/trunk/src/libPkgCpp/PkgTcpClient.cxx 2010-09-28 17:39:47 UTC (rev
40742)
@@ -25,6 +25,7 @@
*/
#include "PkgTcpClient.h"
+#include "brlcad/bu.h"
PkgTcpClient::PkgTcpClient(std::string ipOrHostname, int port, struct
pkg_switch* callBackTableIn) :
PkgClient(PKGCPP_PROTO_TCP, ipOrHostname, port, callBackTableIn)
Modified: rt^3/trunk/tests/libNet/libNetTest.cxx
===================================================================
--- rt^3/trunk/tests/libNet/libNetTest.cxx 2010-09-28 16:54:13 UTC (rev
40741)
+++ rt^3/trunk/tests/libNet/libNetTest.cxx 2010-09-28 17:39:47 UTC (rev
40742)
@@ -131,6 +131,8 @@
PortalManager pm;
pm.startup();
+ GSThread::sleep(3);
+
s = "Trying to connect to ";
s.append(ip.c_str());
s.append(":");
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits