diff options
author | Frank Schmirler <vdr@schmirler.de> | 2010-12-02 08:56:19 +0100 |
---|---|---|
committer | Frank Schmirler <vdr@schmirler.de> | 2010-12-02 08:57:31 +0100 |
commit | e6249bf957a943920b11abbd9efac1efa18b1d00 (patch) | |
tree | 3cc549f4f35e3d0210f7e9dbabf68bf0e27770dc /tools/select.c | |
parent | 5e30711bfdb28085234a5ef6da4f4e44305ac3e4 (diff) | |
download | vdr-plugin-streamdev-e6249bf957a943920b11abbd9efac1efa18b1d00.tar.gz vdr-plugin-streamdev-e6249bf957a943920b11abbd9efac1efa18b1d00.tar.bz2 |
Snapshot 2007-04-03
Diffstat (limited to 'tools/select.c')
-rw-r--r-- | tools/select.c | 14 |
1 files changed, 8 insertions, 6 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; } |