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; |