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)
|
| 330 | 330 | bool MythSocket::SendReceiveStringList( |
| 331 | 331 | QStringList &strlist, uint min_reply_length, uint timeoutMS) |
| 332 | 332 | { |
| 333 | | if (m_callback) |
| | 333 | if (m_callback && m_disableReadyReadCallback.testAndSetOrdered(0,0)) |
| 334 | 334 | { |
| 335 | 335 | // If callbacks are enabled then SendReceiveStringList() will conflict |
| 336 | 336 | // causing failed reads and socket disconnections - see #11777 |
| … |
… |
bool MythSocket::SendReceiveStringList(
|
| 338 | 338 | // the control socket |
| 339 | 339 | LOG(VB_GENERAL, LOG_EMERG, QString("Programmer Error! " |
| 340 | 340 | "SendReceiveStringList(%1) used on " |
| 341 | | "socket with callbacks.") |
| | 341 | "socket with callbacks enabled.") |
| 342 | 342 | .arg(strlist.isEmpty() ? "empty" : strlist[0])); |
| 343 | | return false; |
| 344 | 343 | } |
| 345 | 344 | |
| 346 | 345 | if (!WriteStringList(strlist)) |
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)
|
| 425 | 425 | |
| 426 | 426 | void MainServer::readyRead(MythSocket *sock) |
| 427 | 427 | { |
| 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 | | |
| 438 | 428 | threadPool.startReserved( |
| 439 | 429 | new ProcessRequestRunnable(*this, sock), |
| 440 | 430 | "ProcessRequest", PRT_TIMEOUT); |
| … |
… |
void MainServer::reconnectTimeout(void)
|
| 6247 | 6237 | } |
| 6248 | 6238 | } |
| 6249 | 6239 | |
| | 6240 | // Calling SendReceiveStringList() with callbacks enabled is asking for |
| | 6241 | // trouble, our reply might be swallowed by readyRead |
| | 6242 | masterServerSock->SetReadyReadCallbackEnabled(false); |
| 6250 | 6243 | if (!masterServerSock->SendReceiveStringList(strlist, 1) || |
| 6251 | 6244 | (strlist[0] == "ERROR")) |
| 6252 | 6245 | { |
| … |
… |
void MainServer::reconnectTimeout(void)
|
| 6268 | 6261 | masterServerReconnect->start(kMasterServerReconnectTimeout); |
| 6269 | 6262 | return; |
| 6270 | 6263 | } |
| | 6264 | masterServerSock->SetReadyReadCallbackEnabled(true); |
| 6271 | 6265 | |
| 6272 | 6266 | masterServer = new PlaybackSock(this, masterServerSock, server, |
| 6273 | 6267 | kPBSEvents_Normal); |
diff --git a/mythtv/programs/mythbackend/playbacksock.cpp b/mythtv/programs/mythbackend/playbacksock.cpp
index 549a89c..d482fda 100644
|
a
|
b
|
PlaybackSock::PlaybackSock(
|
| 28 | 28 | ip = ""; |
| 29 | 29 | backend = false; |
| 30 | 30 | mediaserver = false; |
| 31 | | expectingreply = false; |
| 32 | 31 | |
| 33 | 32 | disconnected = false; |
| 34 | 33 | blockshutdown = true; |
| … |
… |
bool PlaybackSock::SendReceiveStringList(
|
| 81 | 80 | |
| 82 | 81 | { |
| 83 | 82 | QMutexLocker locker(&sockLock); |
| 84 | | expectingreply = true; |
| | 83 | sock->SetReadyReadCallbackEnabled(false); |
| 85 | 84 | |
| 86 | 85 | ok = sock->SendReceiveStringList(strlist); |
| 87 | 86 | while (ok && strlist[0] == "BACKEND_MESSAGE") |
| … |
… |
bool PlaybackSock::SendReceiveStringList(
|
| 98 | 97 | |
| 99 | 98 | ok = sock->ReadStringList(strlist); |
| 100 | 99 | } |
| 101 | | |
| 102 | | expectingreply = false; |
| | 100 | sock->SetReadyReadCallbackEnabled(true); |
| 103 | 101 | } |
| 104 | 102 | |
| 105 | 103 | sock->DecrRef(); |
diff --git a/mythtv/programs/mythbackend/playbacksock.h b/mythtv/programs/mythbackend/playbacksock.h
index c273604..4452222 100644
|
a
|
b
|
class PlaybackSock : public ReferenceCounter
|
| 54 | 54 | bool isMediaServer(void) const { return mediaserver; } |
| 55 | 55 | void setAsMediaServer(void) { mediaserver = true; } |
| 56 | 56 | |
| 57 | | bool isExpectingReply(void) const { return expectingreply; } |
| 58 | | |
| 59 | 57 | void setIP(QString &lip) { ip = lip; } |
| 60 | 58 | QString getIP(void) const { return ip; } |
| 61 | 59 | |
| … |
… |
class PlaybackSock : public ReferenceCounter
|
| 118 | 116 | |
| 119 | 117 | QMutex sockLock; |
| 120 | 118 | |
| 121 | | bool expectingreply; |
| 122 | 119 | bool disconnected; |
| 123 | 120 | |
| 124 | 121 | MainServer *m_parent; |