summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorschmirl <schmirl>2007-04-02 10:32:34 +0000
committerschmirl <schmirl>2007-04-02 10:32:34 +0000
commit525574f9b01275aaff3e1c923cc91404365d501e (patch)
tree0533e2aaecdd3e7a1fe26176d12895f9bd054bc0 /tools
parentcd7d4e3588af2cc36c8366fc8d65d0627a372c32 (diff)
downloadvdr-plugin-streamdev-525574f9b01275aaff3e1c923cc91404365d501e.tar.gz
vdr-plugin-streamdev-525574f9b01275aaff3e1c923cc91404365d501e.tar.bz2
Close connection when client is gone. Fixes high CPU load problem (#201)
Modified Files: server/connection.h server/connectionHTTP.h server/connectionVTP.h server/server.c server/streamer.c server/streamer.h tools/select.c tools/select.h tools/source.c
Diffstat (limited to 'tools')
-rw-r--r--tools/select.c14
-rw-r--r--tools/select.h14
-rw-r--r--tools/source.c12
3 files changed, 21 insertions, 19 deletions
diff --git a/tools/select.c b/tools/select.c
index 0ab5f9b..9568110 100644
--- a/tools/select.c
+++ b/tools/select.c
@@ -21,19 +21,21 @@ int cTBSelect::Select(uint TimeoutMs) {
tv.tv_usec = (TimeoutMs % 1000) * 1000;
tv.tv_sec = TimeoutMs / 1000;
+ memcpy(m_FdsResult, m_FdsQuery, sizeof(m_FdsResult));
if (TimeoutMs == 0)
- return ::select(m_MaxFiled + 1, &m_Rfds, &m_Wfds, NULL, &tv);
+ return ::select(m_MaxFiled + 1, &m_FdsResult[0], &m_FdsResult[1], NULL, &tv);
cTimeMs starttime;
ms = TimeoutMs;
- while (ms > 0 && (res = ::select(m_MaxFiled + 1, &m_Rfds, &m_Wfds, NULL,
+ while (ms > 0 && (res = ::select(m_MaxFiled + 1, &m_FdsResult[0], &m_FdsResult[1], NULL,
&tv)) == -1 && errno == EINTR) {
ms = TimeoutMs - starttime.Elapsed();
tv.tv_usec = (ms % 1000) * 1000;
tv.tv_sec = ms / 1000;
+ memcpy(m_FdsResult, m_FdsQuery, sizeof(m_FdsResult));
}
- if (ms <= 0) {
+ if (ms <= 0 || res == 0) {
errno = ETIMEDOUT;
return -1;
}
@@ -42,8 +44,8 @@ int cTBSelect::Select(uint TimeoutMs) {
int cTBSelect::Select(void) {
ssize_t res;
- while ((res = ::select(m_MaxFiled + 1, &m_Rfds, &m_Wfds, NULL, NULL)) == -1
- && errno == EINTR)
- ;
+ do {
+ memcpy(m_FdsResult, m_FdsQuery, sizeof(m_FdsResult));
+ } while ((res = ::select(m_MaxFiled + 1, &m_FdsResult[0], &m_FdsResult[1], NULL, NULL)) == -1 && errno == EINTR);
return res;
}
diff --git a/tools/select.h b/tools/select.h
index 7e873e2..a3622fd 100644
--- a/tools/select.h
+++ b/tools/select.h
@@ -11,8 +11,8 @@ class cTBSelect {
private:
int m_MaxFiled;
- fd_set m_Rfds;
- fd_set m_Wfds;
+ fd_set m_FdsQuery[2];
+ fd_set m_FdsResult[2];
public:
cTBSelect(void);
@@ -50,26 +50,26 @@ public:
};
inline void cTBSelect::Clear(void) {
- FD_ZERO(&m_Rfds);
- FD_ZERO(&m_Wfds);
+ FD_ZERO(&m_FdsQuery[0]);
+ FD_ZERO(&m_FdsQuery[1]);
m_MaxFiled = -1;
}
inline bool cTBSelect::Add(int Filed, bool Output /* = false */) {
if (Filed < 0) return false;
- FD_SET(Filed, Output ? &m_Wfds : &m_Rfds);
+ FD_SET(Filed, &m_FdsQuery[Output ? 1 : 0]);
if (Filed > m_MaxFiled) m_MaxFiled = Filed;
return true;
}
inline bool cTBSelect::CanRead(int FileNo) const {
if (FileNo < 0) return false;
- return FD_ISSET(FileNo, &m_Rfds);
+ return FD_ISSET(FileNo, &m_FdsResult[0]);
}
inline bool cTBSelect::CanWrite(int FileNo) const {
if (FileNo < 0) return false;
- return FD_ISSET(FileNo, &m_Wfds);
+ return FD_ISSET(FileNo, &m_FdsResult[1]);
}
#endif // TOOLBOX_SELECT_H
diff --git a/tools/source.c b/tools/source.c
index c832e2f..80625e5 100644
--- a/tools/source.c
+++ b/tools/source.c
@@ -61,11 +61,11 @@ bool cTBSource::TimedWrite(const void *Buffer, size_t Length, uint TimeoutMs) {
cTimeMs starttime;
ms = TimeoutMs;
offs = 0;
+ sel.Clear();
+ sel.Add(m_Filed, true);
while (Length > 0) {
int b;
- sel.Clear();
- sel.Add(m_Filed, true);
if (sel.Select(ms) == -1)
return false;
@@ -90,11 +90,11 @@ bool cTBSource::SafeWrite(const void *Buffer, size_t Length) {
int offs;
offs = 0;
+ sel.Clear();
+ sel.Add(m_Filed, true);
while (Length > 0) {
int b;
- sel.Clear();
- sel.Add(m_Filed, true);
if (sel.Select() == -1)
return false;
@@ -128,9 +128,9 @@ ssize_t cTBSource::ReadUntil(void *Buffer, size_t Length, const char *Seq,
cTimeMs starttime;
ms = TimeoutMs;
+ sel.Clear();
+ sel.Add(m_Filed, false);
while (m_LineBuffer.size() < BUFSIZ) {
- sel.Clear();
- sel.Add(m_Filed, false);
if (sel.Select(ms) == -1)
return -1;