00001
#ifndef CRYPTOPP_WAIT_H
00002
#define CRYPTOPP_WAIT_H
00003
00004
#include "cryptopp_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
00032 class
WaitObjectContainer
00033 {
00034
public:
00035
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