Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

# wait.h

    00001 #ifndef CRYPTOPP_WAIT_H
    00002 #define CRYPTOPP_WAIT_H
    00003
    00004 #include "config.h"
    00005
    00006 #ifdef SOCKETS_AVAILABLE
    00007
    00008 #include "cryptlib.h"
    00009 #include <vector>
    00010
    00011 #ifdef USE_WINDOWS_STYLE_SOCKETS
    00012 #include <winsock2.h>
    00013 #else
    00014 #include <sys/types.h>
    00015 #endif
    00016
    00017 #ifdef NDEBUG
    00018 #define CRYPTOPP_DETECT_NO_WAIT 0
    00019 #else
    00020 #define CRYPTOPP_DETECT_NO_WAIT 1
    00021 #endif
    00022
    00023 #if CRYPTOPP_DETECT_NO_WAIT
    00024 #include "hrtimer.h"
    00025 #endif
    00026
    00027 NAMESPACE_BEGIN(CryptoPP)
    00028
    00029 struct WaitingThreadData;
    00030
    00031 //! container of wait objects
    00032 class WaitObjectContainer
    00033 {
    00034 public:
    00035         //! exception thrown by WaitObjectContainer
    00036         class Err : public Exception
    00037         {
    00038         public:
    00039                 Err(const std::string& s) : Exception(IO_ERROR, s) {}
    00040         };
    00041
    00042         static unsigned int MaxWaitObjects();
    00043
    00044         WaitObjectContainer();
    00045
    00046         void Clear();
    00047         void SetNoWait();
    00048         bool Wait(unsigned long milliseconds);
    00049
    00050 #ifdef USE_WINDOWS_STYLE_SOCKETS
    00051         ~WaitObjectContainer();
    00052         void AddHandle(HANDLE handle);
    00053 #else
    00054         void AddReadFd(int fd);
    00055         void AddWriteFd(int fd);
    00056 #endif
    00057
    00058 private:
    00059 #ifdef USE_WINDOWS_STYLE_SOCKETS
    00060         void CreateThreads(unsigned int count);
    00061         std::vector<HANDLE> m_handles;
    00062         std::vector<WaitingThreadData *> m_threads;
    00063         HANDLE m_startWaiting;
    00064         HANDLE m_stopWaiting;
    00065 #else
    00066         fd_set m_readfds, m_writefds;
    00067         int m_maxFd;
    00068 #endif
    00069         bool m_noWait;
    00070
    00071 #if CRYPTOPP_DETECT_NO_WAIT
    00072 #ifdef USE_WINDOWS_STYLE_SOCKETS
    00073         DWORD m_lastResult;
    00074 #else
    00075         int m_lastResult;
    00076 #endif
    00077         unsigned int m_sameResultCount;
    00078         Timer m_timer;
    00079 #endif
    00080 };
    00081
    00082 NAMESPACE_END
    00083
    00084 #endif
    00085
    00086 #endif