[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