You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by gi...@apache.org on 2018/02/09 21:34:19 UTC

[2/8] mesos-site git commit: Updated the website built from mesos SHA: 0499025.

http://git-wip-us.apache.org/repos/asf/mesos-site/blob/b3c1ed81/content/api/latest/c++/windows_2os_8hpp_source.html
----------------------------------------------------------------------
diff --git a/content/api/latest/c++/windows_2os_8hpp_source.html b/content/api/latest/c++/windows_2os_8hpp_source.html
index e3874bb..0cf2833 100644
--- a/content/api/latest/c++/windows_2os_8hpp_source.html
+++ b/content/api/latest/c++/windows_2os_8hpp_source.html
@@ -658,361 +658,367 @@
 <div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;}</div>
 <div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;</div>
 <div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;<span class="comment">// `create_job` function creates a named job object using `name`.</span></div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;<span class="comment">// This returns the safe job handle, which closes the job handle</span></div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;<span class="comment">// when destructed. Because the job is destroyed when its last</span></div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;<span class="comment">// handle is closed and all associated processes have exited,</span></div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;<span class="comment">// a running process must be assigned to the created job</span></div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;<span class="comment">// before the returned handle is closed.</span></div>
-<div class="line"><a name="l00612"></a><span class="lineno"><a class="line" href="namespaceos.html#a88a1637a0168d78faad2ac5b82e5cc4d">  612</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> <a class="code" href="namespaceos.html#a88a1637a0168d78faad2ac5b82e5cc4d">create_job</a>(<span class="keyword">const</span> std::wstring&amp; <a class="code" href="namespaceos_1_1Shell.html#acfe16ef2b1146ad49a8651c0a457ce46">name</a>)</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;{</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;  <a class="code" href="classSharedHandle.html">SharedHandle</a> job_handle(</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;      ::CreateJobObjectW(</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;          <span class="keyword">nullptr</span>,       <span class="comment">// Use a default security descriptor, and</span></div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;                         <span class="comment">// the created handle cannot be inherited.</span></div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;          name.data()),  <span class="comment">// The name of the job.</span></div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;      ::CloseHandle);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;  <span class="keywordflow">if</span> (job_handle.<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>() == <span class="keyword">nullptr</span>) {</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;        <span class="stringliteral">&quot;os::create_job: Call to `CreateJobObject` failed for job: &quot;</span> +</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;        <a class="code" href="namespacens.html#a28116b46e6543597a11733424cd1aa20">stringify</a>(name));</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;  }</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;  JOBOBJECT_EXTENDED_LIMIT_INFORMATION info = {};</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;  <span class="comment">// The job object will be terminated when the job handle closes. This allows</span></div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;  <span class="comment">// the job tree to be terminated in case of errors by closing the handle.</span></div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;  <span class="comment">// We set this flag so that the death of the agent process will</span></div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;  <span class="comment">// always kill any running jobs, as the OS will close the remaining open</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;  <span class="comment">// handles if all destructors failed to run (catastrophic death).</span></div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;  info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;  <span class="keyword">const</span> BOOL result = ::SetInformationJobObject(</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;      job_handle.<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;      JobObjectExtendedLimitInformation,</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;      &amp;info,</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;      <span class="keyword">sizeof</span>(info));</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;        <span class="stringliteral">&quot;os::create_job: `SetInformationJobObject` failed for job: &quot;</span> +</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;        <a class="code" href="namespacens.html#a28116b46e6543597a11733424cd1aa20">stringify</a>(name));</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;  }</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;  <span class="keywordflow">return</span> job_handle;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;}</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;<span class="comment">// `get_job_info` gets the job object information for the process group</span></div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;<span class="comment">// represented by `pid`, assuming it is assigned to a job object. This function</span></div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;<span class="comment">// will fail otherwise.</span></div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;<span class="comment">//</span></div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;<span class="comment">// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684925(v=vs.85).aspx // NOLINT(whitespace/line_length)</span></div>
-<div class="line"><a name="l00657"></a><span class="lineno"><a class="line" href="namespaceos.html#ade6490bdde78aaec7d3ffec9396e1018">  657</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;JOBOBJECT_BASIC_ACCOUNTING_INFORMATION&gt;</a> <a class="code" href="namespaceos.html#ade6490bdde78aaec7d3ffec9396e1018">get_job_info</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid)</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;{</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;  <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> job_handle = <a class="code" href="namespaceos.html#aa3da520f1619211c592b12a92639a1f9">os::open_job</a>(</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;      JOB_OBJECT_QUERY,</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;      <span class="keyword">false</span>,</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;      pid);</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;  <span class="keywordflow">if</span> (job_handle.<a class="code" href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>()) {</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(job_handle.<a class="code" href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;  }</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;  JOBOBJECT_BASIC_ACCOUNTING_INFORMATION info = {};</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;  BOOL result = ::QueryInformationJobObject(</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;    job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;    JobObjectBasicAccountingInformation,</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    &amp;info,</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;    <span class="keyword">sizeof</span>(info),</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;    <span class="keyword">nullptr</span>);</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;      <span class="stringliteral">&quot;os::get_job_info: call to `QueryInformationJobObject` failed&quot;</span>);</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;  }</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;  <span class="keywordflow">return</span> info;</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;}</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">size_t</span> max_p<span class="keywordtype">id</span>s&gt;</div>
-<div class="line"><a name="l00685"></a><span class="lineno"><a class="line" href="namespaceos.html#a97c21dd769e29b904e192e591ed11096">  685</a></span>&#160;<a class="code" href="classResult.html">Result&lt;std::set&lt;Process&gt;</a>&gt; <a class="code" href="namespaceos.html#a97c21dd769e29b904e192e591ed11096">_get_job_processes</a>(<span class="keyword">const</span> <a class="code" href="classSharedHandle.html">SharedHandle</a>&amp; job_handle) {</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;  <span class="comment">// This is a statically allocated `JOBOBJECT_BASIC_PROCESS_ID_LIST`. We lie to</span></div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;  <span class="comment">// the Windows API and construct our own struct to avoid (a) having to do</span></div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;  <span class="comment">// hairy size calculations and (b) having to allocate dynamically, and then</span></div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;  <span class="comment">// worry about deallocating.</span></div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;  <span class="keyword">struct </span>{</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;    DWORD     NumberOfAssignedProcesses;</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    DWORD     NumberOfProcessIdsInList;</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;    DWORD     ProcessIdList[max_pids];</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;  } pid_list;</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;  BOOL result = ::QueryInformationJobObject(</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;    job_handle.<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;    JobObjectBasicProcessIdList,</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;    <span class="keyword">reinterpret_cast&lt;</span>JOBOBJECT_BASIC_PROCESS_ID_LIST*<span class="keyword">&gt;</span>(&amp;pid_list),</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;    <span class="keyword">sizeof</span>(pid_list),</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;    <span class="keyword">nullptr</span>);</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;  <span class="comment">// `ERROR_MORE_DATA` indicates we need a larger `max_pids`.</span></div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;  <span class="keywordflow">if</span> (result == FALSE &amp;&amp; ::GetLastError() == ERROR_MORE_DATA) {</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structNone.html">None</a>();</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;  }</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;      <span class="stringliteral">&quot;os::_get_job_processes: call to `QueryInformationJobObject` failed&quot;</span>);</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;  }</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;  std::set&lt;Process&gt; <a class="code" href="namespaceos.html#aa98ca8ac255e2b9c689979a1b40084d3">processes</a>;</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;  <span class="keywordflow">for</span> (DWORD i = 0; i &lt; pid_list.NumberOfProcessIdsInList; ++i) {</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;    <a class="code" href="classResult.html">Result&lt;Process&gt;</a> <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a> = <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">os::process</a>(pid_list.ProcessIdList[i]);</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;    <span class="keywordflow">if</span> (process.<a class="code" href="classResult.html#a85eaa52037223d71092e65701c166562">isSome</a>()) {</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;      processes.insert(process.<a class="code" href="classResult.html#aedf79f3b14dcda5791b84a64ada4d412">get</a>());</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;    }</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;  }</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="namespaceos.html#aa98ca8ac255e2b9c689979a1b40084d3">processes</a>;</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;}</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;</div>
-<div class="line"><a name="l00725"></a><span class="lineno"><a class="line" href="namespaceos.html#a7361a49972acf9a2c28361a46199f484">  725</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;std::set&lt;Process&gt;</a>&gt; <a class="code" href="namespaceos.html#a7361a49972acf9a2c28361a46199f484">get_job_processes</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid)</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;{</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;  <span class="comment">// TODO(andschwa): Overload open_job to use pid.</span></div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;  <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> job_handle = <a class="code" href="namespaceos.html#aa3da520f1619211c592b12a92639a1f9">os::open_job</a>(</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;    JOB_OBJECT_QUERY,</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;    <span class="keyword">false</span>,</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;    pid);</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;  <span class="keywordflow">if</span> (job_handle.<a class="code" href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>()) {</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(job_handle.<a class="code" href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;  }</div>
+<div class="line"><a name="l00607"></a><span class="lineno"><a class="line" href="namespaceos.html#a88a1637a0168d78faad2ac5b82e5cc4d">  607</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> <a class="code" href="namespaceos.html#a88a1637a0168d78faad2ac5b82e5cc4d">create_job</a>(<span class="keyword">const</span> std::wstring&amp; <a class="code" href="namespaceos_1_1Shell.html#acfe16ef2b1146ad49a8651c0a457ce46">name</a>)</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;{</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;  <a class="code" href="classSharedHandle.html">SharedHandle</a> job_handle(</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;      ::CreateJobObjectW(</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;          <span class="keyword">nullptr</span>,       <span class="comment">// Use a default security descriptor, and</span></div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;                         <span class="comment">// the created handle cannot be inherited.</span></div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;          name.data()),  <span class="comment">// The name of the job.</span></div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;      ::CloseHandle);</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;  <span class="keywordflow">if</span> (job_handle.<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>() == <span class="keyword">nullptr</span>) {</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        <span class="stringliteral">&quot;os::create_job: Call to `CreateJobObject` failed for job: &quot;</span> +</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;        <a class="code" href="namespacens.html#a28116b46e6543597a11733424cd1aa20">stringify</a>(name));</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;  }</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;  <span class="keywordflow">return</span> job_handle;</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;}</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;<span class="comment">// `get_job_info` gets the job object information for the process group</span></div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;<span class="comment">// represented by `pid`, assuming it is assigned to a job object. This function</span></div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;<span class="comment">// will fail otherwise.</span></div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;<span class="comment">// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684925(v=vs.85).aspx // NOLINT(whitespace/line_length)</span></div>
+<div class="line"><a name="l00631"></a><span class="lineno"><a class="line" href="namespaceos.html#ade6490bdde78aaec7d3ffec9396e1018">  631</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;JOBOBJECT_BASIC_ACCOUNTING_INFORMATION&gt;</a> <a class="code" href="namespaceos.html#ade6490bdde78aaec7d3ffec9396e1018">get_job_info</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid)</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;{</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;  <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> job_handle = <a class="code" href="namespaceos.html#aa3da520f1619211c592b12a92639a1f9">os::open_job</a>(</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;      JOB_OBJECT_QUERY,</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;      <span class="keyword">false</span>,</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;      pid);</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;  <span class="keywordflow">if</span> (job_handle.<a class="code" href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>()) {</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(job_handle.<a class="code" href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;  }</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;  JOBOBJECT_BASIC_ACCOUNTING_INFORMATION info = {};</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;  BOOL result = ::QueryInformationJobObject(</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;    job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    JobObjectBasicAccountingInformation,</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;    &amp;info,</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    <span class="keyword">sizeof</span>(info),</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    <span class="keyword">nullptr</span>);</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;      <span class="stringliteral">&quot;os::get_job_info: call to `QueryInformationJobObject` failed&quot;</span>);</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;  }</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;  <span class="keywordflow">return</span> info;</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;}</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;<span class="keyword">template</span> &lt;<span class="keywordtype">size_t</span> max_p<span class="keywordtype">id</span>s&gt;</div>
+<div class="line"><a name="l00659"></a><span class="lineno"><a class="line" href="namespaceos.html#a97c21dd769e29b904e192e591ed11096">  659</a></span>&#160;<a class="code" href="classResult.html">Result&lt;std::set&lt;Process&gt;</a>&gt; <a class="code" href="namespaceos.html#a97c21dd769e29b904e192e591ed11096">_get_job_processes</a>(<span class="keyword">const</span> <a class="code" href="classSharedHandle.html">SharedHandle</a>&amp; job_handle) {</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;  <span class="comment">// This is a statically allocated `JOBOBJECT_BASIC_PROCESS_ID_LIST`. We lie to</span></div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;  <span class="comment">// the Windows API and construct our own struct to avoid (a) having to do</span></div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;  <span class="comment">// hairy size calculations and (b) having to allocate dynamically, and then</span></div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;  <span class="comment">// worry about deallocating.</span></div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;  <span class="keyword">struct </span>{</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;    DWORD     NumberOfAssignedProcesses;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;    DWORD     NumberOfProcessIdsInList;</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;    DWORD     ProcessIdList[max_pids];</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;  } pid_list;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;  BOOL result = ::QueryInformationJobObject(</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;    job_handle.<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    JobObjectBasicProcessIdList,</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;    <span class="keyword">reinterpret_cast&lt;</span>JOBOBJECT_BASIC_PROCESS_ID_LIST*<span class="keyword">&gt;</span>(&amp;pid_list),</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;    <span class="keyword">sizeof</span>(pid_list),</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;    <span class="keyword">nullptr</span>);</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;  <span class="comment">// `ERROR_MORE_DATA` indicates we need a larger `max_pids`.</span></div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;  <span class="keywordflow">if</span> (result == FALSE &amp;&amp; ::GetLastError() == ERROR_MORE_DATA) {</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structNone.html">None</a>();</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;  }</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;      <span class="stringliteral">&quot;os::_get_job_processes: call to `QueryInformationJobObject` failed&quot;</span>);</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;  }</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;  std::set&lt;Process&gt; <a class="code" href="namespaceos.html#aa98ca8ac255e2b9c689979a1b40084d3">processes</a>;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;  <span class="keywordflow">for</span> (DWORD i = 0; i &lt; pid_list.NumberOfProcessIdsInList; ++i) {</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;    <a class="code" href="classResult.html">Result&lt;Process&gt;</a> <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a> = <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">os::process</a>(pid_list.ProcessIdList[i]);</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;    <span class="keywordflow">if</span> (process.<a class="code" href="classResult.html#a85eaa52037223d71092e65701c166562">isSome</a>()) {</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;      processes.insert(process.<a class="code" href="classResult.html#aedf79f3b14dcda5791b84a64ada4d412">get</a>());</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    }</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;  }</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="namespaceos.html#aa98ca8ac255e2b9c689979a1b40084d3">processes</a>;</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;}</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;</div>
+<div class="line"><a name="l00699"></a><span class="lineno"><a class="line" href="namespaceos.html#a7361a49972acf9a2c28361a46199f484">  699</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;std::set&lt;Process&gt;</a>&gt; <a class="code" href="namespaceos.html#a7361a49972acf9a2c28361a46199f484">get_job_processes</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid)</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;{</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;  <span class="comment">// TODO(andschwa): Overload open_job to use pid.</span></div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;  <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> job_handle = <a class="code" href="namespaceos.html#aa3da520f1619211c592b12a92639a1f9">os::open_job</a>(</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    JOB_OBJECT_QUERY,</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;    <span class="keyword">false</span>,</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    pid);</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;  <span class="keywordflow">if</span> (job_handle.<a class="code" href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>()) {</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(job_handle.<a class="code" href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;  }</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;  <span class="comment">// Try to enumerate the processes with three sizes: 32, 1K, and 32K.</span></div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;  <a class="code" href="classResult.html">Result&lt;std::set&lt;Process&gt;</a>&gt; result =</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;    os::_get_job_processes&lt;32&gt;(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;  <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#aeca16ad17d299ad885c9b46c83b12a3d">isError</a>()) {</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(result.<a class="code" href="classResult.html#a521adf96f5c27d26d6b1d580aae8aaee">error</a>());</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#a85eaa52037223d71092e65701c166562">isSome</a>()) {</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;    <span class="keywordflow">return</span> result.<a class="code" href="classResult.html#aedf79f3b14dcda5791b84a64ada4d412">get</a>();</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;  }</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;  result = os::_get_job_processes&lt;32*32&gt;(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;  <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#aeca16ad17d299ad885c9b46c83b12a3d">isError</a>()) {</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(result.<a class="code" href="classResult.html#a521adf96f5c27d26d6b1d580aae8aaee">error</a>());</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#a85eaa52037223d71092e65701c166562">isSome</a>()) {</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;    <span class="keywordflow">return</span> result.<a class="code" href="classResult.html#aedf79f3b14dcda5791b84a64ada4d412">get</a>();</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;  }</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;  result = os::_get_job_processes&lt;32*32*32&gt;(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;  <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#aeca16ad17d299ad885c9b46c83b12a3d">isError</a>()) {</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(result.<a class="code" href="classResult.html#a521adf96f5c27d26d6b1d580aae8aaee">error</a>());</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#a85eaa52037223d71092e65701c166562">isSome</a>()) {</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;    <span class="keywordflow">return</span> result.<a class="code" href="classResult.html#aedf79f3b14dcda5791b84a64ada4d412">get</a>();</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;  }</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;  <span class="comment">// If it was bigger than 32K, something else has gone wrong.</span></div>
 <div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;  <span class="comment">// Try to enumerate the processes with three sizes: 32, 1K, and 32K.</span></div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;  <a class="code" href="classResult.html">Result&lt;std::set&lt;Process&gt;</a>&gt; result =</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;    os::_get_job_processes&lt;32&gt;(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;  <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#aeca16ad17d299ad885c9b46c83b12a3d">isError</a>()) {</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(result.<a class="code" href="classResult.html#a521adf96f5c27d26d6b1d580aae8aaee">error</a>());</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#a85eaa52037223d71092e65701c166562">isSome</a>()) {</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;    <span class="keywordflow">return</span> result.<a class="code" href="classResult.html#aedf79f3b14dcda5791b84a64ada4d412">get</a>();</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(<span class="stringliteral">&quot;os::get_job_processes: failed to get processes&quot;</span>);</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;}</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;</div>
+<div class="line"><a name="l00740"></a><span class="lineno"><a class="line" href="namespaceos.html#a2719d5e9978531adac530780f6a97cf2">  740</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;Bytes&gt;</a> <a class="code" href="namespaceos.html#a2719d5e9978531adac530780f6a97cf2">get_job_mem</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid) {</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;  <span class="keyword">const</span> <a class="code" href="classTry.html">Try&lt;std::set&lt;Process&gt;</a>&gt; processes = <a class="code" href="namespaceos.html#a7361a49972acf9a2c28361a46199f484">os::get_job_processes</a>(pid);</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;  <span class="keywordflow">if</span> (processes.<a class="code" href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>()) {</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(processes.<a class="code" href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div>
 <div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;  }</div>
 <div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;  result = os::_get_job_processes&lt;32*32&gt;(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;  <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#aeca16ad17d299ad885c9b46c83b12a3d">isError</a>()) {</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(result.<a class="code" href="classResult.html#a521adf96f5c27d26d6b1d580aae8aaee">error</a>());</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#a85eaa52037223d71092e65701c166562">isSome</a>()) {</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;    <span class="keywordflow">return</span> result.<a class="code" href="classResult.html#aedf79f3b14dcda5791b84a64ada4d412">get</a>();</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;  }</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;  result = os::_get_job_processes&lt;32*32*32&gt;(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;  <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#aeca16ad17d299ad885c9b46c83b12a3d">isError</a>()) {</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(result.<a class="code" href="classResult.html#a521adf96f5c27d26d6b1d580aae8aaee">error</a>());</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result.<a class="code" href="classResult.html#a85eaa52037223d71092e65701c166562">isSome</a>()) {</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;    <span class="keywordflow">return</span> result.<a class="code" href="classResult.html#aedf79f3b14dcda5791b84a64ada4d412">get</a>();</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;  }</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;  <span class="keywordflow">return</span> std::accumulate(</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;    processes.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().cbegin(),</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;    processes.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().cend(),</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;    <a class="code" href="classBytes.html">Bytes</a>(0),</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;    [](<span class="keyword">const</span> <a class="code" href="classBytes.html">Bytes</a>&amp; bytes, <span class="keyword">const</span> <a class="code" href="structos_1_1Process.html">Process</a>&amp; <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a>) {</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;      <span class="keywordflow">if</span> (<a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a>.rss.isNone()) {</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;        <span class="keywordflow">return</span> bytes;</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;      }</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;      <span class="keywordflow">return</span> bytes + <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a>.rss.get();</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;    });</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;}</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;</div>
 <div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;  <span class="comment">// If it was bigger than 32K, something else has gone wrong.</span></div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(<span class="stringliteral">&quot;os::get_job_processes: failed to get processes&quot;</span>);</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;}</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;</div>
-<div class="line"><a name="l00766"></a><span class="lineno"><a class="line" href="namespaceos.html#a2719d5e9978531adac530780f6a97cf2">  766</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;Bytes&gt;</a> <a class="code" href="namespaceos.html#a2719d5e9978531adac530780f6a97cf2">get_job_mem</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid) {</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;  <span class="keyword">const</span> <a class="code" href="classTry.html">Try&lt;std::set&lt;Process&gt;</a>&gt; processes = <a class="code" href="namespaceos.html#a7361a49972acf9a2c28361a46199f484">os::get_job_processes</a>(pid);</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;  <span class="keywordflow">if</span> (processes.<a class="code" href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>()) {</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(processes.<a class="code" href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;  }</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;  <span class="keywordflow">return</span> std::accumulate(</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;    processes.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().cbegin(),</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;    processes.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().cend(),</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;    <a class="code" href="classBytes.html">Bytes</a>(0),</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    [](<span class="keyword">const</span> <a class="code" href="classBytes.html">Bytes</a>&amp; bytes, <span class="keyword">const</span> <a class="code" href="structos_1_1Process.html">Process</a>&amp; <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a>) {</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;      <span class="keywordflow">if</span> (<a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a>.rss.isNone()) {</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;        <span class="keywordflow">return</span> bytes;</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;      }</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;      <span class="keywordflow">return</span> bytes + <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a>.rss.get();</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;    });</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;}</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;<span class="comment">// `set_job_cpu_limit` sets a CPU limit for the process represented by</span></div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;<span class="comment">// `pid`, assuming it is assigned to a job object. This function will fail</span></div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;<span class="comment">// otherwise. This limit is a hard cap enforced by the OS.</span></div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;<span class="comment">//</span></div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;<span class="comment">// https://msdn.microsoft.com/en-us/library/windows/desktop/hh448384(v=vs.85).aspx // NOLINT(whitespace/line_length)</span></div>
-<div class="line"><a name="l00791"></a><span class="lineno"><a class="line" href="namespaceos.html#a66d4371272f7c8f52ffb4f440c5a3762">  791</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;Nothing&gt;</a> <a class="code" href="namespaceos.html#a66d4371272f7c8f52ffb4f440c5a3762">set_job_cpu_limit</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid, <span class="keywordtype">double</span> <a class="code" href="namespaceos.html#afd08813156fea899c86b340d9767a8cd">cpus</a>)</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;{</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;  JOBOBJECT_CPU_RATE_CONTROL_INFORMATION control_info = {};</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;  control_info.ControlFlags =</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;    JOB_OBJECT_CPU_RATE_CONTROL_ENABLE |</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;    JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP;</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;  <span class="comment">// This `CpuRate` is the number of cycles per 10,000 cycles, or a percentage</span></div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;  <span class="comment">// times 100, e.g. 20% yields 20 * 100 = 2,000. However, the `cpus` argument</span></div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;  <span class="comment">// represents 1 CPU core with `1.0`, so a 100% CPU limit on a quad-core</span></div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;  <span class="comment">// machine would be `4.0 cpus`. Thus a mapping of `cpus` to `CpuRate` is</span></div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;  <span class="comment">// `(cpus / os::cpus()) * 100 * 100`, or the requested `cpus` divided by the</span></div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;  <span class="comment">// number of CPUs to obtain a fractional representation, multiplied by 100 to</span></div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;  <span class="comment">// make it a percentage, multiplied again by 100 to become a `CpuRate`.</span></div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;  <a class="code" href="classTry.html">Try&lt;long&gt;</a> total_cpus = <a class="code" href="namespaceos.html#afd08813156fea899c86b340d9767a8cd">os::cpus</a>();</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;  control_info.CpuRate =</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;    <span class="keyword">static_cast&lt;</span>DWORD<span class="keyword">&gt;</span>((cpus / total_cpus.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>()) * 100 * 100);</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;  <span class="comment">// This must not be set to 0, so 1 is the minimum.</span></div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;  <span class="keywordflow">if</span> (control_info.CpuRate &lt; 1) {</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;    control_info.CpuRate = 1;</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;  }</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;  <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> job_handle = <a class="code" href="namespaceos.html#aa3da520f1619211c592b12a92639a1f9">os::open_job</a>(</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;      JOB_OBJECT_SET_ATTRIBUTES,</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;      <span class="keyword">false</span>,</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;      pid);</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;  <span class="keywordflow">if</span> (job_handle.<a class="code" href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>()) {</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(job_handle.<a class="code" href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;  }</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;  BOOL result = ::SetInformationJobObject(</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;    job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;    JobObjectCpuRateControlInformation,</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;    &amp;control_info,</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;    <span class="keyword">sizeof</span>(control_info));</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;      <span class="stringliteral">&quot;os::set_job_cpu_limit: call to `SetInformationJobObject` failed&quot;</span>);</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;  }</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="structNothing.html">Nothing</a>();</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;}</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;<span class="comment">// `set_job_mem_limit` sets a memory limit for the process represented by</span></div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;<span class="comment">// `pid`, assuming it is assigned to a job object. This function will fail</span></div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;<span class="comment">// otherwise. This limit is a hard cap enforced by the OS.</span></div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;<span class="comment">//</span></div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;<span class="comment">// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684156(v=vs.85).aspx // NOLINT(whitespace/line_length)</span></div>
-<div class="line"><a name="l00840"></a><span class="lineno"><a class="line" href="namespaceos.html#a24a3f6dbfa918c7ac934a2323a824eb4">  840</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;Nothing&gt;</a> <a class="code" href="namespaceos.html#a24a3f6dbfa918c7ac934a2323a824eb4">set_job_mem_limit</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid, <a class="code" href="classBytes.html">Bytes</a> limit)</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;{</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;  JOBOBJECT_EXTENDED_LIMIT_INFORMATION info = {};</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;  info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_JOB_MEMORY;</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;  info.JobMemoryLimit = limit.<a class="code" href="classBytes.html#a1a2e9277ebe7d227a21f111898c49a8c">bytes</a>();</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;  <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> job_handle = <a class="code" href="namespaceos.html#aa3da520f1619211c592b12a92639a1f9">os::open_job</a>(</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;      JOB_OBJECT_SET_ATTRIBUTES,</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;      <span class="keyword">false</span>,</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;      pid);</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;  <span class="keywordflow">if</span> (job_handle.<a class="code" href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>()) {</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(job_handle.<a class="code" href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;  }</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;  BOOL result = ::SetInformationJobObject(</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;    job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;    JobObjectExtendedLimitInformation,</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;    &amp;info,</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;    <span class="keyword">sizeof</span>(info));</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;      <span class="stringliteral">&quot;os::set_job_mem_limit: call to `SetInformationJobObject` failed&quot;</span>);</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;  }</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="structNothing.html">Nothing</a>();</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;}</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;<span class="comment">// `assign_job` assigns a process with `pid` to the job object `job_handle`.</span></div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;<span class="comment">// Every process started by the `pid` process using `CreateProcess`</span></div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;<span class="comment">// will also be owned by the job object.</span></div>
-<div class="line"><a name="l00871"></a><span class="lineno"><a class="line" href="namespaceos.html#a706dc9d1287978f358a9a23b77037fb0">  871</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;Nothing&gt;</a> <a class="code" href="namespaceos.html#a706dc9d1287978f358a9a23b77037fb0">assign_job</a>(<a class="code" href="classSharedHandle.html">SharedHandle</a> job_handle, <a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid) {</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;  <span class="comment">// Get process handle for `pid`.</span></div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;  <a class="code" href="classSharedHandle.html">SharedHandle</a> process_handle(</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;      ::OpenProcess(</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;          <span class="comment">// Required access rights to assign to a Job Object.</span></div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;          PROCESS_SET_QUOTA | PROCESS_TERMINATE,</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;          <span class="keyword">false</span>, <span class="comment">// Don&#39;t inherit handle.</span></div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;          pid),</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;      ::CloseHandle);</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;  <span class="keywordflow">if</span> (process_handle.<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>() == <span class="keyword">nullptr</span>) {</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;        <span class="stringliteral">&quot;os::assign_job: Call to `OpenProcess` failed&quot;</span>);</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;  }</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;  <span class="keyword">const</span> BOOL result = ::AssignProcessToJobObject(</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;      job_handle.<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;      process_handle.<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>());</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;        <span class="stringliteral">&quot;os::assign_job: Call to `AssignProcessToJobObject` failed&quot;</span>);</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;  };</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="structNothing.html">Nothing</a>();</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;}</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;<span class="comment">// The `kill_job` function wraps the Windows sytem call `TerminateJobObject`</span></div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;<span class="comment">// for the job object `job_handle`. This will call `TerminateProcess`</span></div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;<span class="comment">// for every associated child process.</span></div>
-<div class="line"><a name="l00902"></a><span class="lineno"><a class="line" href="namespaceos.html#a8181969d159a69d91d1e265f1bb1eddc">  902</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;Nothing&gt;</a> <a class="code" href="namespaceos.html#a8181969d159a69d91d1e265f1bb1eddc">kill_job</a>(<a class="code" href="classSharedHandle.html">SharedHandle</a> job_handle)</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;{</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;  <span class="keyword">const</span> BOOL result = ::TerminateJobObject(</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;      job_handle.<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;      <span class="comment">// The exit code to be used by all processes in the job object.</span></div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;      1);</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;        <span class="stringliteral">&quot;os::kill_job: Call to `TerminateJobObject` failed&quot;</span>);</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;  }</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="structNothing.html">Nothing</a>();</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;}</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;std::string&gt;</a> <a class="code" href="namespaceos.html#a547f04b42e472b2ff0070897010fac78">var</a>()</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;{</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;  <span class="comment">// Get the `ProgramData` path. First, find the size of the output buffer.</span></div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;  <span class="comment">// This size includes the null-terminating character.</span></div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;  DWORD <a class="code" href="namespaceos_1_1stat.html#a7a116891923bc8b5d8c50f78da8657be">size</a> = 0;</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;  <span class="keywordflow">if</span> (::GetAllUsersProfileDirectoryW(<span class="keyword">nullptr</span>, &amp;size)) {</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;    <span class="comment">// The expected behavior here is for the function to &quot;fail&quot;</span></div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;    <span class="comment">// and return `false`, and `size` receives necessary buffer size.</span></div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;        <span class="stringliteral">&quot;os::var: `GetAllUsersProfileDirectoryW` succeeded unexpectedly&quot;</span>);</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;  }</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;  std::vector&lt;wchar_t&gt; buffer;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;  buffer.reserve(static_cast&lt;size_t&gt;(size));</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;  <span class="keywordflow">if</span> (!::GetAllUsersProfileDirectoryW(buffer.data(), &amp;<a class="code" href="namespaceos_1_1stat.html#a7a116891923bc8b5d8c50f78da8657be">size</a>)) {</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(<span class="stringliteral">&quot;os::var: `GetAllUsersProfileDirectoryW` failed&quot;</span>);</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;<span class="comment">// `set_job_kill_on_close_limit` causes the job object to terminate all</span></div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;<span class="comment">// processes assigned to it when the last handle to the job object is closed.</span></div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;<span class="comment">// This can be used to limit the lifetime of the process group represented by</span></div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;<span class="comment">// the job object. Without this limit set, the processes will continue to run.</span></div>
+<div class="line"><a name="l00764"></a><span class="lineno"><a class="line" href="namespaceos.html#a580730039534bf4757e3e8b0e1e3db10">  764</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;Nothing&gt;</a> <a class="code" href="namespaceos.html#a580730039534bf4757e3e8b0e1e3db10">set_job_kill_on_close_limit</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid)</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;{</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;  <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> job_handle =</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;    <a class="code" href="namespaceos.html#aa3da520f1619211c592b12a92639a1f9">os::open_job</a>(JOB_OBJECT_SET_ATTRIBUTES, <span class="keyword">false</span>, pid);</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;  <span class="keywordflow">if</span> (job_handle.<a class="code" href="classTry.html#a0b98f95163b8a38daafd1651b043a276">isError</a>()) {</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(job_handle.<a class="code" href="classTry.html#aec4a11ddd3c036e889d90b7eb6258ba7">error</a>());</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;  }</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;  JOBOBJECT_EXTENDED_LIMIT_INFORMATION info = {};</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;  info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;  <span class="keyword">const</span> BOOL result = ::SetInformationJobObject(</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;      job_handle-&gt;<a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;      JobObjectExtendedLimitInformation,</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;      &amp;info,</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;      <span class="keyword">sizeof</span>(info));</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;  <span class="keywordflow">if</span> (result == FALSE) {</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;        <span class="stringliteral">&quot;os::set_job_kill_on_close_limit: call to `SetInformationJobObject` &quot;</span></div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;        <span class="stringliteral">&quot;failed&quot;</span>);</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;  }</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="structNothing.html">Nothing</a>();</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;}</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;<span class="comment">// `set_job_cpu_limit` sets a CPU limit for the process represented by</span></div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;<span class="comment">// `pid`, assuming it is assigned to a job object. This function will fail</span></div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;<span class="comment">// otherwise. This limit is a hard cap enforced by the OS.</span></div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;<span class="comment">// https://msdn.microsoft.com/en-us/library/windows/desktop/hh448384(v=vs.85).aspx // NOLINT(whitespace/line_length)</span></div>
+<div class="line"><a name="l00797"></a><span class="lineno"><a class="line" href="namespaceos.html#a66d4371272f7c8f52ffb4f440c5a3762">  797</a></span>&#160;<span class="keyword">inline</span> <a class="code" href="classTry.html">Try&lt;Nothing&gt;</a> <a class="code" href="namespaceos.html#a66d4371272f7c8f52ffb4f440c5a3762">set_job_cpu_limit</a>(<a class="code" href="3rdparty_2stout_2include_2stout_2windows_8hpp.html#ab03ced250ed239bc3b50b669493997f9">pid_t</a> pid, <span class="keywordtype">double</span> <a class="code" href="namespaceos.html#afd08813156fea899c86b340d9767a8cd">cpus</a>)</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;{</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;  JOBOBJECT_CPU_RATE_CONTROL_INFORMATION control_info = {};</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;  control_info.ControlFlags =</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;    JOB_OBJECT_CPU_RATE_CONTROL_ENABLE |</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;    JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP;</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;  <span class="comment">// This `CpuRate` is the number of cycles per 10,000 cycles, or a percentage</span></div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;  <span class="comment">// times 100, e.g. 20% yields 20 * 100 = 2,000. However, the `cpus` argument</span></div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;  <span class="comment">// represents 1 CPU core with `1.0`, so a 100% CPU limit on a quad-core</span></div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;  <span class="comment">// machine would be `4.0 cpus`. Thus a mapping of `cpus` to `CpuRate` is</span></div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;  <span class="comment">// `(cpus / os::cpus()) * 100 * 100`, or the requested `cpus` divided by the</span></div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;  <span class="comment">// number of CPUs to obtain a fractional representation, multiplied by 100 to</span></div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;  <span class="comment">// make it a percentage, multiplied again by 100 to become a `CpuRate`.</span></div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;  <a class="code" href="classTry.html">Try&lt;long&gt;</a> total_cpus = <a class="code" href="namespaceos.html#afd08813156fea899c86b340d9767a8cd">os::cpus</a>();</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;  control_info.CpuRate =</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;    <span class="keyword">static_cast&lt;</span>DWORD<span class="keyword">&gt;</span>((cpus / total_cpus.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>()) * 100 * 100);</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;  <span class="comment">// This must not be set to 0, so 1 is the minimum.</span></div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;  <span class="keywordflow">if</span> (control_info.CpuRate &lt; 1) {</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;    control_info.CpuRate = 1;</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;  }</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;  <a class="code" href="classTry.html">Try&lt;SharedHandle&gt;</a> job_handle = <a class="code" href="namespaceos.html#aa3da520f1619211c592b12a92639a1f9">os::open_job</a>(</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;      JOB_OBJECT_SET_ATTRIBUTES,</

<TRUNCATED>