⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wait.h

📁 lots Elliptic curve cryptography codes. Use Visual c++ to compile
💻 H
字号:
#ifndef CRYPTOPP_WAIT_H#define CRYPTOPP_WAIT_H#include "config.h"#ifdef SOCKETS_AVAILABLE#include "misc.h"#include "cryptlib.h"#include <vector>#ifdef USE_WINDOWS_STYLE_SOCKETS#include <winsock2.h>#else#include <sys/types.h>#endif#include "hrtimer.h"NAMESPACE_BEGIN(CryptoPP)class Tracer{public:	Tracer(unsigned int level) : m_level(level) {}	virtual ~Tracer() {}protected:	//! Override this in your most-derived tracer to do the actual tracing.	virtual void Trace(unsigned int n, std::string const& s) = 0;	/*! By default, tracers will decide which trace messages to trace according to a trace level		mechanism. If your most-derived tracer uses a different mechanism, override this to		return false. If this method returns false, the default TraceXxxx(void) methods will all		return 0 and must be overridden explicitly by your tracer for trace messages you want. */	virtual bool UsingDefaults() const { return true; }protected:	unsigned int m_level;	void TraceIf(unsigned int n, std::string const&s)		{ if (n) Trace(n, s); }	/*! Returns nr if, according to the default log settings mechanism (using log levels),	    the message should be traced. Returns 0 if the default trace level mechanism is not		in use, or if it is in use but the event should not be traced. Provided as a utility		method for easier and shorter coding of default TraceXxxx(void) implementations. */	unsigned int Tracing(unsigned int nr, unsigned int minLevel) const		{ return (UsingDefaults() && m_level >= minLevel) ? nr : 0; }};// Your Tracer-derived class should inherit as virtual public from Tracer or another// Tracer-derived class, and should pass the log level in its constructor. You can use the// following methods to begin and end your Tracer definition.// This constructor macro initializes Tracer directly even if not derived directly from it;// this is intended, virtual base classes are always initialized by the most derived class.#define CRYPTOPP_TRACER_CONSTRUCTOR(DERIVED) \	public: DERIVED(unsigned int level = 0) : Tracer(level) {}#define CRYPTOPP_BEGIN_TRACER_CLASS_1(DERIVED, BASE1) \	class DERIVED : virtual public BASE1 { CRYPTOPP_TRACER_CONSTRUCTOR(DERIVED)#define CRYPTOPP_BEGIN_TRACER_CLASS_2(DERIVED, BASE1, BASE2) \	class DERIVED : virtual public BASE1, virtual public BASE2 { CRYPTOPP_TRACER_CONSTRUCTOR(DERIVED)#define CRYPTOPP_END_TRACER_CLASS };// In your Tracer-derived class, you should define a globally unique event number for each// new event defined. This can be done using the following macros.#define CRYPTOPP_BEGIN_TRACER_EVENTS(UNIQUENR)	enum { EVENTBASE = UNIQUENR,#define CRYPTOPP_TRACER_EVENT(EVENTNAME)				EventNr_##EVENTNAME,#define CRYPTOPP_END_TRACER_EVENTS				};// In your own Tracer-derived class, you must define two methods per new trace event type:// - unsigned int TraceXxxx() const//   Your default implementation of this method should return the event number if according//   to the default trace level system the event should be traced, or 0 if it should not.// - void TraceXxxx(string const& s)//   This method should call TraceIf(TraceXxxx(), s); to do the tracing.// For your convenience, a macro to define these two types of methods are defined below.// If you use this macro, you should also use the TRACER_EVENTS macros above to associate// event names with numbers.#define CRYPTOPP_TRACER_EVENT_METHODS(EVENTNAME, LOGLEVEL) \	virtual unsigned int Trace##EVENTNAME() const { return Tracing(EventNr_##EVENTNAME, LOGLEVEL); } \	virtual void Trace##EVENTNAME(std::string const& s) { TraceIf(Trace##EVENTNAME(), s); }/*! A simple unidirectional linked list with m_prev == 0 to indicate the final entry.    The aim of this implementation is to provide a very lightweight and practical	tracing mechanism with a low performance impact. Functions and methods supporting	this call-stack mechanism would take a parameter of the form "CallStack const& callStack",	and would pass this parameter to subsequent functions they call using the construct:	SubFunc(arg1, arg2, CallStack("my func at place such and such", &callStack));		The advantage of this approach is that it is easy to use and should be very efficient,	involving no allocation from the heap, just a linked list of stack objects containing	pointers to static ASCIIZ strings (or possibly additional but simple data if derived). */class CallStack{public:	CallStack(char const* i, CallStack const* p) : m_info(i), m_prev(p) {}	CallStack const* Prev() const { return m_prev; }	virtual std::string Format() const;protected:	char const* m_info;	CallStack const* m_prev;};/*! An extended CallStack entry type with an additional numeric parameter. */class CallStackWithNr : public CallStack{public:	CallStackWithNr(char const* i, word32 n, CallStack const* p) : CallStack(i, p), m_nr(n) {}	std::string Format() const;protected:	word32 m_nr;};/*! An extended CallStack entry type with an additional string parameter. */class CallStackWithStr : public CallStack{public:	CallStackWithStr(char const* i, char const* z, CallStack const* p) : CallStack(i, p), m_z(z) {}	std::string Format() const;protected:	char const* m_z;};CRYPTOPP_BEGIN_TRACER_CLASS_1(WaitObjectsTracer, Tracer)	CRYPTOPP_BEGIN_TRACER_EVENTS(0x48752841)		CRYPTOPP_TRACER_EVENT(NoWaitLoop)	CRYPTOPP_END_TRACER_EVENTS	CRYPTOPP_TRACER_EVENT_METHODS(NoWaitLoop, 1)CRYPTOPP_END_TRACER_CLASSstruct WaitingThreadData;//! container of wait objectsclass WaitObjectContainer : public NotCopyable{public:	//! exception thrown by WaitObjectContainer	class Err : public Exception	{	public:		Err(const std::string& s) : Exception(IO_ERROR, s) {}	};	static unsigned int MaxWaitObjects();	WaitObjectContainer(WaitObjectsTracer* tracer = 0);	void Clear();	void SetNoWait(CallStack const& callStack);	void ScheduleEvent(double milliseconds, CallStack const& callStack);	// returns false if timed out	bool Wait(unsigned long milliseconds);#ifdef USE_WINDOWS_STYLE_SOCKETS	~WaitObjectContainer();	void AddHandle(HANDLE handle, CallStack const& callStack);#else	void AddReadFd(int fd, CallStack const& callStack);	void AddWriteFd(int fd, CallStack const& callStack);#endifprivate:	WaitObjectsTracer* m_tracer;#ifdef USE_WINDOWS_STYLE_SOCKETS	void CreateThreads(unsigned int count);	std::vector<HANDLE> m_handles;	std::vector<WaitingThreadData *> m_threads;	HANDLE m_startWaiting;	HANDLE m_stopWaiting;#else	fd_set m_readfds, m_writefds;	int m_maxFd;#endif	bool m_noWait;	double m_firstEventTime;	Timer m_eventTimer;#ifdef USE_WINDOWS_STYLE_SOCKETS	typedef size_t LastResultType;#else	typedef int LastResultType;#endif	enum { LASTRESULT_NOWAIT = -1, LASTRESULT_SCHEDULED = -2, LASTRESULT_TIMEOUT = -3 };	LastResultType m_lastResult;	unsigned int m_sameResultCount;	Timer m_noWaitTimer;	void SetLastResult(LastResultType result);	void DetectNoWait(LastResultType result, CallStack const& callStack);};NAMESPACE_END#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -