summaryrefslogtreecommitdiff
path: root/server/server.c
diff options
context:
space:
mode:
authorFrank Schmirler <vdr@schmirler.de>2011-03-07 21:37:08 +0100
committerFrank Schmirler <vdr@schmirler.de>2011-03-07 23:04:18 +0100
commitc06970123cd68bd1b2f2695326596430d236f230 (patch)
tree3f4a4d933a4e095abe5b9d1a68b58a8bf5475a0b /server/server.c
parentee7929bd39101f877ee731c96c457b5e38565b37 (diff)
downloadvdr-plugin-streamdev-c06970123cd68bd1b2f2695326596430d236f230.tar.gz
vdr-plugin-streamdev-c06970123cd68bd1b2f2695326596430d236f230.tar.bz2
Live TV must be switched in VDR main thread (fixes #568).
Diffstat (limited to 'server/server.c')
-rw-r--r--server/server.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/server/server.c b/server/server.c
index 1bdb20a..c7fa96f 100644
--- a/server/server.c
+++ b/server/server.c
@@ -121,7 +121,9 @@ void cStreamdevServer::Action(void)
cServerConnection *client = c->Accept();
if (!client)
continue;
+ Lock();
m_Clients.Add(client);
+ Unlock();
if (m_Clients.Count() > StreamdevServerSetup.MaxClients) {
esyslog("streamdev: too many clients, rejecting %s:%d",
@@ -153,17 +155,21 @@ void cStreamdevServer::Action(void)
isyslog("streamdev: closing streamdev connection to %s:%d",
s->RemoteIp().c_str(), s->RemotePort());
s->Close();
+ Lock();
m_Clients.Del(s);
+ Unlock();
}
s = next;
}
}
+ Lock();
while (m_Clients.Count() > 0) {
cServerConnection *s = m_Clients.First();
s->Close();
m_Clients.Del(s);
}
+ Unlock();
while (m_Servers.Count() > 0) {
cServerComponent *c = m_Servers.First();
@@ -171,3 +177,10 @@ void cStreamdevServer::Action(void)
m_Servers.Del(c);
}
}
+
+void cStreamdevServer::MainThreadHook(void)
+{
+ cThreadLock lock(m_Instance);
+ for (cServerConnection *s = m_Clients.First(); s; s = m_Clients.Next(s))
+ s->MainThreadHook();
+}