[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdegames/libkdegames/kgame
From: Martin Heni <martin () heni-online ! de>
Date: 2007-08-11 7:40:52
Message-ID: 1186818052.069390.31467.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 698830 by heni:
Interprocess communication was broken due to process pipes
and incorrect buffer copying.
M +8 -8 kgameprocess.cpp
M +14 -5 kmessageio.cpp
--- trunk/KDE/kdegames/libkdegames/kgame/kgameprocess.cpp #698829:698830
@@ -71,10 +71,11 @@
delete d->mRandom;
//delete mMessageClient;
//delete mMessageServer;
+ fprintf(stderr,"KGameProcess::destructor\n");
+ fflush(stderr);
delete mMessageIO;
d->rFile.close();
d->wFile.close();
- fprintf(stderr,"KGameProcess::destructor\n");
delete d;
}
@@ -96,7 +97,7 @@
// then stream data into the stream and call this function
void KGameProcess::sendSystemMessage(QDataStream &stream,int msgid,quint32 receiver)
{
- fprintf(stderr,"KGameProcess::sendMessage id=%d recv=%d",msgid,receiver);
+ fprintf(stderr,"KGameProcess::sendSystemMessage to parent id=%d \
recv=%ld\n",msgid,(unsigned long)receiver); QByteArray a;
QDataStream outstream(&a,QIODevice::WriteOnly);
@@ -106,11 +107,9 @@
KGameMessage::createHeader(outstream,0,receiver,msgid);
outstream.writeRawData(data.data(),data.size());
- //if (mMessageClient) mMessageClient->sendBroadcast(a);
- // TODO: The fixed received 2 will cause problems. But how to address the
- // proper one?
-// if (mMessageClient) mMessageClient->sendForward(a,2);
+ // if (mMessageClient) mMessageClient->sendForward(a,2);
if (mMessageIO) mMessageIO->send(a);
+ else fprintf(stderr,"KGameProcess::sendSystemMessage:: NO IO DEVICE ... WILL \
FAIL\n"); }
void KGameProcess::sendMessage(QDataStream &stream,int msgid,quint32 receiver)
@@ -131,7 +130,7 @@
v=atoi(argv[1]);
//kDebug(11001) << "id (unused) " << v;
}
- fprintf(stderr,"processArgs \n");
+ fprintf(stderr,"KGameProcess::processArgs \n");
fflush(stderr);
}
@@ -142,7 +141,8 @@
quint32 sender;
quint32 receiver;
KGameMessage::extractHeader(stream, sender, receiver, msgid);
- fprintf(stderr,"------ receiveNetworkTransmission(): id=%d \
sender=%d,recv=%d\n",msgid,sender,receiver); + fprintf(stderr,"--- \
KGameProcess::receivedMessage(): id=%d sender=%ld,recv=%ld\n", + \
msgid,(unsigned long)sender,(unsigned long)receiver); switch(msgid)
{
case KGameMessage::IdTurn:
--- trunk/KDE/kdegames/libkdegames/kgame/kmessageio.cpp #698829:698830
@@ -236,6 +236,8 @@
kDebug(11001) << "@@@KMessageProcess::Start process";
mProcessName=file;
mProcess=new KProcess;
+ // Need both stdout and stderr as separate channels in the communication
+ mProcess-> setOutputChannelMode(KProcess::SeparateChannels);
int id=0;
*mProcess << mProcessName << QString("%1").arg(id);
kDebug(11001) << "@@@KMessageProcess::Init:Id=" << id;
@@ -256,6 +258,8 @@
return false;
return (mProcess->state() == QProcess::Running);
}
+
+// Send to process
void KMessageProcess::send(const QByteArray &msg)
{
kDebug(11001) << "@@@KMessageProcess:: SEND("<<msg.size()<<") to process";
@@ -305,8 +309,10 @@
QByteArray ba = mProcess->readAll();
kDebug(11001) << "$$$$$$ " << k_funcinfo << ": Received" << ba.size() << "bytes \
over inter process communication";
- // TODO Make a plausibility check on buflen to avoid memory overflow
- mReceiveBuffer += ba;
+ // Resize receive buffer
+ while (mReceiveCount+ba.size()>=mReceiveBuffer.size()) \
mReceiveBuffer.resize(mReceiveBuffer.size()+1024); + // was 08/2007: mReceiveBuffer \
+= ba; + qCopy(ba.begin(), ba.begin()+ba.size(), \
mReceiveBuffer.begin()+mReceiveCount); mReceiveCount += ba.size();
// Possbile message
@@ -318,7 +324,6 @@
if (*p1!=0x4242aeae)
{
kDebug(11001) << k_funcinfo << ": Cookie error...transmission \
failure...serious problem...";
-// for (int i=0;i<mReceiveCount;i++) fprintf(stderr,"%02x \
",mReceiveBuffer[i]);fprintf(stderr,"\n"); }
len=(int)(*p2);
if (len<int(2*sizeof(long)))
@@ -376,6 +381,7 @@
return (mReadFile!=0)&&(mWriteFile!=0);
}
+// Send to parent
void KMessageFilePipe::send(const QByteArray &msg)
{
unsigned int size=msg.size()+2*sizeof(long);
@@ -391,11 +397,14 @@
mWriteFile->write(buffer);
mWriteFile->flush();
delete [] tmpbuffer;
- /*
+
+ /* DEBUG:
fprintf(stderr,"+++ KMessageFilePipe:: SEND(%d to parent) \
realsize=%d\n",msg.size(),buffer.size());
- for (int i=0;i<buffer.size();i++) fprintf(stderr,"%02x \
",buffer[i]);fprintf(stderr,"\n"); + for (int i=0;i<buffer.size();i++) \
fprintf(stderr,"%02x ",(unsigned char)buffer.at(i));fprintf(stderr,"\n"); \
fflush(stderr);
*/
+
+
}
void KMessageFilePipe::exec()
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic