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

📄 wait_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<!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&nbsp;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&nbsp;List</span></a></li>    <li><a href="globals.html"><span>File&nbsp;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 &lt;errno.h&gt;</span><a name="l00011"></a>00011 <span class="preprocessor">#include &lt;sys/types.h&gt;</span><a name="l00012"></a>00012 <span class="preprocessor">#include &lt;sys/time.h&gt;</span><a name="l00013"></a>00013 <span class="preprocessor">#include &lt;unistd.h&gt;</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(&amp;m_readfds);<a name="l00042"></a>00042         FD_ZERO(&amp;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>&amp; callStack)<a name="l00060"></a>00060 {<a name="l00061"></a>00061         <span class="keywordflow">if</span> (result == m_lastResult &amp;&amp; m_noWaitTimer.<a class="code" href="class_timer_base.html#eab32d0bc5ca83836e0e9f9e108d66a4">ElapsedTime</a>() &gt; 1000)<a name="l00062"></a>00062         {<a name="l00063"></a>00063                 <span class="keywordflow">if</span> (m_sameResultCount &gt; 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 = &amp;callStack; cs; cs = cs-&gt;<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-&gt;Format());<a name="l00071"></a>00071                                 m_tracer-&gt;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>&amp; 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>, &amp;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>&amp; callStack)<a name="l00088"></a>00088 {<a name="l00089"></a>00089         <span class="keywordflow">if</span> (milliseconds &lt;= 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>, &amp;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 &lt; 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&lt;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> &amp;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 + -