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> }</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span> </div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span> <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> <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> <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> <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> <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> <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> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<SharedHandle></a> <a class="code" href="namespaceos.html#a88a1637a0168d78faad2ac5b82e5cc4d">create_job</a>(<span class="keyword">const</span> std::wstring& <a class="code" href="namespaceos_1_1Shell.html#acfe16ef2b1146ad49a8651c0a457ce46">name</a>)</div>
-<div class="line"><a name="l00613"></a><span class="lineno"> 613</span> {</div>
-<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <a class="code" href="classSharedHandle.html">SharedHandle</a> job_handle(</div>
-<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  ::CreateJobObjectW(</div>
-<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <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>  <span class="comment">// the created handle cannot be inherited.</span></div>
-<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  name.data()), <span class="comment">// The name of the job.</span></div>
-<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  ::CloseHandle);</div>
-<div class="line"><a name="l00620"></a><span class="lineno"> 620</span> </div>
-<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <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>  <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>  <span class="stringliteral">"os::create_job: Call to `CreateJobObject` failed for job: "</span> +</div>
-<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <a class="code" href="namespacens.html#a28116b46e6543597a11733424cd1aa20">stringify</a>(name));</div>
-<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  }</div>
-<div class="line"><a name="l00626"></a><span class="lineno"> 626</span> </div>
-<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  JOBOBJECT_EXTENDED_LIMIT_INFORMATION info = {};</div>
-<div class="line"><a name="l00628"></a><span class="lineno"> 628</span> </div>
-<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <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>  <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>  <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>  <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>  <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>  info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;</div>
-<div class="line"><a name="l00635"></a><span class="lineno"> 635</span> </div>
-<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="keyword">const</span> BOOL result = ::SetInformationJobObject(</div>
-<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  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>  JobObjectExtendedLimitInformation,</div>
-<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  &info,</div>
-<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  <span class="keyword">sizeof</span>(info));</div>
-<div class="line"><a name="l00641"></a><span class="lineno"> 641</span> </div>
-<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <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>  <span class="stringliteral">"os::create_job: `SetInformationJobObject` failed for job: "</span> +</div>
-<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <a class="code" href="namespacens.html#a28116b46e6543597a11733424cd1aa20">stringify</a>(name));</div>
-<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  }</div>
-<div class="line"><a name="l00647"></a><span class="lineno"> 647</span> </div>
-<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordflow">return</span> job_handle;</div>
-<div class="line"><a name="l00649"></a><span class="lineno"> 649</span> }</div>
-<div class="line"><a name="l00650"></a><span class="lineno"> 650</span> </div>
-<div class="line"><a name="l00651"></a><span class="lineno"> 651</span> </div>
-<div class="line"><a name="l00652"></a><span class="lineno"> 652</span> <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> <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> <span class="comment">// will fail otherwise.</span></div>
-<div class="line"><a name="l00655"></a><span class="lineno"> 655</span> <span class="comment">//</span></div>
-<div class="line"><a name="l00656"></a><span class="lineno"> 656</span> <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> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<JOBOBJECT_BASIC_ACCOUNTING_INFORMATION></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> {</div>
-<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <a class="code" href="classTry.html">Try<SharedHandle></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>  JOB_OBJECT_QUERY,</div>
-<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <span class="keyword">false</span>,</div>
-<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  pid);</div>
-<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <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>  <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>  }</div>
-<div class="line"><a name="l00666"></a><span class="lineno"> 666</span> </div>
-<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  JOBOBJECT_BASIC_ACCOUNTING_INFORMATION info = {};</div>
-<div class="line"><a name="l00668"></a><span class="lineno"> 668</span> </div>
-<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  BOOL result = ::QueryInformationJobObject(</div>
-<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  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>  JobObjectBasicAccountingInformation,</div>
-<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  &info,</div>
-<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="keyword">sizeof</span>(info),</div>
-<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keyword">nullptr</span>);</div>
-<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <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>  <span class="stringliteral">"os::get_job_info: call to `QueryInformationJobObject` failed"</span>);</div>
-<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  }</div>
-<div class="line"><a name="l00679"></a><span class="lineno"> 679</span> </div>
-<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordflow">return</span> info;</div>
-<div class="line"><a name="l00681"></a><span class="lineno"> 681</span> }</div>
-<div class="line"><a name="l00682"></a><span class="lineno"> 682</span> </div>
-<div class="line"><a name="l00683"></a><span class="lineno"> 683</span> </div>
-<div class="line"><a name="l00684"></a><span class="lineno"> 684</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span> max_p<span class="keywordtype">id</span>s></div>
-<div class="line"><a name="l00685"></a><span class="lineno"><a class="line" href="namespaceos.html#a97c21dd769e29b904e192e591ed11096"> 685</a></span> <a class="code" href="classResult.html">Result<std::set<Process></a>> <a class="code" href="namespaceos.html#a97c21dd769e29b904e192e591ed11096">_get_job_processes</a>(<span class="keyword">const</span> <a class="code" href="classSharedHandle.html">SharedHandle</a>& job_handle) {</div>
-<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <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>  <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>  <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>  <span class="comment">// worry about deallocating.</span></div>
-<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="keyword">struct </span>{</div>
-<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  DWORD NumberOfAssignedProcesses;</div>
-<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  DWORD NumberOfProcessIdsInList;</div>
-<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  DWORD ProcessIdList[max_pids];</div>
-<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  } pid_list;</div>
-<div class="line"><a name="l00695"></a><span class="lineno"> 695</span> </div>
-<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  BOOL result = ::QueryInformationJobObject(</div>
-<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  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>  JobObjectBasicProcessIdList,</div>
-<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keyword">reinterpret_cast<</span>JOBOBJECT_BASIC_PROCESS_ID_LIST*<span class="keyword">></span>(&pid_list),</div>
-<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <span class="keyword">sizeof</span>(pid_list),</div>
-<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keyword">nullptr</span>);</div>
-<div class="line"><a name="l00702"></a><span class="lineno"> 702</span> </div>
-<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <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>  <span class="keywordflow">if</span> (result == FALSE && ::GetLastError() == ERROR_MORE_DATA) {</div>
-<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <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>  }</div>
-<div class="line"><a name="l00707"></a><span class="lineno"> 707</span> </div>
-<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <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>  <span class="stringliteral">"os::_get_job_processes: call to `QueryInformationJobObject` failed"</span>);</div>
-<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  }</div>
-<div class="line"><a name="l00712"></a><span class="lineno"> 712</span> </div>
-<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  std::set<Process> <a class="code" href="namespaceos.html#aa98ca8ac255e2b9c689979a1b40084d3">processes</a>;</div>
-<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <span class="keywordflow">for</span> (DWORD i = 0; i < pid_list.NumberOfProcessIdsInList; ++i) {</div>
-<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <a class="code" href="classResult.html">Result<Process></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>  <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>  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>  }</div>
-<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  }</div>
-<div class="line"><a name="l00720"></a><span class="lineno"> 720</span> </div>
-<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <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> }</div>
-<div class="line"><a name="l00723"></a><span class="lineno"> 723</span> </div>
-<div class="line"><a name="l00724"></a><span class="lineno"> 724</span> </div>
-<div class="line"><a name="l00725"></a><span class="lineno"><a class="line" href="namespaceos.html#a7361a49972acf9a2c28361a46199f484"> 725</a></span> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<std::set<Process></a>> <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> {</div>
-<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <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>  <a class="code" href="classTry.html">Try<SharedHandle></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>  JOB_OBJECT_QUERY,</div>
-<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  <span class="keyword">false</span>,</div>
-<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  pid);</div>
-<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <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>  <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>  }</div>
+<div class="line"><a name="l00607"></a><span class="lineno"><a class="line" href="namespaceos.html#a88a1637a0168d78faad2ac5b82e5cc4d"> 607</a></span> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<SharedHandle></a> <a class="code" href="namespaceos.html#a88a1637a0168d78faad2ac5b82e5cc4d">create_job</a>(<span class="keyword">const</span> std::wstring& <a class="code" href="namespaceos_1_1Shell.html#acfe16ef2b1146ad49a8651c0a457ce46">name</a>)</div>
+<div class="line"><a name="l00608"></a><span class="lineno"> 608</span> {</div>
+<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <a class="code" href="classSharedHandle.html">SharedHandle</a> job_handle(</div>
+<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  ::CreateJobObjectW(</div>
+<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <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>  <span class="comment">// the created handle cannot be inherited.</span></div>
+<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  name.data()), <span class="comment">// The name of the job.</span></div>
+<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  ::CloseHandle);</div>
+<div class="line"><a name="l00615"></a><span class="lineno"> 615</span> </div>
+<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <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>  <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>  <span class="stringliteral">"os::create_job: Call to `CreateJobObject` failed for job: "</span> +</div>
+<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <a class="code" href="namespacens.html#a28116b46e6543597a11733424cd1aa20">stringify</a>(name));</div>
+<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  }</div>
+<div class="line"><a name="l00621"></a><span class="lineno"> 621</span> </div>
+<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="keywordflow">return</span> job_handle;</div>
+<div class="line"><a name="l00623"></a><span class="lineno"> 623</span> }</div>
+<div class="line"><a name="l00624"></a><span class="lineno"> 624</span> </div>
+<div class="line"><a name="l00625"></a><span class="lineno"> 625</span> </div>
+<div class="line"><a name="l00626"></a><span class="lineno"> 626</span> <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> <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> <span class="comment">// will fail otherwise.</span></div>
+<div class="line"><a name="l00629"></a><span class="lineno"> 629</span> <span class="comment">//</span></div>
+<div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <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> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<JOBOBJECT_BASIC_ACCOUNTING_INFORMATION></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> {</div>
+<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <a class="code" href="classTry.html">Try<SharedHandle></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>  JOB_OBJECT_QUERY,</div>
+<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keyword">false</span>,</div>
+<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  pid);</div>
+<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <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>  <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>  }</div>
+<div class="line"><a name="l00640"></a><span class="lineno"> 640</span> </div>
+<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  JOBOBJECT_BASIC_ACCOUNTING_INFORMATION info = {};</div>
+<div class="line"><a name="l00642"></a><span class="lineno"> 642</span> </div>
+<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  BOOL result = ::QueryInformationJobObject(</div>
+<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  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>  JobObjectBasicAccountingInformation,</div>
+<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  &info,</div>
+<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  <span class="keyword">sizeof</span>(info),</div>
+<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keyword">nullptr</span>);</div>
+<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
+<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <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>  <span class="stringliteral">"os::get_job_info: call to `QueryInformationJobObject` failed"</span>);</div>
+<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  }</div>
+<div class="line"><a name="l00653"></a><span class="lineno"> 653</span> </div>
+<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keywordflow">return</span> info;</div>
+<div class="line"><a name="l00655"></a><span class="lineno"> 655</span> }</div>
+<div class="line"><a name="l00656"></a><span class="lineno"> 656</span> </div>
+<div class="line"><a name="l00657"></a><span class="lineno"> 657</span> </div>
+<div class="line"><a name="l00658"></a><span class="lineno"> 658</span> <span class="keyword">template</span> <<span class="keywordtype">size_t</span> max_p<span class="keywordtype">id</span>s></div>
+<div class="line"><a name="l00659"></a><span class="lineno"><a class="line" href="namespaceos.html#a97c21dd769e29b904e192e591ed11096"> 659</a></span> <a class="code" href="classResult.html">Result<std::set<Process></a>> <a class="code" href="namespaceos.html#a97c21dd769e29b904e192e591ed11096">_get_job_processes</a>(<span class="keyword">const</span> <a class="code" href="classSharedHandle.html">SharedHandle</a>& job_handle) {</div>
+<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <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>  <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>  <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>  <span class="comment">// worry about deallocating.</span></div>
+<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  <span class="keyword">struct </span>{</div>
+<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  DWORD NumberOfAssignedProcesses;</div>
+<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  DWORD NumberOfProcessIdsInList;</div>
+<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  DWORD ProcessIdList[max_pids];</div>
+<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  } pid_list;</div>
+<div class="line"><a name="l00669"></a><span class="lineno"> 669</span> </div>
+<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  BOOL result = ::QueryInformationJobObject(</div>
+<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  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>  JobObjectBasicProcessIdList,</div>
+<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="keyword">reinterpret_cast<</span>JOBOBJECT_BASIC_PROCESS_ID_LIST*<span class="keyword">></span>(&pid_list),</div>
+<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keyword">sizeof</span>(pid_list),</div>
+<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keyword">nullptr</span>);</div>
+<div class="line"><a name="l00676"></a><span class="lineno"> 676</span> </div>
+<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <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>  <span class="keywordflow">if</span> (result == FALSE && ::GetLastError() == ERROR_MORE_DATA) {</div>
+<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <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>  }</div>
+<div class="line"><a name="l00681"></a><span class="lineno"> 681</span> </div>
+<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
+<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <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>  <span class="stringliteral">"os::_get_job_processes: call to `QueryInformationJobObject` failed"</span>);</div>
+<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  }</div>
+<div class="line"><a name="l00686"></a><span class="lineno"> 686</span> </div>
+<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  std::set<Process> <a class="code" href="namespaceos.html#aa98ca8ac255e2b9c689979a1b40084d3">processes</a>;</div>
+<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="keywordflow">for</span> (DWORD i = 0; i < pid_list.NumberOfProcessIdsInList; ++i) {</div>
+<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <a class="code" href="classResult.html">Result<Process></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>  <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>  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>  }</div>
+<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  }</div>
+<div class="line"><a name="l00694"></a><span class="lineno"> 694</span> </div>
+<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  <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> }</div>
+<div class="line"><a name="l00697"></a><span class="lineno"> 697</span> </div>
+<div class="line"><a name="l00698"></a><span class="lineno"> 698</span> </div>
+<div class="line"><a name="l00699"></a><span class="lineno"><a class="line" href="namespaceos.html#a7361a49972acf9a2c28361a46199f484"> 699</a></span> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<std::set<Process></a>> <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> {</div>
+<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <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>  <a class="code" href="classTry.html">Try<SharedHandle></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>  JOB_OBJECT_QUERY,</div>
+<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keyword">false</span>,</div>
+<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  pid);</div>
+<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  <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>  <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>  }</div>
+<div class="line"><a name="l00709"></a><span class="lineno"> 709</span> </div>
+<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <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> </div>
+<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <a class="code" href="classResult.html">Result<std::set<Process></a>> result =</div>
+<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  os::_get_job_processes<32>(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
+<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <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>  <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>  } <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>  <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>  }</div>
+<div class="line"><a name="l00719"></a><span class="lineno"> 719</span> </div>
+<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  result = os::_get_job_processes<32*32>(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
+<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <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>  <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>  } <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>  <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>  }</div>
+<div class="line"><a name="l00726"></a><span class="lineno"> 726</span> </div>
+<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  result = os::_get_job_processes<32*32*32>(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
+<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <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>  <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>  } <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>  <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>  }</div>
+<div class="line"><a name="l00733"></a><span class="lineno"> 733</span> </div>
+<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <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> </div>
-<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <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> </div>
-<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <a class="code" href="classResult.html">Result<std::set<Process></a>> result =</div>
-<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  os::_get_job_processes<32>(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
-<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <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>  <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>  } <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>  <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>  <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(<span class="stringliteral">"os::get_job_processes: failed to get processes"</span>);</div>
+<div class="line"><a name="l00737"></a><span class="lineno"> 737</span> }</div>
+<div class="line"><a name="l00738"></a><span class="lineno"> 738</span> </div>
+<div class="line"><a name="l00739"></a><span class="lineno"> 739</span> </div>
+<div class="line"><a name="l00740"></a><span class="lineno"><a class="line" href="namespaceos.html#a2719d5e9978531adac530780f6a97cf2"> 740</a></span> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<Bytes></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>  <span class="keyword">const</span> <a class="code" href="classTry.html">Try<std::set<Process></a>> 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>  <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>  <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>  }</div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span> </div>
-<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  result = os::_get_job_processes<32*32>(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
-<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <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>  <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>  } <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>  <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>  }</div>
-<div class="line"><a name="l00752"></a><span class="lineno"> 752</span> </div>
-<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  result = os::_get_job_processes<32*32*32>(job_handle.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>());</div>
-<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <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>  <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>  } <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>  <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>  }</div>
+<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="keywordflow">return</span> std::accumulate(</div>
+<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  processes.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().cbegin(),</div>
+<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  processes.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().cend(),</div>
+<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <a class="code" href="classBytes.html">Bytes</a>(0),</div>
+<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  [](<span class="keyword">const</span> <a class="code" href="classBytes.html">Bytes</a>& bytes, <span class="keyword">const</span> <a class="code" href="structos_1_1Process.html">Process</a>& <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a>) {</div>
+<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <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>  <span class="keywordflow">return</span> bytes;</div>
+<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  }</div>
+<div class="line"><a name="l00754"></a><span class="lineno"> 754</span> </div>
+<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  <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>  });</div>
+<div class="line"><a name="l00757"></a><span class="lineno"> 757</span> }</div>
+<div class="line"><a name="l00758"></a><span class="lineno"> 758</span> </div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span> </div>
-<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  <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> </div>
-<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <span class="keywordflow">return</span> <a class="code" href="classError.html">Error</a>(<span class="stringliteral">"os::get_job_processes: failed to get processes"</span>);</div>
-<div class="line"><a name="l00763"></a><span class="lineno"> 763</span> }</div>
-<div class="line"><a name="l00764"></a><span class="lineno"> 764</span> </div>
-<div class="line"><a name="l00765"></a><span class="lineno"> 765</span> </div>
-<div class="line"><a name="l00766"></a><span class="lineno"><a class="line" href="namespaceos.html#a2719d5e9978531adac530780f6a97cf2"> 766</a></span> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<Bytes></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>  <span class="keyword">const</span> <a class="code" href="classTry.html">Try<std::set<Process></a>> 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>  <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>  <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>  }</div>
-<div class="line"><a name="l00771"></a><span class="lineno"> 771</span> </div>
-<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <span class="keywordflow">return</span> std::accumulate(</div>
-<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  processes.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().cbegin(),</div>
-<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  processes.<a class="code" href="classTry.html#a7be0768038e0628632492edf6cc1515a">get</a>().cend(),</div>
-<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <a class="code" href="classBytes.html">Bytes</a>(0),</div>
-<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  [](<span class="keyword">const</span> <a class="code" href="classBytes.html">Bytes</a>& bytes, <span class="keyword">const</span> <a class="code" href="structos_1_1Process.html">Process</a>& <a class="code" href="namespaceos.html#ae19e4161a51b86a1f330f3bf1dc75389">process</a>) {</div>
-<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <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>  <span class="keywordflow">return</span> bytes;</div>
-<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  }</div>
-<div class="line"><a name="l00780"></a><span class="lineno"> 780</span> </div>
-<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <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>  });</div>
-<div class="line"><a name="l00783"></a><span class="lineno"> 783</span> }</div>
-<div class="line"><a name="l00784"></a><span class="lineno"> 784</span> </div>
-<div class="line"><a name="l00785"></a><span class="lineno"> 785</span> </div>
-<div class="line"><a name="l00786"></a><span class="lineno"> 786</span> <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> <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> <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> <span class="comment">//</span></div>
-<div class="line"><a name="l00790"></a><span class="lineno"> 790</span> <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> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<Nothing></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> {</div>
-<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  JOBOBJECT_CPU_RATE_CONTROL_INFORMATION control_info = {};</div>
-<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  control_info.ControlFlags =</div>
-<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  JOB_OBJECT_CPU_RATE_CONTROL_ENABLE |</div>
-<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP;</div>
-<div class="line"><a name="l00797"></a><span class="lineno"> 797</span> </div>
-<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <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>  <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>  <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>  <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>  <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>  <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>  <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>  <a class="code" href="classTry.html">Try<long></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>  control_info.CpuRate =</div>
-<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  <span class="keyword">static_cast<</span>DWORD<span class="keyword">></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>  <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>  <span class="keywordflow">if</span> (control_info.CpuRate < 1) {</div>
-<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  control_info.CpuRate = 1;</div>
-<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  }</div>
-<div class="line"><a name="l00812"></a><span class="lineno"> 812</span> </div>
-<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <a class="code" href="classTry.html">Try<SharedHandle></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>  JOB_OBJECT_SET_ATTRIBUTES,</div>
-<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  <span class="keyword">false</span>,</div>
-<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  pid);</div>
-<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  <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>  <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>  }</div>
-<div class="line"><a name="l00820"></a><span class="lineno"> 820</span> </div>
-<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  BOOL result = ::SetInformationJobObject(</div>
-<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  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>  JobObjectCpuRateControlInformation,</div>
-<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  &control_info,</div>
-<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  <span class="keyword">sizeof</span>(control_info));</div>
-<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  <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>  <span class="stringliteral">"os::set_job_cpu_limit: call to `SetInformationJobObject` failed"</span>);</div>
-<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  }</div>
-<div class="line"><a name="l00830"></a><span class="lineno"> 830</span> </div>
-<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <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> }</div>
-<div class="line"><a name="l00833"></a><span class="lineno"> 833</span> </div>
-<div class="line"><a name="l00834"></a><span class="lineno"> 834</span> </div>
-<div class="line"><a name="l00835"></a><span class="lineno"> 835</span> <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> <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> <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> <span class="comment">//</span></div>
-<div class="line"><a name="l00839"></a><span class="lineno"> 839</span> <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> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<Nothing></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> {</div>
-<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  JOBOBJECT_EXTENDED_LIMIT_INFORMATION info = {};</div>
-<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_JOB_MEMORY;</div>
-<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  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> </div>
-<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  <a class="code" href="classTry.html">Try<SharedHandle></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>  JOB_OBJECT_SET_ATTRIBUTES,</div>
-<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  <span class="keyword">false</span>,</div>
-<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  pid);</div>
-<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <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>  <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>  }</div>
-<div class="line"><a name="l00853"></a><span class="lineno"> 853</span> </div>
-<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  BOOL result = ::SetInformationJobObject(</div>
-<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  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>  JobObjectExtendedLimitInformation,</div>
-<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  &info,</div>
-<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="keyword">sizeof</span>(info));</div>
-<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <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>  <span class="stringliteral">"os::set_job_mem_limit: call to `SetInformationJobObject` failed"</span>);</div>
-<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  }</div>
-<div class="line"><a name="l00863"></a><span class="lineno"> 863</span> </div>
-<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <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> }</div>
-<div class="line"><a name="l00866"></a><span class="lineno"> 866</span> </div>
-<div class="line"><a name="l00867"></a><span class="lineno"> 867</span> </div>
-<div class="line"><a name="l00868"></a><span class="lineno"> 868</span> <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> <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> <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> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<Nothing></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>  <span class="comment">// Get process handle for `pid`.</span></div>
-<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <a class="code" href="classSharedHandle.html">SharedHandle</a> process_handle(</div>
-<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  ::OpenProcess(</div>
-<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <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>  PROCESS_SET_QUOTA | PROCESS_TERMINATE,</div>
-<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  <span class="keyword">false</span>, <span class="comment">// Don't inherit handle.</span></div>
-<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  pid),</div>
-<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  ::CloseHandle);</div>
-<div class="line"><a name="l00880"></a><span class="lineno"> 880</span> </div>
-<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <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>  <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>  <span class="stringliteral">"os::assign_job: Call to `OpenProcess` failed"</span>);</div>
-<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  }</div>
-<div class="line"><a name="l00885"></a><span class="lineno"> 885</span> </div>
-<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="keyword">const</span> BOOL result = ::AssignProcessToJobObject(</div>
-<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  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>  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> </div>
-<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  <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>  <span class="stringliteral">"os::assign_job: Call to `AssignProcessToJobObject` failed"</span>);</div>
-<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  };</div>
-<div class="line"><a name="l00894"></a><span class="lineno"> 894</span> </div>
-<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <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> }</div>
-<div class="line"><a name="l00897"></a><span class="lineno"> 897</span> </div>
-<div class="line"><a name="l00898"></a><span class="lineno"> 898</span> </div>
-<div class="line"><a name="l00899"></a><span class="lineno"> 899</span> <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> <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> <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> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<Nothing></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> {</div>
-<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  <span class="keyword">const</span> BOOL result = ::TerminateJobObject(</div>
-<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  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>  <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>  1);</div>
-<div class="line"><a name="l00908"></a><span class="lineno"> 908</span> </div>
-<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
-<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <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>  <span class="stringliteral">"os::kill_job: Call to `TerminateJobObject` failed"</span>);</div>
-<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  }</div>
-<div class="line"><a name="l00913"></a><span class="lineno"> 913</span> </div>
-<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <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> }</div>
-<div class="line"><a name="l00916"></a><span class="lineno"> 916</span> </div>
-<div class="line"><a name="l00917"></a><span class="lineno"> 917</span> </div>
-<div class="line"><a name="l00918"></a><span class="lineno"> 918</span> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<std::string></a> <a class="code" href="namespaceos.html#a547f04b42e472b2ff0070897010fac78">var</a>()</div>
-<div class="line"><a name="l00919"></a><span class="lineno"> 919</span> {</div>
-<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <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>  <span class="comment">// This size includes the null-terminating character.</span></div>
-<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  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>  <span class="keywordflow">if</span> (::GetAllUsersProfileDirectoryW(<span class="keyword">nullptr</span>, &size)) {</div>
-<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  <span class="comment">// The expected behavior here is for the function to "fail"</span></div>
-<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <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>  <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>  <span class="stringliteral">"os::var: `GetAllUsersProfileDirectoryW` succeeded unexpectedly"</span>);</div>
-<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  }</div>
-<div class="line"><a name="l00929"></a><span class="lineno"> 929</span> </div>
-<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  std::vector<wchar_t> buffer;</div>
-<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  buffer.reserve(static_cast<size_t>(size));</div>
-<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keywordflow">if</span> (!::GetAllUsersProfileDirectoryW(buffer.data(), &<a class="code" href="namespaceos_1_1stat.html#a7a116891923bc8b5d8c50f78da8657be">size</a>)) {</div>
-<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="keywordflow">return</span> <a class="code" href="classWindowsError.html">WindowsError</a>(<span class="stringliteral">"os::var: `GetAllUsersProfileDirectoryW` failed"</span>);</div>
+<div class="line"><a name="l00760"></a><span class="lineno"> 760</span> <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> <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> <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> <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> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<Nothing></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> {</div>
+<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  <a class="code" href="classTry.html">Try<SharedHandle></a> job_handle =</div>
+<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <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> </div>
+<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <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>  <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>  }</div>
+<div class="line"><a name="l00772"></a><span class="lineno"> 772</span> </div>
+<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  JOBOBJECT_EXTENDED_LIMIT_INFORMATION info = {};</div>
+<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;</div>
+<div class="line"><a name="l00775"></a><span class="lineno"> 775</span> </div>
+<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="keyword">const</span> BOOL result = ::SetInformationJobObject(</div>
+<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  job_handle-><a class="code" href="classSharedHandle.html#a800385e17e17cb826147968e748fd8fa">get_handle</a>(),</div>
+<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  JobObjectExtendedLimitInformation,</div>
+<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  &info,</div>
+<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  <span class="keyword">sizeof</span>(info));</div>
+<div class="line"><a name="l00781"></a><span class="lineno"> 781</span> </div>
+<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="keywordflow">if</span> (result == FALSE) {</div>
+<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <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>  <span class="stringliteral">"os::set_job_kill_on_close_limit: call to `SetInformationJobObject` "</span></div>
+<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  <span class="stringliteral">"failed"</span>);</div>
+<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  }</div>
+<div class="line"><a name="l00787"></a><span class="lineno"> 787</span> </div>
+<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <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> }</div>
+<div class="line"><a name="l00790"></a><span class="lineno"> 790</span> </div>
+<div class="line"><a name="l00791"></a><span class="lineno"> 791</span> </div>
+<div class="line"><a name="l00792"></a><span class="lineno"> 792</span> <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> <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> <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> <span class="comment">//</span></div>
+<div class="line"><a name="l00796"></a><span class="lineno"> 796</span> <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> <span class="keyword">inline</span> <a class="code" href="classTry.html">Try<Nothing></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> {</div>
+<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  JOBOBJECT_CPU_RATE_CONTROL_INFORMATION control_info = {};</div>
+<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  control_info.ControlFlags =</div>
+<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  JOB_OBJECT_CPU_RATE_CONTROL_ENABLE |</div>
+<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP;</div>
+<div class="line"><a name="l00803"></a><span class="lineno"> 803</span> </div>
+<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <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>  <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>  <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>  <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>  <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>  <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>  <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>  <a class="code" href="classTry.html">Try<long></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>  control_info.CpuRate =</div>
+<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keyword">static_cast<</span>DWORD<span class="keyword">></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>  <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>  <span class="keywordflow">if</span> (control_info.CpuRate < 1) {</div>
+<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  control_info.CpuRate = 1;</div>
+<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  }</div>
+<div class="line"><a name="l00818"></a><span class="lineno"> 818</span> </div>
+<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  <a class="code" href="classTry.html">Try<SharedHandle></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>  JOB_OBJECT_SET_ATTRIBUTES,</
<TRUNCATED>