blob: 40e6b5807a9069b873e3d72dc430b9de1454b02b [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.18"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Crashpad: crashpad::CompositeMachMessageServer Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="crashpad_doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Crashpad
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.18 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="namespacecrashpad.html">crashpad</a></li><li class="navelem"><a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html">CompositeMachMessageServer</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classcrashpad_1_1CompositeMachMessageServer-members.html">List of all members</a> </div>
<div class="headertitle">
<div class="title">crashpad::CompositeMachMessageServer Class Reference</div> </div>
</div><!--header-->
<div class="contents">
<p>Adapts multiple <a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html" title="A Mach RPC callback interface, called by Run().">MachMessageServer::Interface</a> implementations for simultaneous use in a single <a class="el" href="classcrashpad_1_1MachMessageServer.html#ace981f2e495984f119aa074f7d33bff6" title="Runs a Mach message server to handle a Mach RPC request for MIG servers.">MachMessageServer::Run()</a> call.
<a href="classcrashpad_1_1CompositeMachMessageServer.html#details">More...</a></p>
<p><code>#include &quot;util/mach/composite_mach_message_server.h&quot;</code></p>
<div class="dynheader">
Inheritance diagram for crashpad::CompositeMachMessageServer:</div>
<div class="dyncontent">
<div class="center">
<img src="classcrashpad_1_1CompositeMachMessageServer.png" usemap="#crashpad::CompositeMachMessageServer_map" alt=""/>
<map id="crashpad::CompositeMachMessageServer_map" name="crashpad::CompositeMachMessageServer_map">
<area href="classcrashpad_1_1MachMessageServer_1_1Interface.html" title="A Mach RPC callback interface, called by Run()." alt="crashpad::MachMessageServer::Interface" shape="rect" coords="0,0,286,24"/>
<area href="classcrashpad_1_1internal_1_1UniversalMachExcServerImpl.html" alt="crashpad::internal::UniversalMachExcServerImpl" shape="rect" coords="0,112,286,136"/>
</map>
</div></div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a1b946d369ddb0c838496dbddd0f6f631"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#a1b946d369ddb0c838496dbddd0f6f631">AddHandler</a> (<a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html">MachMessageServer::Interface</a> *handler)</td></tr>
<tr class="memdesc:a1b946d369ddb0c838496dbddd0f6f631"><td class="mdescLeft">&#160;</td><td class="mdescRight">Adds a handler that messages can be dispatched to based on request message ID. <a href="classcrashpad_1_1CompositeMachMessageServer.html#a1b946d369ddb0c838496dbddd0f6f631">More...</a><br /></td></tr>
<tr class="separator:a1b946d369ddb0c838496dbddd0f6f631"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afe10dd1d12e4cbfe57e040b6939d7f15"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#afe10dd1d12e4cbfe57e040b6939d7f15">MachMessageServerFunction</a> (const mach_msg_header_t *in, mach_msg_header_t *out, bool *destroy_complex_request) override</td></tr>
<tr class="memdesc:afe10dd1d12e4cbfe57e040b6939d7f15"><td class="mdescLeft">&#160;</td><td class="mdescRight">Handles a Mach RPC request. <a href="classcrashpad_1_1CompositeMachMessageServer.html#afe10dd1d12e4cbfe57e040b6939d7f15">More...</a><br /></td></tr>
<tr class="separator:afe10dd1d12e4cbfe57e040b6939d7f15"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac0782632280317be75ff7064b7854579"><td class="memItemLeft" align="right" valign="top">std::set&lt; mach_msg_id_t &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#ac0782632280317be75ff7064b7854579">MachMessageServerRequestIDs</a> () override</td></tr>
<tr class="separator:ac0782632280317be75ff7064b7854579"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad45773f4a12149f52e42787c6a102dd4"><td class="memItemLeft" align="right" valign="top">mach_msg_size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#ad45773f4a12149f52e42787c6a102dd4">MachMessageServerRequestSize</a> () override</td></tr>
<tr class="separator:ad45773f4a12149f52e42787c6a102dd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0d96bb825abf09c76e75ebe9262581fc"><td class="memItemLeft" align="right" valign="top">mach_msg_size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#a0d96bb825abf09c76e75ebe9262581fc">MachMessageServerReplySize</a> () override</td></tr>
<tr class="separator:a0d96bb825abf09c76e75ebe9262581fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Adapts multiple <a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html" title="A Mach RPC callback interface, called by Run().">MachMessageServer::Interface</a> implementations for simultaneous use in a single <a class="el" href="classcrashpad_1_1MachMessageServer.html#ace981f2e495984f119aa074f7d33bff6" title="Runs a Mach message server to handle a Mach RPC request for MIG servers.">MachMessageServer::Run()</a> call. </p>
<p>This class implements a <a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html" title="A Mach RPC callback interface, called by Run().">MachMessageServer::Interface</a> that contains other <a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html" title="A Mach RPC callback interface, called by Run().">MachMessageServer::Interface</a> objects.</p>
<p>In some situations, it may be desirable for a Mach message server to handle messages from distinct MIG subsystems with distinct <a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html" title="A Mach RPC callback interface, called by Run().">MachMessageServer::Interface</a> implementations. This may happen if a single receive right is shared for multiple subsystems, or if distinct receive rights are combined in a Mach port set. In these cases, this class performs a first-level demultiplexing to forward request messages to the proper subsystem-level demultiplexers. </p>
</div><h2 class="groupheader">Member Function Documentation</h2>
<a id="a1b946d369ddb0c838496dbddd0f6f631"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1b946d369ddb0c838496dbddd0f6f631">&#9670;&nbsp;</a></span>AddHandler()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void crashpad::CompositeMachMessageServer::AddHandler </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html">MachMessageServer::Interface</a> *&#160;</td>
<td class="paramname"><em>handler</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Adds a handler that messages can be dispatched to based on request message ID. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">handler</td><td>A <a class="el" href="classcrashpad_1_1MachMessageServer.html" title="Runs a Mach message server to handle a Mach RPC request for MIG servers.">MachMessageServer</a> handler. Ownership of this object is not taken. Cycles must not be created between objects. It is invalid to add an object as its own handler.</td></tr>
</table>
</dd>
</dl>
<p>If <em>handler</em> claims to support any request ID that this object is already able to handle, execution will be terminated. </p>
</div>
</div>
<a id="afe10dd1d12e4cbfe57e040b6939d7f15"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afe10dd1d12e4cbfe57e040b6939d7f15">&#9670;&nbsp;</a></span>MachMessageServerFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">bool crashpad::CompositeMachMessageServer::MachMessageServerFunction </td>
<td>(</td>
<td class="paramtype">const mach_msg_header_t *&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">mach_msg_header_t *&#160;</td>
<td class="paramname"><em>out</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool *&#160;</td>
<td class="paramname"><em>destroy_complex_request</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Handles a Mach RPC request. </p>
<p>This method is a stand-in for a MIG-generated Mach RPC server “demux” function such as <code>exc_server()</code> and <code>mach_exc_server()</code>. Implementations may call such a function directly. This method is expected to behave exactly as these functions behave.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">in</td><td>The request message, received as a Mach message. Note that this interface uses a <code>const</code> parameter for this purpose, whereas MIG-generated “demux” functions do not. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">out</td><td>The reply message. The caller allocates storage, and the callee is expected to populate the reply message appropriately. After returning, the caller will send this reply as a Mach message via the message’s reply port. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">destroy_complex_request</td><td><code>true</code> if a complex request message is to be destroyed even when handled successfully, <code>false</code> otherwise. The traditional behavior is <code>false</code>. In this case, the caller only destroys the request message in <em>in</em> when the reply message in <em>out</em> is not complex and when it indicates a return code other than <code>KERN_SUCCESS</code> or <code>MIG_NO_REPLY</code>. The assumption is that the rights or out-of-line data carried in a complex message may be retained by the server in this situation, and that it is the responsibility of the server to release these resources as needed. However, in many cases, these resources are not needed beyond the duration of a request-reply transaction, and in such cases, it is less error-prone to always have the caller, <a class="el" href="classcrashpad_1_1MachMessageServer.html#ace981f2e495984f119aa074f7d33bff6" title="Runs a Mach message server to handle a Mach RPC request for MIG servers.">MachMessageServer::Run()</a>, destroy complex request messages. To choose this behavior, this parameter should be set to <code>true</code>.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>true</code> on success and <code>false</code> on failure, although the caller ignores the return value. However, the return code to be included in the reply message should be set as <code>mig_reply_error_t::RetCode</code>. The non-<code>void</code> return value is used for increased compatibility with MIG-generated functions.</dd></dl>
<p>This implementation forwards the message to an appropriate handler added by <a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#a1b946d369ddb0c838496dbddd0f6f631" title="Adds a handler that messages can be dispatched to based on request message ID.">AddHandler()</a> on the basis of the <em>in</em> request message’s message ID. If no appropriate handler exists, the <em>out</em> reply message is treated as a <code>mig_reply_error_t</code>, its return code is set to <code>MIG_BAD_ID</code>, and <code>false</code> is returned. </p>
<p>Implements <a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html#ad1632cba188c113600abc94d1b45efe6">crashpad::MachMessageServer::Interface</a>.</p>
</div>
</div>
<a id="a0d96bb825abf09c76e75ebe9262581fc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0d96bb825abf09c76e75ebe9262581fc">&#9670;&nbsp;</a></span>MachMessageServerReplySize()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">mach_msg_size_t crashpad::CompositeMachMessageServer::MachMessageServerReplySize </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p></p>
<dl class="section return"><dt>Returns</dt><dd>The maximum size, in bytes, of a reply message to be sent via the <em>out</em> parameter of <a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#afe10dd1d12e4cbfe57e040b6939d7f15" title="Handles a Mach RPC request.">MachMessageServerFunction()</a>. This value does not need to include the size of any trailer to be sent with the message.</dd></dl>
<p>This implementation returns the maximum reply message size of all handlers added by <a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#a1b946d369ddb0c838496dbddd0f6f631" title="Adds a handler that messages can be dispatched to based on request message ID.">AddHandler()</a>. If no handlers are present, returns the size of <code>mig_reply_error_t</code>, the minimum size of a MIG reply message. </p>
<p>Implements <a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html#ad4e6169aeb91074d573e77b9a47266c5">crashpad::MachMessageServer::Interface</a>.</p>
</div>
</div>
<a id="ac0782632280317be75ff7064b7854579"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac0782632280317be75ff7064b7854579">&#9670;&nbsp;</a></span>MachMessageServerRequestIDs()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">std::set&lt; mach_msg_id_t &gt; crashpad::CompositeMachMessageServer::MachMessageServerRequestIDs </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p></p>
<dl class="section return"><dt>Returns</dt><dd>The set of request message Mach message IDs that <a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#afe10dd1d12e4cbfe57e040b6939d7f15" title="Handles a Mach RPC request.">MachMessageServerFunction()</a> is able to handle.</dd></dl>
<p>This implementation returns the set of all request message Mach message IDs of all handlers added by <a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#a1b946d369ddb0c838496dbddd0f6f631" title="Adds a handler that messages can be dispatched to based on request message ID.">AddHandler()</a>. </p>
<p>Implements <a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html#af0a4b1e3b83c7226604837b32ef6428e">crashpad::MachMessageServer::Interface</a>.</p>
</div>
</div>
<a id="ad45773f4a12149f52e42787c6a102dd4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad45773f4a12149f52e42787c6a102dd4">&#9670;&nbsp;</a></span>MachMessageServerRequestSize()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">mach_msg_size_t crashpad::CompositeMachMessageServer::MachMessageServerRequestSize </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p></p>
<dl class="section return"><dt>Returns</dt><dd>The expected or maximum size, in bytes, of a request message to be received as the <em>in</em> parameter of <a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#afe10dd1d12e4cbfe57e040b6939d7f15" title="Handles a Mach RPC request.">MachMessageServerFunction()</a>.</dd></dl>
<p>This implementation returns the maximum request message size of all handlers added by <a class="el" href="classcrashpad_1_1CompositeMachMessageServer.html#a1b946d369ddb0c838496dbddd0f6f631" title="Adds a handler that messages can be dispatched to based on request message ID.">AddHandler()</a>. If no handlers are present, returns the size of <code>mach_msg_header_t</code>, the minimum size of a MIG request message that can be received for demultiplexing purposes. </p>
<p>Implements <a class="el" href="classcrashpad_1_1MachMessageServer_1_1Interface.html#a319dd9279e87b4407cee3c8feca405ab">crashpad::MachMessageServer::Interface</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li>util/mach/composite_mach_message_server.h</li>
<li>util/mach/composite_mach_message_server.cc</li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.18
</small></address>
</body>
</html>