summaryrefslogtreecommitdiff
path: root/wait.cpp
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2002-10-04 17:31:41 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2002-10-04 17:31:41 +0000
commitb21162cf8e06f40baa1f58be6a8c17435cebc34d (patch)
tree8b045309c238226c32a563b1df6b9c30a2f0e0b3 /wait.cpp
downloadcryptopp-b21162cf8e06f40baa1f58be6a8c17435cebc34d.tar.gz
Initial revision
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@2 57ff6487-cd31-0410-9ec3-f628ee90f5f0
Diffstat (limited to 'wait.cpp')
-rw-r--r--wait.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/wait.cpp b/wait.cpp
new file mode 100644
index 0000000..f7a0e36
--- /dev/null
+++ b/wait.cpp
@@ -0,0 +1,110 @@
+// wait.cpp - written and placed in the public domain by Wei Dai
+
+#include "pch.h"
+#include "wait.h"
+#include "misc.h"
+
+#ifdef SOCKETS_AVAILABLE
+
+#ifdef USE_BERKELEY_STYLE_SOCKETS
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>
+#endif
+
+NAMESPACE_BEGIN(CryptoPP)
+
+WaitObjectContainer::WaitObjectContainer()
+{
+ Clear();
+}
+
+void WaitObjectContainer::Clear()
+{
+#ifdef USE_WINDOWS_STYLE_SOCKETS
+ m_handles.clear();
+#else
+ m_maxFd = 0;
+ FD_ZERO(&m_readfds);
+ FD_ZERO(&m_writefds);
+#endif
+ m_noWait = false;
+}
+
+#ifdef USE_WINDOWS_STYLE_SOCKETS
+
+void WaitObjectContainer::AddHandle(HANDLE handle)
+{
+ m_handles.push_back(handle);
+}
+
+bool WaitObjectContainer::Wait(unsigned long milliseconds)
+{
+ if (m_noWait || m_handles.empty())
+ return true;
+
+ DWORD result = ::WaitForMultipleObjects(m_handles.size(), &m_handles[0], FALSE, milliseconds);
+
+ if (result >= WAIT_OBJECT_0 && result < WAIT_OBJECT_0 + m_handles.size())
+ return true;
+ else if (result == WAIT_TIMEOUT)
+ return false;
+ else
+ throw Err("WaitObjectContainer: WaitForMultipleObjects failed with error " + IntToString(::GetLastError()));
+}
+
+#else
+
+void WaitObjectContainer::AddReadFd(int fd)
+{
+ FD_SET(fd, &m_readfds);
+ m_maxFd = STDMAX(m_maxFd, fd);
+}
+
+void WaitObjectContainer::AddWriteFd(int fd)
+{
+ FD_SET(fd, &m_writefds);
+ m_maxFd = STDMAX(m_maxFd, fd);
+}
+
+bool WaitObjectContainer::Wait(unsigned long milliseconds)
+{
+ if (m_noWait || m_maxFd == 0)
+ return true;
+
+ timeval tv, *timeout;
+
+ if (milliseconds == INFINITE_TIME)
+ timeout = NULL;
+ else
+ {
+ tv.tv_sec = milliseconds / 1000;
+ tv.tv_usec = (milliseconds % 1000) * 1000;
+ timeout = &tv;
+ }
+
+ int result = select(m_maxFd+1, &m_readfds, &m_writefds, NULL, timeout);
+
+ if (result > 0)
+ return true;
+ else if (result == 0)
+ return false;
+ else
+ throw Err("WaitObjectContainer: select failed with error " + errno);
+}
+
+#endif
+
+// ********************************************************
+
+bool Waitable::Wait(unsigned long milliseconds)
+{
+ WaitObjectContainer container;
+ GetWaitObjects(container);
+ return container.Wait(milliseconds);
+}
+
+NAMESPACE_END
+
+#endif