1 #ifndef CRYPTOPP_WAIT_H
2 #define CRYPTOPP_WAIT_H
6 #ifdef SOCKETS_AVAILABLE
12 #ifdef USE_WINDOWS_STYLE_SOCKETS
15 #include <sys/types.h>
20 NAMESPACE_BEGIN(CryptoPP)
25 Tracer(
unsigned int level) : m_level(level) {}
30 virtual void Trace(
unsigned int n, std::string
const& s) = 0;
41 void TraceIf(
unsigned int n, std::string
const&s)
42 {
if (n) Trace(n, s); }
48 unsigned int Tracing(
unsigned int nr,
unsigned int minLevel)
const
49 {
return (UsingDefaults() && m_level >= minLevel) ? nr : 0; }
58 #define CRYPTOPP_TRACER_CONSTRUCTOR(DERIVED) \
59 public: DERIVED(unsigned int level = 0) : Tracer(level) {}
61 #define CRYPTOPP_BEGIN_TRACER_CLASS_1(DERIVED, BASE1) \
62 class DERIVED : virtual public BASE1 { CRYPTOPP_TRACER_CONSTRUCTOR(DERIVED)
64 #define CRYPTOPP_BEGIN_TRACER_CLASS_2(DERIVED, BASE1, BASE2) \
65 class DERIVED : virtual public BASE1, virtual public BASE2 { CRYPTOPP_TRACER_CONSTRUCTOR(DERIVED)
67 #define CRYPTOPP_END_TRACER_CLASS };
72 #define CRYPTOPP_BEGIN_TRACER_EVENTS(UNIQUENR) enum { EVENTBASE = UNIQUENR,
73 #define CRYPTOPP_TRACER_EVENT(EVENTNAME) EventNr_##EVENTNAME,
74 #define CRYPTOPP_END_TRACER_EVENTS };
86 #define CRYPTOPP_TRACER_EVENT_METHODS(EVENTNAME, LOGLEVEL) \
87 virtual unsigned int Trace##EVENTNAME() const { return Tracing(EventNr_##EVENTNAME, LOGLEVEL); } \
88 virtual void Trace##EVENTNAME(std::string const& s) { TraceIf(Trace##EVENTNAME(), s); }
106 CallStack const* Prev()
const {
return m_prev; }
107 virtual std::string Format()
const;
119 std::string Format()
const;
130 std::string Format()
const;
137 CRYPTOPP_BEGIN_TRACER_EVENTS(0x48752841)
138 CRYPTOPP_TRACER_EVENT(NoWaitLoop)
139 CRYPTOPP_END_TRACER_EVENTS
140 CRYPTOPP_TRACER_EVENT_METHODS(NoWaitLoop, 1)
141 CRYPTOPP_END_TRACER_CLASS
143 struct WaitingThreadData;
156 static unsigned int MaxWaitObjects();
161 void SetNoWait(
CallStack const& callStack);
162 void ScheduleEvent(
double milliseconds,
CallStack const& callStack);
164 bool Wait(
unsigned long milliseconds);
166 #ifdef USE_WINDOWS_STYLE_SOCKETS
168 void AddHandle(HANDLE handle,
CallStack const& callStack);
170 void AddReadFd(
int fd,
CallStack const& callStack);
171 void AddWriteFd(
int fd,
CallStack const& callStack);
177 #ifdef USE_WINDOWS_STYLE_SOCKETS
178 void CreateThreads(
unsigned int count);
179 std::vector<HANDLE> m_handles;
180 std::vector<WaitingThreadData *> m_threads;
181 HANDLE m_startWaiting;
182 HANDLE m_stopWaiting;
184 fd_set m_readfds, m_writefds;
188 double m_firstEventTime;
191 #ifdef USE_WINDOWS_STYLE_SOCKETS
192 typedef size_t LastResultType;
194 typedef int LastResultType;
196 enum { LASTRESULT_NOWAIT = -1, LASTRESULT_SCHEDULED = -2, LASTRESULT_TIMEOUT = -3 };
197 LastResultType m_lastResult;
198 unsigned int m_sameResultCount;
200 void SetLastResult(LastResultType result);
201 void DetectNoWait(LastResultType result,
CallStack const& callStack);
base class for all exceptions thrown by Crypto++
container of wait objects
unsigned int Tracing(unsigned int nr, unsigned int minLevel) const
exception thrown by WaitObjectContainer
virtual bool UsingDefaults() const