Ticket #11867: slave_disable_callbacks.patch

File slave_disable_callbacks.patch, 4.5 KB (added by stuartm, 11 years ago)

Make sure callbacks are disabled when the slave backend ANNounces.

  • mythtv/libs/libmythbase/mythsocket.cpp

    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 b bool MythSocket::ReadStringList(QStringList &list, uint timeoutMS) 
    330330bool MythSocket::SendReceiveStringList(
    331331    QStringList &strlist, uint min_reply_length, uint timeoutMS)
    332332{
    333     if (m_callback)
     333    if (m_callback && m_disableReadyReadCallback.testAndSetOrdered(0,0))
    334334    {
    335335        // If callbacks are enabled then SendReceiveStringList() will conflict
    336336        // causing failed reads and socket disconnections - see #11777
    bool MythSocket::SendReceiveStringList( 
    338338        // the control socket
    339339        LOG(VB_GENERAL, LOG_EMERG, QString("Programmer Error! "
    340340                                           "SendReceiveStringList(%1) used on "
    341                                            "socket with callbacks.")
     341                                           "socket with callbacks enabled.")
    342342                                .arg(strlist.isEmpty() ? "empty" : strlist[0]));
    343         return false;
    344343    }
    345344
    346345    if (!WriteStringList(strlist))
  • mythtv/programs/mythbackend/mainserver.cpp

    diff --git a/mythtv/programs/mythbackend/mainserver.cpp b/mythtv/programs/mythbackend/mainserver.cpp
    index 11332e3..88c3e8a 100644
    a b void MainServer::NewConnection(int socketDescriptor) 
    425425
    426426void MainServer::readyRead(MythSocket *sock)
    427427{
    428     sockListLock.lockForRead();
    429     PlaybackSock *testsock = GetPlaybackBySock(sock);
    430     bool expecting_reply = testsock && testsock->isExpectingReply();
    431     sockListLock.unlock();
    432     if (expecting_reply)
    433     {
    434         LOG(VB_GENERAL, LOG_INFO, "readyRead ignoring, expecting reply");
    435         return;
    436     }
    437 
    438428    threadPool.startReserved(
    439429        new ProcessRequestRunnable(*this, sock),
    440430        "ProcessRequest", PRT_TIMEOUT);
    void MainServer::reconnectTimeout(void) 
    62476237        }
    62486238    }
    62496239
     6240    // Calling SendReceiveStringList() with callbacks enabled is asking for
     6241    // trouble, our reply might be swallowed by readyRead
     6242    masterServerSock->SetReadyReadCallbackEnabled(false);
    62506243    if (!masterServerSock->SendReceiveStringList(strlist, 1) ||
    62516244        (strlist[0] == "ERROR"))
    62526245    {
    void MainServer::reconnectTimeout(void) 
    62686261        masterServerReconnect->start(kMasterServerReconnectTimeout);
    62696262        return;
    62706263    }
     6264    masterServerSock->SetReadyReadCallbackEnabled(true);
    62716265
    62726266    masterServer = new PlaybackSock(this, masterServerSock, server,
    62736267                                    kPBSEvents_Normal);
  • mythtv/programs/mythbackend/playbacksock.cpp

    diff --git a/mythtv/programs/mythbackend/playbacksock.cpp b/mythtv/programs/mythbackend/playbacksock.cpp
    index 549a89c..d482fda 100644
    a b PlaybackSock::PlaybackSock( 
    2828    ip = "";
    2929    backend = false;
    3030    mediaserver = false;
    31     expectingreply = false;
    3231
    3332    disconnected = false;
    3433    blockshutdown = true;
    bool PlaybackSock::SendReceiveStringList( 
    8180
    8281    {
    8382        QMutexLocker locker(&sockLock);
    84         expectingreply = true;
     83        sock->SetReadyReadCallbackEnabled(false);
    8584
    8685        ok = sock->SendReceiveStringList(strlist);
    8786        while (ok && strlist[0] == "BACKEND_MESSAGE")
    bool PlaybackSock::SendReceiveStringList( 
    9897
    9998            ok = sock->ReadStringList(strlist);
    10099        }
    101 
    102         expectingreply = false;
     100        sock->SetReadyReadCallbackEnabled(true);
    103101    }
    104102
    105103    sock->DecrRef();
  • mythtv/programs/mythbackend/playbacksock.h

    diff --git a/mythtv/programs/mythbackend/playbacksock.h b/mythtv/programs/mythbackend/playbacksock.h
    index c273604..4452222 100644
    a b class PlaybackSock : public ReferenceCounter 
    5454    bool isMediaServer(void) const { return mediaserver; }
    5555    void setAsMediaServer(void) { mediaserver = true; }
    5656
    57     bool isExpectingReply(void) const { return expectingreply; }
    58 
    5957    void setIP(QString &lip) { ip = lip; }
    6058    QString getIP(void) const { return ip; }
    6159
    class PlaybackSock : public ReferenceCounter 
    118116
    119117    QMutex sockLock;
    120118
    121     bool expectingreply;
    122119    bool disconnected;
    123120
    124121    MainServer *m_parent;