diff options
author | schmirl <schmirl> | 2007-04-02 10:32:34 +0000 |
---|---|---|
committer | schmirl <schmirl> | 2007-04-02 10:32:34 +0000 |
commit | 525574f9b01275aaff3e1c923cc91404365d501e (patch) | |
tree | 0533e2aaecdd3e7a1fe26176d12895f9bd054bc0 /tools | |
parent | cd7d4e3588af2cc36c8366fc8d65d0627a372c32 (diff) | |
download | vdr-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.c | 14 | ||||
-rw-r--r-- | tools/select.h | 14 | ||||
-rw-r--r-- | tools/source.c | 12 |
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; |