[mythtv] Mutex destroy failure problem (was: Slave backend
hangafter ANN command)
Jason Gillis
jgillis at acm.org
Thu Apr 7 22:30:50 UTC 2005
Isaac Richards wrote:
> Might check to see if the signal that's sent when the socket is closed
> (MainServer::endConnection) is getting called, and so the
> PlaybackSock object is getting prematurely deleted.
This looks like the likely culprit.
On my system, it looks like the following is happening:
. SendReceiveStringList() calls ReadStringList()
. When the slave disconnects, the socket gets closed
. The thread calling ReadStringList() jumps over to endConnection().
. endConnection() deletes the PlaybackSock object, causing the
ReadStringList() call to return false
. When ReadStringList() returns at this point, SendReceiveStringList()
tries to access members of the now deleted PlaybackSock object which causes
a seg fault
The problem, it seems, is that when the socket closes, the call to
ReadStringList() doesn't return until after endConnection() finishes
calling, so the PlaybackSock object is destroyed. If there was some way for
ReadStringList to return false at the same time that endConnection()
executes, then this could work out, but it looks like it's all a single
thread, so there's no chance for that to happen, and there doesn't seem to
be an obvious way (to me) to hand control back to ReadStringList() so it can
return false.
I modified endConnection to do the following:
void MainServer::endConnection(RefSocket *socket)
{
vector<PlaybackSock *>::iterator it = playbackList.begin();
for (; it != playbackList.end(); ++it)
{
QSocket *sock = (*it)->getSocket();
if (sock == socket)
{
if (ismaster && (*it)->isSlaveBackend())
{
VERBOSE(VB_ALL, QString("Slave backend: %1 has left the "
"building").arg((*it)->getHostname()));
playbackList.erase(it);
return;
}
...
That allowed things to continue just fine after the slave disconnected.
However, I don't doubt that this is "Not Good(tm)" from a many perspectives
(leaks, etc) since none of the data is getting erased and removed from other
structures. It does show that the PlaybackSock is getting removed too soon.
So, is there any way to mark the PlaybackSock for destruction at a later
time?
Jason
More information about the mythtv-dev
mailing list