commit 52aa60d0322e8f7e0201c5dde721f7bef2325baf
Author: Stuart Morgan <smorgan@mythtv.org>
Date:   Thu Sep 19 12:31:15 2013 +0100

    Make sure callbacks are disabled when the slave backend ANNounces.

diff --git a/mythtv/libs/libmythbase/mythsocket.cpp b/mythtv/libs/libmythbase/mythsocket.cpp
index e3298db..bb85b92 100644
--- a/mythtv/libs/libmythbase/mythsocket.cpp
+++ b/mythtv/libs/libmythbase/mythsocket.cpp
@@ -330,7 +330,7 @@ bool MythSocket::ReadStringList(QStringList &list, uint timeoutMS)
 bool MythSocket::SendReceiveStringList(
     QStringList &strlist, uint min_reply_length, uint timeoutMS)
 {
-    if (m_callback)
+    if (m_callback && m_disableReadyReadCallback.testAndSetOrdered(0,0))
     {
         // If callbacks are enabled then SendReceiveStringList() will conflict
         // causing failed reads and socket disconnections - see #11777
@@ -338,9 +338,8 @@ bool MythSocket::SendReceiveStringList(
         // the control socket
         LOG(VB_GENERAL, LOG_EMERG, QString("Programmer Error! "
                                            "SendReceiveStringList(%1) used on "
-                                           "socket with callbacks.")
+                                           "socket with callbacks enabled.")
                                 .arg(strlist.isEmpty() ? "empty" : strlist[0]));
-        return false;
     }
 
     if (!WriteStringList(strlist))
diff --git a/mythtv/programs/mythbackend/mainserver.cpp b/mythtv/programs/mythbackend/mainserver.cpp
index 11332e3..88c3e8a 100644
--- a/mythtv/programs/mythbackend/mainserver.cpp
+++ b/mythtv/programs/mythbackend/mainserver.cpp
@@ -425,16 +425,6 @@ void MainServer::NewConnection(int socketDescriptor)
 
 void MainServer::readyRead(MythSocket *sock)
 {
-    sockListLock.lockForRead();
-    PlaybackSock *testsock = GetPlaybackBySock(sock);
-    bool expecting_reply = testsock && testsock->isExpectingReply();
-    sockListLock.unlock();
-    if (expecting_reply)
-    {
-        LOG(VB_GENERAL, LOG_INFO, "readyRead ignoring, expecting reply");
-        return;
-    }
-
     threadPool.startReserved(
         new ProcessRequestRunnable(*this, sock),
         "ProcessRequest", PRT_TIMEOUT);
@@ -6247,6 +6237,9 @@ void MainServer::reconnectTimeout(void)
         }
     }
 
+    // Calling SendReceiveStringList() with callbacks enabled is asking for
+    // trouble, our reply might be swallowed by readyRead
+    masterServerSock->SetReadyReadCallbackEnabled(false);
     if (!masterServerSock->SendReceiveStringList(strlist, 1) ||
         (strlist[0] == "ERROR"))
     {
@@ -6268,6 +6261,7 @@ void MainServer::reconnectTimeout(void)
         masterServerReconnect->start(kMasterServerReconnectTimeout);
         return;
     }
+    masterServerSock->SetReadyReadCallbackEnabled(true);
 
     masterServer = new PlaybackSock(this, masterServerSock, server,
                                     kPBSEvents_Normal);
diff --git a/mythtv/programs/mythbackend/playbacksock.cpp b/mythtv/programs/mythbackend/playbacksock.cpp
index 549a89c..d482fda 100644
--- a/mythtv/programs/mythbackend/playbacksock.cpp
+++ b/mythtv/programs/mythbackend/playbacksock.cpp
@@ -28,7 +28,6 @@ PlaybackSock::PlaybackSock(
     ip = "";
     backend = false;
     mediaserver = false;
-    expectingreply = false;
 
     disconnected = false;
     blockshutdown = true;
@@ -81,7 +80,7 @@ bool PlaybackSock::SendReceiveStringList(
 
     {
         QMutexLocker locker(&sockLock);
-        expectingreply = true;
+        sock->SetReadyReadCallbackEnabled(false);
 
         ok = sock->SendReceiveStringList(strlist);
         while (ok && strlist[0] == "BACKEND_MESSAGE")
@@ -98,8 +97,7 @@ bool PlaybackSock::SendReceiveStringList(
 
             ok = sock->ReadStringList(strlist);
         }
-
-        expectingreply = false;
+        sock->SetReadyReadCallbackEnabled(true);
     }
 
     sock->DecrRef();
diff --git a/mythtv/programs/mythbackend/playbacksock.h b/mythtv/programs/mythbackend/playbacksock.h
index c273604..4452222 100644
--- a/mythtv/programs/mythbackend/playbacksock.h
+++ b/mythtv/programs/mythbackend/playbacksock.h
@@ -54,8 +54,6 @@ class PlaybackSock : public ReferenceCounter
     bool isMediaServer(void) const { return mediaserver; }
     void setAsMediaServer(void) { mediaserver = true; }
 
-    bool isExpectingReply(void) const { return expectingreply; }
-
     void setIP(QString &lip) { ip = lip; }
     QString getIP(void) const { return ip; }
 
@@ -118,7 +116,6 @@ class PlaybackSock : public ReferenceCounter
 
     QMutex sockLock;
 
-    bool expectingreply;
     bool disconnected;
 
     MainServer *m_parent;
