3 #ifndef CRYPTOPP_WAIT_H
4 #define CRYPTOPP_WAIT_H
8 #if !defined(NO_OS_DEPENDENCE) && (defined(SOCKETS_AVAILABLE) || defined(WINDOWS_PIPES_AVAILABLE))
14 #ifdef USE_WINDOWS_STYLE_SOCKETS
17 #include <sys/types.h>
18 #include <sys/select.h>
22 #if defined(CRYPTOPP_WIN32_AVAILABLE)
23 #define WIN32_LEAN_AND_MEAN
29 #if defined(__has_feature)
30 # if __has_feature(memory_sanitizer)
31 # define CRYPTOPP_MSAN 1
37 #if CRYPTOPP_MSC_VERSION == 1900
38 # pragma warning(push)
39 # pragma warning(disable: 4589)
47 Tracer(
unsigned int level) : m_level(level) {}
52 virtual void Trace(
unsigned int n, std::string
const& s) = 0;
58 virtual bool UsingDefaults()
const {
return true; }
63 void TraceIf(
unsigned int n, std::string
const&s)
64 {
if (n) Trace(n, s); }
70 unsigned int Tracing(
unsigned int nr,
unsigned int minLevel)
const
71 {
return (UsingDefaults() && m_level >= minLevel) ? nr : 0; }
80 #define CRYPTOPP_TRACER_CONSTRUCTOR(DERIVED) \
81 public: DERIVED(unsigned int level = 0) : Tracer(level) {}
83 #define CRYPTOPP_BEGIN_TRACER_CLASS_1(DERIVED, BASE1) \
84 class DERIVED : virtual public BASE1, public NotCopyable { CRYPTOPP_TRACER_CONSTRUCTOR(DERIVED)
86 #define CRYPTOPP_BEGIN_TRACER_CLASS_2(DERIVED, BASE1, BASE2) \
87 class DERIVED : virtual public BASE1, virtual public BASE2, public NotCopyable { CRYPTOPP_TRACER_CONSTRUCTOR(DERIVED)
89 #define CRYPTOPP_END_TRACER_CLASS };
94 #define CRYPTOPP_BEGIN_TRACER_EVENTS(UNIQUENR) enum { EVENTBASE = UNIQUENR,
95 #define CRYPTOPP_TRACER_EVENT(EVENTNAME) EventNr_##EVENTNAME,
96 #define CRYPTOPP_END_TRACER_EVENTS };
108 #define CRYPTOPP_TRACER_EVENT_METHODS(EVENTNAME, LOGLEVEL) \
109 virtual unsigned int Trace##EVENTNAME() const { return Tracing(EventNr_##EVENTNAME, LOGLEVEL); } \
110 virtual void Trace##EVENTNAME(std::string const& s) { TraceIf(Trace##EVENTNAME(), s); }
128 CallStack const* Prev()
const {
return m_prev; }
129 virtual std::string Format()
const;
141 std::string Format()
const;
152 std::string Format()
const;
160 CRYPTOPP_BEGIN_TRACER_EVENTS(0x48752841)
161 CRYPTOPP_TRACER_EVENT(NoWaitLoop)
162 CRYPTOPP_END_TRACER_EVENTS
163 CRYPTOPP_TRACER_EVENT_METHODS(NoWaitLoop, 1)
164 CRYPTOPP_END_TRACER_CLASS
179 static unsigned int MaxWaitObjects();
184 void SetNoWait(
CallStack const& callStack);
185 void ScheduleEvent(
double milliseconds,
CallStack const& callStack);
187 bool Wait(
unsigned long milliseconds);
189 #ifdef USE_WINDOWS_STYLE_SOCKETS
190 # ifndef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562
195 void AddHandle(HANDLE handle,
CallStack const& callStack);
197 void AddReadFd(
int fd,
CallStack const& callStack);
198 void AddWriteFd(
int fd,
CallStack const& callStack);
204 #ifdef USE_WINDOWS_STYLE_SOCKETS
205 void CreateThreads(
unsigned int count);
206 std::vector<HANDLE> m_handles;
207 std::vector<WaitingThreadData *> m_threads;
208 HANDLE m_startWaiting;
209 HANDLE m_stopWaiting;
211 fd_set m_readfds, m_writefds;
215 double m_firstEventTime;
218 #ifdef USE_WINDOWS_STYLE_SOCKETS
219 typedef size_t LastResultType;
221 typedef int LastResultType;
223 enum { LASTRESULT_NOWAIT = -1, LASTRESULT_SCHEDULED = -2, LASTRESULT_TIMEOUT = -3 };
224 LastResultType m_lastResult;
225 unsigned int m_sameResultCount;
227 void SetLastResult(LastResultType result);
228 void DetectNoWait(LastResultType result,
CallStack const& callStack);
233 #if CRYPTOPP_MSC_VERSION == 1900
234 # pragma warning(pop)