📄 wait_8cpp-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title>Crypto++: wait.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"><link href="tabs.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.5.2 --><div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="classes.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> </ul></div><div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>File Members</span></a></li> </ul></div><h1>wait.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// wait.cpp - written and placed in the public domain by Wei Dai</span><a name="l00002"></a>00002 <a name="l00003"></a>00003 <span class="preprocessor">#include "pch.h"</span><a name="l00004"></a>00004 <span class="preprocessor">#include "wait.h"</span><a name="l00005"></a>00005 <span class="preprocessor">#include "misc.h"</span><a name="l00006"></a>00006 <a name="l00007"></a>00007 <span class="preprocessor">#ifdef SOCKETS_AVAILABLE</span><a name="l00008"></a>00008 <span class="preprocessor"></span><a name="l00009"></a>00009 <span class="preprocessor">#ifdef USE_BERKELEY_STYLE_SOCKETS</span><a name="l00010"></a>00010 <span class="preprocessor"></span><span class="preprocessor">#include <errno.h></span><a name="l00011"></a>00011 <span class="preprocessor">#include <sys/types.h></span><a name="l00012"></a>00012 <span class="preprocessor">#include <sys/time.h></span><a name="l00013"></a>00013 <span class="preprocessor">#include <unistd.h></span><a name="l00014"></a>00014 <span class="preprocessor">#endif</span><a name="l00015"></a>00015 <span class="preprocessor"></span><a name="l00016"></a>00016 NAMESPACE_BEGIN(CryptoPP)<a name="l00017"></a>00017 <a name="l00018"></a><a class="code" href="class_wait_object_container.html#0d3f3b8478f1aac70cc50892d0d2e947">00018</a> unsigned <span class="keywordtype">int</span> <a class="code" href="class_wait_object_container.html" title="container of wait objects">WaitObjectContainer</a>::MaxWaitObjects()<a name="l00019"></a>00019 {<a name="l00020"></a>00020 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span><a name="l00021"></a>00021 <span class="preprocessor"></span> <span class="keywordflow">return</span> MAXIMUM_WAIT_OBJECTS * (MAXIMUM_WAIT_OBJECTS-1);<a name="l00022"></a>00022 <span class="preprocessor">#else</span><a name="l00023"></a>00023 <span class="preprocessor"></span> <span class="keywordflow">return</span> FD_SETSIZE;<a name="l00024"></a>00024 <span class="preprocessor">#endif</span><a name="l00025"></a>00025 <span class="preprocessor"></span>}<a name="l00026"></a>00026 <a name="l00027"></a><a class="code" href="class_wait_object_container.html#ca4696cfd8ddadb1bbfda7d34da0f6c8">00027</a> <a class="code" href="class_wait_object_container.html#ca4696cfd8ddadb1bbfda7d34da0f6c8">WaitObjectContainer::WaitObjectContainer</a>(<a class="code" href="class_wait_objects_tracer.html">WaitObjectsTracer</a>* tracer)<a name="l00028"></a>00028 : m_tracer(tracer), m_eventTimer(<a class="code" href="class_timer.html" title="high resolution timer">Timer</a>::MILLISECONDS)<a name="l00029"></a>00029 , m_sameResultCount(0), m_noWaitTimer(<a class="code" href="class_timer.html" title="high resolution timer">Timer</a>::MILLISECONDS)<a name="l00030"></a>00030 {<a name="l00031"></a>00031 <a class="code" href="class_wait_object_container.html#ec6e64b9a47f08e8c90c295ef7b8f833">Clear</a>();<a name="l00032"></a>00032 m_eventTimer.<a class="code" href="class_timer_base.html#50804b61c4254f7289c6c67515d5d46d">StartTimer</a>();<a name="l00033"></a>00033 }<a name="l00034"></a>00034 <a name="l00035"></a><a class="code" href="class_wait_object_container.html#ec6e64b9a47f08e8c90c295ef7b8f833">00035</a> <span class="keywordtype">void</span> <a class="code" href="class_wait_object_container.html#ec6e64b9a47f08e8c90c295ef7b8f833">WaitObjectContainer::Clear</a>()<a name="l00036"></a>00036 {<a name="l00037"></a>00037 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span><a name="l00038"></a>00038 <span class="preprocessor"></span> m_handles.clear();<a name="l00039"></a>00039 <span class="preprocessor">#else</span><a name="l00040"></a>00040 <span class="preprocessor"></span> m_maxFd = 0;<a name="l00041"></a>00041 FD_ZERO(&m_readfds);<a name="l00042"></a>00042 FD_ZERO(&m_writefds);<a name="l00043"></a>00043 <span class="preprocessor">#endif</span><a name="l00044"></a>00044 <span class="preprocessor"></span> m_noWait = <span class="keyword">false</span>;<a name="l00045"></a>00045 m_firstEventTime = 0;<a name="l00046"></a>00046 }<a name="l00047"></a>00047 <a name="l00048"></a>00048 <span class="keyword">inline</span> <span class="keywordtype">void</span> WaitObjectContainer::SetLastResult(LastResultType result)<a name="l00049"></a>00049 {<a name="l00050"></a>00050 <span class="keywordflow">if</span> (result == m_lastResult)<a name="l00051"></a>00051 m_sameResultCount++;<a name="l00052"></a>00052 <span class="keywordflow">else</span><a name="l00053"></a>00053 {<a name="l00054"></a>00054 m_lastResult = result;<a name="l00055"></a>00055 m_sameResultCount = 0;<a name="l00056"></a>00056 }<a name="l00057"></a>00057 }<a name="l00058"></a>00058 <a name="l00059"></a>00059 <span class="keywordtype">void</span> WaitObjectContainer::DetectNoWait(LastResultType result, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>& callStack)<a name="l00060"></a>00060 {<a name="l00061"></a>00061 <span class="keywordflow">if</span> (result == m_lastResult && m_noWaitTimer.<a class="code" href="class_timer_base.html#eab32d0bc5ca83836e0e9f9e108d66a4">ElapsedTime</a>() > 1000)<a name="l00062"></a>00062 {<a name="l00063"></a>00063 <span class="keywordflow">if</span> (m_sameResultCount > m_noWaitTimer.<a class="code" href="class_timer_base.html#eab32d0bc5ca83836e0e9f9e108d66a4">ElapsedTime</a>())<a name="l00064"></a>00064 {<a name="l00065"></a>00065 <span class="keywordflow">if</span> (m_tracer)<a name="l00066"></a>00066 {<a name="l00067"></a>00067 std::string desc = <span class="stringliteral">"No wait loop detected - m_lastResult: "</span>;<a name="l00068"></a>00068 desc.append(IntToString(m_lastResult)).append(<span class="stringliteral">", call stack:"</span>);<a name="l00069"></a>00069 <span class="keywordflow">for</span> (<a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>* cs = &callStack; cs; cs = cs-><a class="code" href="class_call_stack.html#84710e4124132926faadf2580e4bc452">Prev</a>())<a name="l00070"></a>00070 desc.append(<span class="stringliteral">"\n- "</span>).append(cs->Format());<a name="l00071"></a>00071 m_tracer->TraceNoWaitLoop(desc);<a name="l00072"></a>00072 }<a name="l00073"></a>00073 <span class="keywordflow">try</span> { <span class="keywordflow">throw</span> 0; } <span class="keywordflow">catch</span> (...) {} <span class="comment">// help debugger break</span><a name="l00074"></a>00074 }<a name="l00075"></a>00075 <a name="l00076"></a>00076 m_noWaitTimer.<a class="code" href="class_timer_base.html#50804b61c4254f7289c6c67515d5d46d">StartTimer</a>();<a name="l00077"></a>00077 m_sameResultCount = 0;<a name="l00078"></a>00078 }<a name="l00079"></a>00079 }<a name="l00080"></a>00080 <a name="l00081"></a><a class="code" href="class_wait_object_container.html#ce9c529ebb1956ee2cb9121bdf30402d">00081</a> <span class="keywordtype">void</span> <a class="code" href="class_wait_object_container.html#ce9c529ebb1956ee2cb9121bdf30402d">WaitObjectContainer::SetNoWait</a>(<a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>& callStack)<a name="l00082"></a>00082 {<a name="l00083"></a>00083 DetectNoWait(LASTRESULT_NOWAIT, <a class="code" href="class_call_stack.html">CallStack</a>(<span class="stringliteral">"WaitObjectContainer::SetNoWait()"</span>, &callStack));<a name="l00084"></a>00084 m_noWait = <span class="keyword">true</span>;<a name="l00085"></a>00085 }<a name="l00086"></a>00086 <a name="l00087"></a><a class="code" href="class_wait_object_container.html#75352b929764bdd4ce819e713a9df707">00087</a> <span class="keywordtype">void</span> <a class="code" href="class_wait_object_container.html#75352b929764bdd4ce819e713a9df707">WaitObjectContainer::ScheduleEvent</a>(<span class="keywordtype">double</span> milliseconds, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>& callStack)<a name="l00088"></a>00088 {<a name="l00089"></a>00089 <span class="keywordflow">if</span> (milliseconds <= 3)<a name="l00090"></a>00090 DetectNoWait(LASTRESULT_SCHEDULED, <a class="code" href="class_call_stack.html">CallStack</a>(<span class="stringliteral">"WaitObjectContainer::ScheduleEvent()"</span>, &callStack));<a name="l00091"></a>00091 <span class="keywordtype">double</span> thisEventTime = m_eventTimer.<a class="code" href="class_timer_base.html#3262a9d0815f1899701ee83c3ef8cf43">ElapsedTimeAsDouble</a>() + milliseconds;<a name="l00092"></a>00092 <span class="keywordflow">if</span> (!m_firstEventTime || thisEventTime < m_firstEventTime)<a name="l00093"></a>00093 m_firstEventTime = thisEventTime;<a name="l00094"></a>00094 }<a name="l00095"></a>00095 <a name="l00096"></a>00096 <span class="preprocessor">#ifdef USE_WINDOWS_STYLE_SOCKETS</span><a name="l00097"></a>00097 <span class="preprocessor"></span><a name="l00098"></a><a class="code" href="struct_waiting_thread_data.html">00098</a> <span class="keyword">struct </span><a class="code" href="struct_waiting_thread_data.html">WaitingThreadData</a><a name="l00099"></a>00099 {<a name="l00100"></a><a class="code" href="struct_waiting_thread_data.html#986b97f33225dfe57313b7d9cda0fe2f">00100</a> <span class="keywordtype">bool</span> waitingToWait, terminate;<a name="l00101"></a><a class="code" href="struct_waiting_thread_data.html#ba4a150f351400411734fe6490c7fc30">00101</a> HANDLE startWaiting, stopWaiting;<a name="l00102"></a><a class="code" href="struct_waiting_thread_data.html#4e1ed9d51b8dc85a5c446f4c52855e14">00102</a> <span class="keyword">const</span> HANDLE *waitHandles;<a name="l00103"></a><a class="code" href="struct_waiting_thread_data.html#66baa8d0d2e0c1f75be9f8d686d3dbb8">00103</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count;<a name="l00104"></a><a class="code" href="struct_waiting_thread_data.html#c6eb16bc993de39439c8e81d8c2e24d9">00104</a> HANDLE threadHandle;<a name="l00105"></a><a class="code" href="struct_waiting_thread_data.html#c0d84cfe066c1a33431bfe5ec5d1eb66">00105</a> DWORD threadId;<a name="l00106"></a><a class="code" href="struct_waiting_thread_data.html#4998f48f7817e5d2d61646f39dc2a3f9">00106</a> DWORD* error;<a name="l00107"></a>00107 };<a name="l00108"></a>00108 <a name="l00109"></a><a class="code" href="class_wait_object_container.html#c9f4d5ebd4271ebed407a7fe8bb73a0d">00109</a> <a class="code" href="class_wait_object_container.html#c9f4d5ebd4271ebed407a7fe8bb73a0d">WaitObjectContainer::~WaitObjectContainer</a>()<a name="l00110"></a>00110 {<a name="l00111"></a>00111 <span class="keywordflow">try</span> <span class="comment">// don't let exceptions escape destructor</span><a name="l00112"></a>00112 {<a name="l00113"></a>00113 <span class="keywordflow">if</span> (!m_threads.empty())<a name="l00114"></a>00114 {<a name="l00115"></a>00115 HANDLE threadHandles[MAXIMUM_WAIT_OBJECTS];<a name="l00116"></a>00116 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;<a name="l00117"></a>00117 <span class="keywordflow">for</span> (i=0; i<m_threads.size(); i++)<a name="l00118"></a>00118 {<a name="l00119"></a>00119 <a class="code" href="struct_waiting_thread_data.html">WaitingThreadData</a> &thread = *m_threads[i];<a name="l00120"></a>00120 <span class="keywordflow">while</span> (!thread.waitingToWait) <span class="comment">// spin until thread is in the initial "waiting to wait" state</span><a name="l00121"></a>00121 Sleep(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -