[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-multimedia
Subject: [PATCH] artsd streams memory leak
From: Stefan Westerfeld <stefan () space ! twc ! de>
Date: 2000-09-29 15:22:37
[Download RAW message or body]
Hi!
Any incoming stream of samples (like caused by xmms plugin, artsdsp xmms,
quake w/ arts, aRts C API, artscat) causes a memory leak in the CVS version
of aRts. This happens since some objects which are used from transfer,
namely FlowSystemSender & FlowSystemReceiver are not freed.
You'll also see this if you exit artsd, which after having at least one
stream connected prints out warnings about remaining objects.
Here is a patch that fixes it. Freeing the connection properly triggered
quite a few segfaults in various combinations (such as killing artscat
with ctrl+C just while it was initializing), but I hope the patch catches
them all.
If there are no objections, I'll commit it tomorrow.
Cu... Stefan
--
-* Stefan Westerfeld, stefan@space.twc.de (PGP!), Hamburg/Germany
KDE Developer, project infos at http://space.twc.de/~stefan/kde *-
["20000929-memleak-fix.diff" (text/plain)]
Index: flow/asyncschedule.cc
===================================================================
RCS file: /home/kde/kdelibs/arts/flow/asyncschedule.cc,v
retrieving revision 1.10
diff -u -u -r1.10 asyncschedule.cc
--- flow/asyncschedule.cc 2000/09/28 22:42:37 1.10
+++ flow/asyncschedule.cc 2000/09/29 15:12:41
@@ -23,6 +23,7 @@
#include "asyncschedule.h"
#include "debug.h"
#include <iostream>
+#include <stdio.h>
using namespace std;
using namespace Arts;
@@ -35,6 +36,30 @@
stream = (GenericAsyncStream *)ptr;
stream->channel = this;
stream->_notifyID = notifyID = parent->object()->_mkNotifyID();
+
+ sender = FlowSystemSender::null();
+}
+
+ASyncPort::~ASyncPort()
+{
+ /*
+ * tell all outstanding packets that we don't exist any longer, so that
+ * if they feel like they need to confirm they have been processed now,
+ * they don't talk to an no longer existing object about it
+ */
+ while(!sent.empty())
+ {
+ sent.front()->channel = 0;
+ sent.pop_front();
+ }
+
+ /*
+ * disconnect remote connection (if there was one)
+ * TODO: remote multicasting doesn't work (probably also not too
+ * important)
+ */
+ if(!sender.isNull())
+ sender.disconnect();
}
//-------------------- GenericDataChannel interface -------------------------
@@ -62,6 +87,20 @@
void ASyncPort::processedPacket(GenericDataPacket *packet)
{
+ int count = 0;
+ list<GenericDataPacket *>::iterator i, nexti;
+ for(i=sent.begin(); i != sent.end(); i = nexti)
+ {
+ nexti = i; nexti++;
+
+ if(*i == packet)
+ {
+ count++;
+ sent.erase(i);
+ }
+ }
+ assert(count == 1);
+
#ifdef DEBUG_ASYNC_TRANSFER
cout << "port::processedPacket" << endl;
#endif
@@ -95,6 +134,7 @@
cout << "sending notification " << n.ID << endl;
#endif
NotificationManager::the()->send(n);
+ sent.push_back(packet);
}
}
else
@@ -169,6 +209,7 @@
n.receiver = netsend;
n.ID = netsend->notifyID();
subscribers.push_back(n);
+ sender = FlowSystemSender::_from_base(netsend->_copy());
}
long ASyncNetSend::notifyID()
@@ -202,6 +243,16 @@
receiveHandlerID = newReceiver.receiveHandlerID();
}
+void ASyncNetSend::disconnect()
+{
+ if(!receiver.isNull())
+ {
+ FlowSystemReceiver r = receiver;
+ receiver = FlowSystemReceiver::null();
+ r.disconnect();
+ }
+}
+
/* dispatching function for custom message */
static void _dispatch_ASyncNetReceive_receive(void *object, Buffer *buffer)
@@ -222,6 +273,17 @@
_addCustomMessageHandler(_dispatch_ASyncNetReceive_receive,this);
}
+ASyncNetReceive::~ASyncNetReceive()
+{
+ /* tell outstanding packets that we don't exist any longer */
+ while(!sent.empty())
+ {
+ sent.front()->channel = 0;
+ sent.pop_front();
+ }
+ delete stream;
+}
+
long ASyncNetReceive::receiveHandlerID()
{
return _receiveHandlerID;
@@ -234,6 +296,7 @@
dp->useCount = 1;
gotPacketNotification.data = dp;
NotificationManager::the()->send(gotPacketNotification);
+ sent.push_back(dp);
}
/*
@@ -251,8 +314,29 @@
*/
void ASyncNetReceive::processedPacket(GenericDataPacket *packet)
{
+ // FIXME: HACK HACK HACK HACK (protect myself against disconnections)
+ _copy();
+ sent.remove(packet);
+ arts_debug("[ANR] freePacket");
stream->freePacket(packet);
- sender.processed();
+ arts_debug("[ANR] processed");
+ if(!sender.isNull())
+ {
+ FlowSystemSender xsender = sender; // FIXME: MORE HACK
+ xsender.processed();
+ }
+ arts_debug("[ANR] ok");
+ _release();
+}
+
+void ASyncNetReceive::disconnect()
+{
+ if(!sender.isNull())
+ {
+ FlowSystemSender s = sender;
+ sender = FlowSystemSender::null();
+ s.disconnect();
+ }
}
void ASyncNetReceive::sendPacket(GenericDataPacket *packet)
Index: flow/asyncschedule.h
===================================================================
RCS file: /home/kde/kdelibs/arts/flow/asyncschedule.h,v
retrieving revision 1.8
diff -u -u -r1.8 asyncschedule.h
--- flow/asyncschedule.h 2000/05/17 22:48:20 1.8
+++ flow/asyncschedule.h 2000/09/29 15:12:41
@@ -26,6 +26,8 @@
#include "synthschedule.h"
#include "datapacket.h"
+#include <queue>
+
namespace Arts {
class ASyncNetSend : public FlowSystemSender_skel
@@ -42,6 +44,7 @@
void notify(const Notification& notification);
void processed();
void setReceiver(FlowSystemReceiver receiver);
+ void disconnect();
};
class ASyncNetReceive : public FlowSystemReceiver_skel,
@@ -51,10 +54,12 @@
GenericAsyncStream *stream;
FlowSystemSender sender;
Notification gotPacketNotification;
+ list<GenericDataPacket *> sent;
long _receiveHandlerID;
public:
ASyncNetReceive(ASyncPort *port, FlowSystemSender sender);
+ ~ASyncNetReceive();
// GenericDataChannel interface
void processedPacket(GenericDataPacket *packet);
@@ -65,6 +70,7 @@
// FlowSystemReceiver interface
long receiveHandlerID();
+ void disconnect();
void receive(Buffer *buffer); // custom data receiver
};
@@ -72,8 +78,10 @@
protected:
long notifyID;
std::vector<Notification> subscribers;
+ list<GenericDataPacket *> sent;
GenericAsyncStream *stream;
+ FlowSystemSender sender;
bool pull;
Notification pullNotification;
@@ -87,6 +95,7 @@
// Port interface
ASyncPort(std::string name, void *ptr, long flags, StdScheduleNode* parent);
+ ~ASyncPort();
void connect(Port *port);
void disconnect(Port *port);
Index: flow/synthschedule.cc
===================================================================
RCS file: /home/kde/kdelibs/arts/flow/synthschedule.cc,v
retrieving revision 1.30
diff -u -u -r1.30 synthschedule.cc
--- flow/synthschedule.cc 2000/09/28 22:42:37 1.30
+++ flow/synthschedule.cc 2000/09/29 15:12:45
@@ -857,13 +857,16 @@
if(ap)
{
+ FlowSystemSender sender;
+ FlowSystemReceiver receiver;
+ FlowSystem remoteFs;
+
ASyncNetSend *netsend = new ASyncNetSend();
ap->sendNet(netsend);
-
- FlowSystem remoteFs = destObject._flowSystem();
- FlowSystemReceiver receiver;
- receiver = remoteFs.createReceiver(destObject, destPort, \
FlowSystemSender::_from_base(netsend));
+ sender = FlowSystemSender::_from_base(netsend); // don't release netsend
+ remoteFs = destObject._flowSystem();
+ receiver = remoteFs.createReceiver(destObject, destPort, sender);
netsend->setReceiver(receiver);
arts_debug("connected an asyncnetsend");
}
@@ -913,7 +916,7 @@
* really disconnected on connection drop, which is also bad (but
* not as ugly as a crash)
*/
- return FlowSystemReceiver::_from_base((new ASyncNetReceive(ap, sender))->_copy());
+ return FlowSystemReceiver::_from_base(new ASyncNetReceive(ap, sender));
}
return FlowSystemReceiver::null();
}
@@ -958,7 +961,7 @@
if(died > 10000)
{
free(done);
- artsdebug("scheduler confusion: circle?\n");
+ arts_warning("scheduler confusion: circle?");
return;
}
}
Index: mcop/connection.cc
===================================================================
RCS file: /home/kde/kdelibs/arts/mcop/connection.cc,v
retrieving revision 1.9
diff -u -u -r1.9 connection.cc
--- mcop/connection.cc 2000/09/28 22:42:37 1.9
+++ mcop/connection.cc 2000/09/29 15:12:46
@@ -58,6 +58,12 @@
void Connection::receive(unsigned char *data, long len)
{
+ /*
+ * protect against being freed while receive is running, as there are a
+ * few points where reentrant event loops may happen (Dispatcher::handle)
+ */
+ _copy();
+
if(len > remaining)
{
unsigned char *data2 = data+remaining;
@@ -66,6 +72,8 @@
/* This could be optimized to a non recursive thing (fixme?) */
receive(data2,len2);
+
+ _release(); // closes _copy() from start
return;
}
// get a buffer for the incoming message:
@@ -135,4 +143,5 @@
Dispatcher::the()->handle(this,received,messageType);
}
}
+ _release(); // closes _copy() from start
}
Index: mcop/core.cc
===================================================================
RCS file: /home/kde/kdelibs/arts/mcop/core.cc,v
retrieving revision 1.44
diff -u -u -r1.44 core.cc
--- mcop/core.cc 2000/09/28 21:14:26 1.44
+++ mcop/core.cc 2000/09/29 15:12:58
@@ -1179,6 +1179,19 @@
}
+void Arts::FlowSystemSender_stub::disconnect()
+{
+ long methodID = _lookupMethodFast("method:0000000b646973636f6e6e6563740000000005766f696400000000020000000000000000");
+ long requestID;
+ Arts::Buffer *request, *result;
+ request = Arts::Dispatcher::the()->createRequest(requestID,_objectID,methodID);
+ request->patchLength();
+ _connection->qSendBuffer(request);
+
+ result = Arts::Dispatcher::the()->waitForResult(requestID,_connection);
+ if(result) delete result;
+}
+
std::string Arts::FlowSystemSender_skel::_interfaceName()
{
return "Arts::FlowSystemSender";
@@ -1202,15 +1215,23 @@
((Arts::FlowSystemSender_skel *)object)->processed();
}
+// disconnect
+static void _dispatch_Arts_FlowSystemSender_01(void *object, Arts::Buffer *, \
Arts::Buffer *) +{
+ ((Arts::FlowSystemSender_skel *)object)->disconnect();
+}
+
void Arts::FlowSystemSender_skel::_buildMethodTable()
{
Arts::Buffer m;
m.fromString(
"MethodTable:0000000a70726f6365737365640000000005766f69640000000001"
- "0000000000000000",
+ "00000000000000000000000b646973636f6e6e6563740000000005766f69640000"
+ "0000020000000000000000",
"MethodTable"
);
_addMethod(_dispatch_Arts_FlowSystemSender_00,this,Arts::MethodDef(m));
+ _addMethod(_dispatch_Arts_FlowSystemSender_01,this,Arts::MethodDef(m));
}
Arts::FlowSystemSender_skel::FlowSystemSender_skel()
@@ -1294,6 +1315,19 @@
// constructor to create a stub for an object
}
+void Arts::FlowSystemReceiver_stub::disconnect()
+{
+ long methodID = _lookupMethodFast("method:0000000b646973636f6e6e6563740000000005766f696400000000020000000000000000");
+ long requestID;
+ Arts::Buffer *request, *result;
+ request = Arts::Dispatcher::the()->createRequest(requestID,_objectID,methodID);
+ request->patchLength();
+ _connection->qSendBuffer(request);
+
+ result = Arts::Dispatcher::the()->waitForResult(requestID,_connection);
+ if(result) delete result;
+}
+
long Arts::FlowSystemReceiver_stub::receiveHandlerID()
{
long methodID = _lookupMethodFast("method:000000165f6765745f7265636569766548616e646c6572494400000000056c6f6e6700000000020000000000000000");
@@ -1327,8 +1361,14 @@
return "Arts::FlowSystemReceiver";
}
+// disconnect
+static void _dispatch_Arts_FlowSystemReceiver_00(void *object, Arts::Buffer *, \
Arts::Buffer *) +{
+ ((Arts::FlowSystemReceiver_skel *)object)->disconnect();
+}
+
// _get_receiveHandlerID
-static void _dispatch_Arts_FlowSystemReceiver_00(void *object, Arts::Buffer *, \
Arts::Buffer *result) +static void _dispatch_Arts_FlowSystemReceiver_01(void *object, \
Arts::Buffer *, Arts::Buffer *result) {
result->writeLong(((Arts::FlowSystemReceiver_skel *)object)->receiveHandlerID());
}
@@ -1337,11 +1377,13 @@
{
Arts::Buffer m;
m.fromString(
- "MethodTable:000000165f6765745f7265636569766548616e646c657249440000"
- "0000056c6f6e6700000000020000000000000000",
+ "MethodTable:0000000b646973636f6e6e6563740000000005766f696400000000"
+ "020000000000000000000000165f6765745f7265636569766548616e646c657249"
+ "4400000000056c6f6e6700000000020000000000000000",
"MethodTable"
);
_addMethod(_dispatch_Arts_FlowSystemReceiver_00,this,Arts::MethodDef(m));
+ _addMethod(_dispatch_Arts_FlowSystemReceiver_01,this,Arts::MethodDef(m));
}
Arts::FlowSystemReceiver_skel::FlowSystemReceiver_skel()
@@ -2386,74 +2428,76 @@
"7279547970657300000000082a737472696e6700000000020000000000000000000000"
"0b7175657279456e756d7300000000082a737472696e67000000000200000000000000"
"0000000000000000000000000000000017417274733a3a466c6f7753797374656d5365"
- "6e6465720000000000000000010000000a70726f6365737365640000000005766f6964"
- "0000000001000000000000000000000000000000000000000000000019417274733a3a"
- "466c6f7753797374656d52656365697665720000000000000000000000000100000011"
- "7265636569766548616e646c6572494400000000056c6f6e6700000000120000000000"
- "0000000000000000000011417274733a3a466c6f7753797374656d0000000000000000"
- "060000000c73746172744f626a6563740000000005766f696400000000020000000100"
- "0000076f626a65637400000000056e6f64650000000000000000000000000b73746f70"
- "4f626a6563740000000005766f6964000000000200000001000000076f626a65637400"
- "000000056e6f64650000000000000000000000000e636f6e6e6563744f626a65637400"
- "00000005766f6964000000000200000004000000076f626a656374000000000d736f75"
- "7263654f626a656374000000000000000007737472696e67000000000b736f75726365"
- "506f72740000000000000000076f626a656374000000000b646573744f626a65637400"
- "0000000000000007737472696e67000000000964657374506f72740000000000000000"
- "0000000011646973636f6e6e6563744f626a6563740000000005766f69640000000002"
- "00000004000000076f626a656374000000000d736f757263654f626a65637400000000"
- "0000000007737472696e67000000000b736f75726365506f7274000000000000000007"
- "6f626a656374000000000b646573744f626a656374000000000000000007737472696e"
- "67000000000964657374506f72740000000000000000000000000b7175657279466c61"
- "67730000000014417274733a3a41747472696275746554797065000000000200000002"
- "000000076f626a65637400000000056e6f6465000000000000000007737472696e6700"
- "00000005706f72740000000000000000000000000f6372656174655265636569766572"
- "0000000019417274733a3a466c6f7753797374656d5265636569766572000000000200"
- "000003000000076f626a656374000000000b646573744f626a65637400000000000000"
- "0007737472696e67000000000964657374506f7274000000000000000017417274733a"
- "3a466c6f7753797374656d53656e646572000000000773656e64657200000000000000"
- "000000000000000000000000000000000011417274733a3a476c6f62616c436f6d6d00"
- "0000000000000003000000047075740000000008626f6f6c65616e0000000002000000"
- "0200000007737472696e6700000000097661726961626c650000000000000000077374"
- "72696e67000000000676616c7565000000000000000000000000046765740000000007"
- "737472696e6700000000020000000100000007737472696e6700000000097661726961"
- "626c650000000000000000000000000665726173650000000005766f69640000000002"
- "0000000100000007737472696e6700000000097661726961626c650000000000000000"
- "0000000000000000000000000000000014417274733a3a546d70476c6f62616c436f6d"
- "6d000000000100000011417274733a3a476c6f62616c436f6d6d000000000000000000"
- "000000000000000000000012417274733a3a5472616465724f66666572000000000000"
- "0000010000000c67657450726f706572747900000000082a737472696e670000000002"
- "0000000100000007737472696e6700000000056e616d65000000000000000000000000"
- "010000000e696e746572666163654e616d650000000007737472696e67000000001200"
- "000000000000000000000000000012417274733a3a5472616465725175657279000000"
- "00000000000200000009737570706f7274730000000005766f69640000000002000000"
- "0200000007737472696e67000000000970726f70657274790000000000000000077374"
- "72696e67000000000676616c7565000000000000000000000000067175657279000000"
- "00132a417274733a3a5472616465724f66666572000000000200000000000000000000"
- "000000000000000000000000000d417274733a3a4f626a65637400000000000000000e"
- "0000000e5f6c6f6f6b75704d6574686f6400000000056c6f6e67000000000200000001"
- "00000010417274733a3a4d6574686f64446566000000000a6d6574686f644465660000"
- "000000000000000000000f5f696e746572666163654e616d650000000007737472696e"
- "6700000000020000000000000000000000105f7175657279496e746572666163650000"
- "000013417274733a3a496e746572666163654465660000000002000000010000000773"
- "7472696e6700000000056e616d650000000000000000000000000b5f71756572795479"
- "7065000000000e417274733a3a54797065446566000000000200000001000000077374"
- "72696e6700000000056e616d650000000000000000000000000b5f7175657279456e75"
- "6d000000000e417274733a3a456e756d44656600000000020000000100000007737472"
- "696e6700000000056e616d650000000000000000000000000a5f746f537472696e6700"
- "00000007737472696e6700000000020000000000000000000000125f6973436f6d7061"
- "7469626c65576974680000000008626f6f6c65616e0000000002000000010000000773"
- "7472696e67000000000e696e746572666163656e616d65000000000000000000000000"
- "0c5f636f707952656d6f74650000000005766f69640000000002000000000000000000"
- "00000b5f75736552656d6f74650000000005766f696400000000020000000000000000"
- "0000000f5f72656c6561736552656d6f74650000000005766f69640000000002000000"
- "00000000000000000a5f6164644368696c640000000007737472696e67000000000200"
- "000002000000076f626a65637400000000066368696c64000000000000000007737472"
- "696e6700000000056e616d650000000000000000000000000d5f72656d6f7665436869"
- "6c640000000008626f6f6c65616e00000000020000000100000007737472696e670000"
- "0000056e616d650000000000000000000000000a5f6765744368696c6400000000076f"
- "626a65637400000000020000000100000007737472696e6700000000056e616d650000"
- "000000000000000000000f5f71756572794368696c6472656e00000000082a73747269"
- "6e6700000000020000000000000000000000010000000c5f666c6f7753797374656d00"
- "00000011417274733a3a466c6f7753797374656d000000001200000000000000000000"
- "000000000000"
+ "6e6465720000000000000000020000000a70726f6365737365640000000005766f6964"
+ "000000000100000000000000000000000b646973636f6e6e6563740000000005766f69"
+ "640000000002000000000000000000000000000000000000000000000019417274733a"
+ "3a466c6f7753797374656d52656365697665720000000000000000010000000b646973"
+ "636f6e6e6563740000000005766f696400000000020000000000000000000000010000"
+ "00117265636569766548616e646c6572494400000000056c6f6e670000000012000000"
+ "00000000000000000000000011417274733a3a466c6f7753797374656d000000000000"
+ "0000060000000c73746172744f626a6563740000000005766f69640000000002000000"
+ "01000000076f626a65637400000000056e6f64650000000000000000000000000b7374"
+ "6f704f626a6563740000000005766f6964000000000200000001000000076f626a6563"
+ "7400000000056e6f64650000000000000000000000000e636f6e6e6563744f626a6563"
+ "740000000005766f6964000000000200000004000000076f626a656374000000000d73"
+ "6f757263654f626a656374000000000000000007737472696e67000000000b736f7572"
+ "6365506f72740000000000000000076f626a656374000000000b646573744f626a6563"
+ "74000000000000000007737472696e67000000000964657374506f7274000000000000"
+ "00000000000011646973636f6e6e6563744f626a6563740000000005766f6964000000"
+ "000200000004000000076f626a656374000000000d736f757263654f626a6563740000"
+ "00000000000007737472696e67000000000b736f75726365506f727400000000000000"
+ "00076f626a656374000000000b646573744f626a656374000000000000000007737472"
+ "696e67000000000964657374506f72740000000000000000000000000b717565727946"
+ "6c6167730000000014417274733a3a4174747269627574655479706500000000020000"
+ "0002000000076f626a65637400000000056e6f6465000000000000000007737472696e"
+ "670000000005706f72740000000000000000000000000f637265617465526563656976"
+ "65720000000019417274733a3a466c6f7753797374656d526563656976657200000000"
+ "0200000003000000076f626a656374000000000b646573744f626a6563740000000000"
+ "00000007737472696e67000000000964657374506f7274000000000000000017417274"
+ "733a3a466c6f7753797374656d53656e646572000000000773656e6465720000000000"
+ "0000000000000000000000000000000000000011417274733a3a476c6f62616c436f6d"
+ "6d000000000000000003000000047075740000000008626f6f6c65616e000000000200"
+ "00000200000007737472696e6700000000097661726961626c65000000000000000007"
+ "737472696e67000000000676616c756500000000000000000000000004676574000000"
+ "0007737472696e6700000000020000000100000007737472696e670000000009766172"
+ "6961626c650000000000000000000000000665726173650000000005766f6964000000"
+ "00020000000100000007737472696e6700000000097661726961626c65000000000000"
+ "00000000000000000000000000000000000014417274733a3a546d70476c6f62616c43"
+ "6f6d6d000000000100000011417274733a3a476c6f62616c436f6d6d00000000000000"
+ "0000000000000000000000000012417274733a3a5472616465724f6666657200000000"
+ "00000000010000000c67657450726f706572747900000000082a737472696e67000000"
+ "00020000000100000007737472696e6700000000056e616d6500000000000000000000"
+ "0000010000000e696e746572666163654e616d650000000007737472696e6700000000"
+ "1200000000000000000000000000000012417274733a3a547261646572517565727900"
+ "000000000000000200000009737570706f7274730000000005766f6964000000000200"
+ "00000200000007737472696e67000000000970726f7065727479000000000000000007"
+ "737472696e67000000000676616c756500000000000000000000000006717565727900"
+ "000000132a417274733a3a5472616465724f6666657200000000020000000000000000"
+ "0000000000000000000000000000000d417274733a3a4f626a65637400000000000000"
+ "000e0000000e5f6c6f6f6b75704d6574686f6400000000056c6f6e6700000000020000"
+ "000100000010417274733a3a4d6574686f64446566000000000a6d6574686f64446566"
+ "0000000000000000000000000f5f696e746572666163654e616d650000000007737472"
+ "696e6700000000020000000000000000000000105f7175657279496e74657266616365"
+ "0000000013417274733a3a496e74657266616365446566000000000200000001000000"
+ "07737472696e6700000000056e616d650000000000000000000000000b5f7175657279"
+ "54797065000000000e417274733a3a5479706544656600000000020000000100000007"
+ "737472696e6700000000056e616d650000000000000000000000000b5f717565727945"
+ "6e756d000000000e417274733a3a456e756d4465660000000002000000010000000773"
+ "7472696e6700000000056e616d650000000000000000000000000a5f746f537472696e"
+ "670000000007737472696e6700000000020000000000000000000000125f6973436f6d"
+ "70617469626c65576974680000000008626f6f6c65616e000000000200000001000000"
+ "07737472696e67000000000e696e746572666163656e616d6500000000000000000000"
+ "00000c5f636f707952656d6f74650000000005766f6964000000000200000000000000"
+ "000000000b5f75736552656d6f74650000000005766f69640000000002000000000000"
+ "00000000000f5f72656c6561736552656d6f74650000000005766f6964000000000200"
+ "000000000000000000000a5f6164644368696c640000000007737472696e6700000000"
+ "0200000002000000076f626a65637400000000066368696c6400000000000000000773"
+ "7472696e6700000000056e616d650000000000000000000000000d5f72656d6f766543"
+ "68696c640000000008626f6f6c65616e00000000020000000100000007737472696e67"
+ "00000000056e616d650000000000000000000000000a5f6765744368696c6400000000"
+ "076f626a65637400000000020000000100000007737472696e6700000000056e616d65"
+ "0000000000000000000000000f5f71756572794368696c6472656e00000000082a7374"
+ "72696e6700000000020000000000000000000000010000000c5f666c6f775379737465"
+ "6d0000000011417274733a3a466c6f7753797374656d00000000120000000000000000"
+ "0000000000000000"
);
Index: mcop/core.h
===================================================================
RCS file: /home/kde/kdelibs/arts/mcop/core.h,v
retrieving revision 1.48
diff -u -u -r1.48 core.h
--- mcop/core.h 2000/09/08 21:30:22 1.48
+++ mcop/core.h 2000/09/29 15:13:04
@@ -418,6 +418,7 @@
void *_cast(unsigned long iid);
virtual void processed() = 0;
+ virtual void disconnect() = 0;
};
class FlowSystemSender_stub : virtual public FlowSystemSender_base, virtual public \
Arts::Object_stub { @@ -428,6 +429,7 @@
FlowSystemSender_stub(Arts::Connection *connection, long objectID);
void processed();
+ void disconnect();
};
class FlowSystemSender_skel : virtual public FlowSystemSender_base, virtual public \
Arts::Object_skel { @@ -485,6 +487,7 @@
inline FlowSystemSender_base* _base() {return _cache?_cache:_method_call();}
inline void processed();
+ inline void disconnect();
};
class FlowSystemReceiver_base : virtual public Arts::Object_base {
@@ -507,6 +510,7 @@
void *_cast(unsigned long iid);
virtual long receiveHandlerID() = 0;
+ virtual void disconnect() = 0;
};
class FlowSystemReceiver_stub : virtual public FlowSystemReceiver_base, virtual \
public Arts::Object_stub { @@ -517,6 +521,7 @@
FlowSystemReceiver_stub(Arts::Connection *connection, long objectID);
long receiveHandlerID();
+ void disconnect();
};
class FlowSystemReceiver_skel : virtual public FlowSystemReceiver_base, virtual \
public Arts::Object_skel { @@ -574,6 +579,7 @@
inline FlowSystemReceiver_base* _base() {return _cache?_cache:_method_call();}
inline long receiveHandlerID();
+ inline void disconnect();
};
class FlowSystem_base : virtual public Arts::Object_base {
@@ -1101,9 +1107,19 @@
_cache?static_cast<Arts::FlowSystemSender_base*>(_cache)->processed():static_cast<Arts::FlowSystemSender_base*>(_method_call())->processed();
}
+inline void Arts::FlowSystemSender::disconnect()
+{
+ _cache?static_cast<Arts::FlowSystemSender_base*>(_cache)->disconnect():static_cast<Arts::FlowSystemSender_base*>(_method_call())->disconnect();
+}
+
inline long Arts::FlowSystemReceiver::receiveHandlerID()
{
return _cache?static_cast<Arts::FlowSystemReceiver_base*>(_cache)->receiveHandlerID( \
):static_cast<Arts::FlowSystemReceiver_base*>(_method_call())->receiveHandlerID(); +}
+
+inline void Arts::FlowSystemReceiver::disconnect()
+{
+ _cache?static_cast<Arts::FlowSystemReceiver_base*>(_cache)->disconnect():static_cast<Arts::FlowSystemReceiver_base*>(_method_call())->disconnect();
}
inline void Arts::FlowSystem::startObject(Arts::Object node)
Index: mcop/core.idl
===================================================================
RCS file: /home/kde/kdelibs/arts/mcop/core.idl,v
retrieving revision 1.28
diff -u -u -r1.28 core.idl
--- mcop/core.idl 2000/08/11 13:40:43 1.28
+++ mcop/core.idl 2000/09/29 15:13:06
@@ -371,6 +371,13 @@
* a packet of the stream
*/
oneway void processed();
+
+ /**
+ * This method is for telling the local FlowSystemSender to break the
+ * connection to the remote Receiver (it's not intended to be called
+ * remotely)
+ */
+ void disconnect();
};
/**
@@ -384,6 +391,13 @@
* The custom message ID which should be used to send the stream packets
*/
readonly attribute long receiveHandlerID;
+
+ /**
+ * This method is for telling the local FlowSystemReceiver to break the
+ * connection to the remote Sender (it's not intended to be called
+ * remotely)
+ */
+ void disconnect();
};
/**
@@ -408,7 +422,7 @@
*/
void stopObject(object node);
- /**
+/**
* This connects two objects, maybe even remote
*
* it is important that
Index: mcop/datapacket.h
===================================================================
RCS file: /home/kde/kdelibs/arts/mcop/datapacket.h,v
retrieving revision 1.8
diff -u -u -r1.8 datapacket.h
--- mcop/datapacket.h 2000/07/27 14:09:10 1.8
+++ mcop/datapacket.h 2000/09/29 15:13:07
@@ -106,7 +106,13 @@
inline void processed()
{
useCount--;
- if(useCount == 0) channel->processedPacket(this);
+ if(useCount == 0)
+ {
+ if(channel)
+ channel->processedPacket(this);
+ else
+ delete this;
+ }
}
virtual ~GenericDataPacket()
Index: mcop/dispatcher.cc
===================================================================
RCS file: /home/kde/kdelibs/arts/mcop/dispatcher.cc,v
retrieving revision 1.41
diff -u -u -r1.41 dispatcher.cc
--- mcop/dispatcher.cc 2000/09/28 22:42:37 1.41
+++ mcop/dispatcher.cc 2000/09/29 15:13:10
@@ -182,6 +182,10 @@
if(objectManager)
objectManager->removeGlobalReferences();
+ /* remove everything that might have been tagged for remote copying */
+ referenceClean->forceClean();
+ delete referenceClean;
+
d->globalComm = GlobalComm::null();
/* all objects should be gone now - remove all extensions we loaded */
@@ -203,7 +207,6 @@
*/
signal(SIGPIPE,orig_sigpipe);
- delete referenceClean;
d->interfaceRepo = InterfaceRepo::null();
@@ -389,6 +392,7 @@
long requestID = buffer->readLong();
Buffer *result = new Buffer;
+
// write mcop header record
result->writeLong(MCOP_MAGIC);
result->writeLong(0); // message length - to be patched later
@@ -482,7 +486,6 @@
}
else if(md5authSupported)
{
-
Buffer *helloBuffer = new Buffer;
Header header(MCOP_MAGIC,0,mcopClientHello);
@@ -548,6 +551,7 @@
}
Buffer *helloBuffer = new Buffer;
+
Header header(MCOP_MAGIC,0,mcopAuthAccept);
header.writeType(*helloBuffer);
d->accept->writeType(*helloBuffer);
@@ -729,7 +733,7 @@
assert(conn->isConnected(reference.serverID));
return conn;
}
- printf("bad luck: connecting server didn't work\n");
+ arts_debug("bad luck: connecting server didn't work");
// well - bad luck (connecting that server failed)
conn->_release();
Index: mcop/referenceclean.cc
===================================================================
RCS file: /home/kde/kdelibs/arts/mcop/referenceclean.cc,v
retrieving revision 1.6
diff -u -u -r1.6 referenceclean.cc
--- mcop/referenceclean.cc 2000/05/28 18:16:03 1.6
+++ mcop/referenceclean.cc 2000/09/29 15:13:10
@@ -57,6 +57,22 @@
}
}
+// FIXME: this might not be clean, as deleting some objects might cause
+// others to go away this serial cleaning might result in bad surprises
+void ReferenceClean::forceClean()
+{
+ /*
+ * and as we're giving a second chance on reference clean, we need to
+ * clean twice to really really clean up
+ */
+ for(int count = 0; count < 2; count++)
+ {
+ list<Object_skel *> items = objectPool.enumerate();
+ list<Object_skel *>::iterator i;
+ for(i=items.begin();i != items.end();i++) (*i)->_referenceClean();
+ }
+}
+
ReferenceClean::~ReferenceClean()
{
Dispatcher::the()->ioManager()->removeTimer(this);
Index: mcop/referenceclean.h
===================================================================
RCS file: /home/kde/kdelibs/arts/mcop/referenceclean.h,v
retrieving revision 1.3
diff -u -u -r1.3 referenceclean.h
--- mcop/referenceclean.h 2000/05/17 22:48:20 1.3
+++ mcop/referenceclean.h 2000/09/29 15:13:10
@@ -32,6 +32,16 @@
Pool<Object_skel>& objectPool;
public:
ReferenceClean(Pool<Object_skel>& objectPool);
+
+ /**
+ * this routine forces cleaning of all tagged remote objects
+ *
+ * it will be called on dispatcher shutdown, since after this there
+ * is no remote interaction anyway, it is be used to prevent memory
+ * leaks
+ */
+ void forceClean();
+
void notifyTime();
virtual ~ReferenceClean();
};
Index: mcop/socketconnection.cc
===================================================================
RCS file: /home/kde/kdelibs/arts/mcop/socketconnection.cc,v
retrieving revision 1.12
diff -u -u -r1.12 socketconnection.cc
--- mcop/socketconnection.cc 2000/09/28 20:58:52 1.12
+++ mcop/socketconnection.cc 2000/09/29 15:13:11
@@ -137,6 +137,8 @@
if(n > 0)
{
receive(buffer,n);
+ // warning: the object may not exist any more here!
+ return;
}
else if(n == 0 && errno != EAGAIN)
{
_______________________________________________
Kde-multimedia mailing list
Kde-multimedia@master.kde.org
http://master.kde.org/mailman/listinfo/kde-multimedia
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic