maplibre-rs/docs/api/maplibre/io/apc/trait.AsyncProcedureCall.html

54 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="APCs define an interface for performing work asynchronously. This work can be implemented through procedures which can be called asynchronously, hence the name AsyncProcedureCall or APC for short."><title>AsyncProcedureCall in maplibre::io::apc - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/FiraSans-Regular-018c141bf0843ffd.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/FiraSans-Medium-8f9a781e4970d388.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2"><link rel="stylesheet" href="../../../static.files/normalize-76eba96aa4d2e634.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ac92e1bbe349e143.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="maplibre" data-themes="" data-resource-suffix="" data-rustdoc-version="1.76.0 (07dca489a 2024-02-04)" data-channel="1.76.0" data-search-js="search-2b6ce74ff89ae146.js" data-settings-js="settings-4313503d2e1961c2.js" ><script src="../../../static.files/storage-f2adc0d6ca4d09fb.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../../static.files/main-305769736d49e732.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-feafe1bb7466e4bd.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-16x16-8b506e7a72182f1c.png"><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-422f7d1d52889060.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-2c020d218678b618.svg"></head><body class="rustdoc trait"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button></nav><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../maplibre/index.html">maplibre</a><span class="version">0.1.0</span></h2></div><h2 class="location"><a href="#">AsyncProcedureCall</a></h2><div class="sidebar-elems"><section><h3><a href="#required-associated-types">Required Associated Types</a></h3><ul class="block"><li><a href="#associatedtype.Context">Context</a></li><li><a href="#associatedtype.ReceiveIterator">ReceiveIterator</a></li></ul><h3><a href="#required-methods">Required Methods</a></h3><ul class="block"><li><a href="#tymethod.call">call</a></li><li><a href="#tymethod.receive">receive</a></li></ul><h3><a href="#object-safety">Object Safety</a></h3><h3><a href="#implementors">Implementors</a></h3></section><h2><a href="index.html">In maplibre::io::apc</a></h2></div></nav><div class="sidebar-resizer"></div>
<main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../../maplibre/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../../help.html" title="help">?</a></div><div id="settings-menu" tabindex="-1"><a href="../../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../../static.files/wheel-7b819b6101059cd0.svg"></a></div></form></nav><section id="main-content" class="content"><div class="main-heading"><h1>Trait <a href="../../index.html">maplibre</a>::<wbr><a href="../index.html">io</a>::<wbr><a href="index.html">apc</a>::<wbr><a class="trait" href="#">AsyncProcedureCall</a><button id="copy-path" title="Copy item path to clipboard"><img src="../../../static.files/clipboard-7571035ce49a181d.svg" width="19" height="18" alt="Copy item path"></button></h1><span class="out-of-band"><a class="src" href="../../../src/maplibre/io/apc.rs.html#167-182">source</a> · <button id="toggle-all-docs" title="collapse all docs">[<span>&#x2212;</span>]</button></span></div><pre class="rust item-decl"><code>pub trait AsyncProcedureCall&lt;K: <a class="trait" href="../../environment/trait.OffscreenKernelEnvironment.html" title="trait maplibre::environment::OffscreenKernelEnvironment">OffscreenKernelEnvironment</a>&gt;: 'static {
type <a href="#associatedtype.Context" class="associatedtype">Context</a>: <a class="trait" href="trait.Context.html" title="trait maplibre::io::apc::Context">Context</a> + <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>;
type <a href="#associatedtype.ReceiveIterator" class="associatedtype">ReceiveIterator</a>&lt;F: <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="struct.Message.html" title="struct maplibre::io::apc::Message">Message</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.76.0/std/primitive.bool.html">bool</a>&gt;: <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/iter/traits/iterator/trait.Iterator.html" title="trait core::iter::traits::iterator::Iterator">Iterator</a>&lt;Item = <a class="struct" href="struct.Message.html" title="struct maplibre::io::apc::Message">Message</a>&gt;;
// Required methods
fn <a href="#tymethod.receive" class="fn">receive</a>&lt;F: <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="struct.Message.html" title="struct maplibre::io::apc::Message">Message</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.76.0/std/primitive.bool.html">bool</a>&gt;(
&amp;self,
filter: F
) -&gt; Self::<a class="associatedtype" href="trait.AsyncProcedureCall.html#associatedtype.ReceiveIterator" title="type maplibre::io::apc::AsyncProcedureCall::ReceiveIterator">ReceiveIterator</a>&lt;F&gt;;
<span class="item-spacer"></span> fn <a href="#tymethod.call" class="fn">call</a>(
&amp;self,
input: <a class="enum" href="enum.Input.html" title="enum maplibre::io::apc::Input">Input</a>,
procedure: <a class="type" href="type.AsyncProcedure.html" title="type maplibre::io::apc::AsyncProcedure">AsyncProcedure</a>&lt;K, Self::<a class="associatedtype" href="trait.AsyncProcedureCall.html#associatedtype.Context" title="type maplibre::io::apc::AsyncProcedureCall::Context">Context</a>&gt;
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.76.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.76.0/std/primitive.unit.html">()</a>, <a class="enum" href="enum.CallError.html" title="enum maplibre::io::apc::CallError">CallError</a>&gt;;
}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>APCs define an interface for performing work asynchronously.
This work can be implemented through procedures which can be called asynchronously, hence the
name AsyncProcedureCall or APC for short.</p>
<p>APCs serve as an abstraction for doing work on a separate thread, and then getting responses
back. An asynchronous procedure call can for example be performed by using message passing. In
fact this could theoretically work over a network socket.</p>
<p>It is possible to schedule work on a remote host by calling <a href="trait.AsyncProcedureCall.html#tymethod.call" title="method maplibre::io::apc::AsyncProcedureCall::call"><code>AsyncProcedureCall::call()</code></a>
and getting the results back by calling the non-blocking function
<a href="trait.AsyncProcedureCall.html#tymethod.receive" title="method maplibre::io::apc::AsyncProcedureCall::receive"><code>AsyncProcedureCall::receive()</code></a>. The <a href="trait.AsyncProcedureCall.html#tymethod.receive" title="method maplibre::io::apc::AsyncProcedureCall::receive"><code>AsyncProcedureCall::receive()</code></a> function returns a
struct which implements [<code>Transferables</code>].</p>
<h3 id="transferables"><a href="#transferables">Transferables</a></h3>
<p>Based on whether the current platform supports shared-memory or not, the implementation of APCs
might want to send the whole data from the worker to the caller back or just pointers to that
data. The [<code>Transferables</code>] trait allows developers to define that and use different data
layouts for different platforms.</p>
<h3 id="message-passing-vs-apc"><a href="#message-passing-vs-apc">Message Passing vs APC</a></h3>
<p>One might wonder why this is called <a href="trait.AsyncProcedureCall.html" title="trait maplibre::io::apc::AsyncProcedureCall"><code>AsyncProcedureCall</code></a> instead of <code>MessagePassingInterface</code>.
The reason for this is quite simple. We are actually referencing and calling procedures which
are defined in different threads, processes or hosts. That means, that an <a href="trait.AsyncProcedureCall.html" title="trait maplibre::io::apc::AsyncProcedureCall"><code>AsyncProcedureCall</code></a>
is actually distinct from a <code>MessagePassingInterface</code>.</p>
<h3 id="current-implementations"><a href="#current-implementations">Current Implementations</a></h3>
<p>We currently have two implementation for APCs. One uses the Tokio async runtime on native
targets in <a href="struct.SchedulerAsyncProcedureCall.html" title="struct maplibre::io::apc::SchedulerAsyncProcedureCall"><code>SchedulerAsyncProcedureCall</code></a>.
For the web we implemented an alternative way to call APCs which is called
[<code>PassingAsyncProcedureCall</code>]. This implementation does not depend on shared-memory compared to
<a href="struct.SchedulerAsyncProcedureCall.html" title="struct maplibre::io::apc::SchedulerAsyncProcedureCall"><code>SchedulerAsyncProcedureCall</code></a>. In fact, on the web we are currently not depending on
shared-memory because that feature is hidden behind feature flags in browsers
(see <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer">here</a>).</p>
</div></details><h2 id="required-associated-types" class="section-header">Required Associated Types<a href="#required-associated-types" class="anchor">§</a></h2><div class="methods"><section id="associatedtype.Context" class="method"><a class="src rightside" href="../../../src/maplibre/io/apc.rs.html#168">source</a><h4 class="code-header">type <a href="#associatedtype.Context" class="associatedtype">Context</a>: <a class="trait" href="trait.Context.html" title="trait maplibre::io::apc::Context">Context</a> + <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a></h4></section><section id="associatedtype.ReceiveIterator" class="method"><a class="src rightside" href="../../../src/maplibre/io/apc.rs.html#170">source</a><h4 class="code-header">type <a href="#associatedtype.ReceiveIterator" class="associatedtype">ReceiveIterator</a>&lt;F: <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="struct.Message.html" title="struct maplibre::io::apc::Message">Message</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.76.0/std/primitive.bool.html">bool</a>&gt;: <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/iter/traits/iterator/trait.Iterator.html" title="trait core::iter::traits::iterator::Iterator">Iterator</a>&lt;Item = <a class="struct" href="struct.Message.html" title="struct maplibre::io::apc::Message">Message</a>&gt;</h4></section></div><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.receive" class="method"><a class="src rightside" href="../../../src/maplibre/io/apc.rs.html#173">source</a><h4 class="code-header">fn <a href="#tymethod.receive" class="fn">receive</a>&lt;F: <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="struct.Message.html" title="struct maplibre::io::apc::Message">Message</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.76.0/std/primitive.bool.html">bool</a>&gt;(
&amp;self,
filter: F
) -&gt; Self::<a class="associatedtype" href="trait.AsyncProcedureCall.html#associatedtype.ReceiveIterator" title="type maplibre::io::apc::AsyncProcedureCall::ReceiveIterator">ReceiveIterator</a>&lt;F&gt;</h4></section></summary><div class="docblock"><p>Try to receive a message non-blocking.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.call" class="method"><a class="src rightside" href="../../../src/maplibre/io/apc.rs.html#177-181">source</a><h4 class="code-header">fn <a href="#tymethod.call" class="fn">call</a>(
&amp;self,
input: <a class="enum" href="enum.Input.html" title="enum maplibre::io::apc::Input">Input</a>,
procedure: <a class="type" href="type.AsyncProcedure.html" title="type maplibre::io::apc::AsyncProcedure">AsyncProcedure</a>&lt;K, Self::<a class="associatedtype" href="trait.AsyncProcedureCall.html#associatedtype.Context" title="type maplibre::io::apc::AsyncProcedureCall::Context">Context</a>&gt;
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.76.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.76.0/std/primitive.unit.html">()</a>, <a class="enum" href="enum.CallError.html" title="enum maplibre::io::apc::CallError">CallError</a>&gt;</h4></section></summary><div class="docblock"><p>Call an <a href="type.AsyncProcedure.html" title="type maplibre::io::apc::AsyncProcedure"><code>AsyncProcedure</code></a> using some <a href="enum.Input.html" title="enum maplibre::io::apc::Input"><code>Input</code></a>. This function is non-blocking and
returns immediately.</p>
</div></details></div><h2 id="object-safety" class="section-header">Object Safety<a href="#object-safety" class="anchor">§</a></h2><div class="object-safety-info">This trait is <b>not</b> <a href="https://doc.rust-lang.org/1.76.0/reference/items/traits.html#object-safety">object safe</a>.</div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><details class="toggle implementors-toggle"><summary><section id="impl-AsyncProcedureCall%3CK%3E-for-SchedulerAsyncProcedureCall%3CK,+S%3E" class="impl"><a class="src rightside" href="../../../src/maplibre/io/apc.rs.html#215-269">source</a><a href="#impl-AsyncProcedureCall%3CK%3E-for-SchedulerAsyncProcedureCall%3CK,+S%3E" class="anchor">§</a><h3 class="code-header">impl&lt;K: <a class="trait" href="../../environment/trait.OffscreenKernelEnvironment.html" title="trait maplibre::environment::OffscreenKernelEnvironment">OffscreenKernelEnvironment</a>, S: <a class="trait" href="../scheduler/trait.Scheduler.html" title="trait maplibre::io::scheduler::Scheduler">Scheduler</a>&gt; <a class="trait" href="trait.AsyncProcedureCall.html" title="trait maplibre::io::apc::AsyncProcedureCall">AsyncProcedureCall</a>&lt;K&gt; for <a class="struct" href="struct.SchedulerAsyncProcedureCall.html" title="struct maplibre::io::apc::SchedulerAsyncProcedureCall">SchedulerAsyncProcedureCall</a>&lt;K, S&gt;</h3></section></summary><div class="impl-items"><section id="associatedtype.Context-1" class="associatedtype trait-impl"><a href="#associatedtype.Context-1" class="anchor">§</a><h4 class="code-header">type <a href="#associatedtype.Context" class="associatedtype">Context</a> = <a class="struct" href="struct.SchedulerContext.html" title="struct maplibre::io::apc::SchedulerContext">SchedulerContext</a></h4></section><section id="associatedtype.ReceiveIterator-1" class="associatedtype trait-impl"><a href="#associatedtype.ReceiveIterator-1" class="anchor">§</a><h4 class="code-header">type <a href="#associatedtype.ReceiveIterator" class="associatedtype">ReceiveIterator</a>&lt;F: <a class="trait" href="https://doc.rust-lang.org/1.76.0/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="struct.Message.html" title="struct maplibre::io::apc::Message">Message</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.76.0/std/primitive.bool.html">bool</a>&gt; = <a class="struct" href="https://doc.rust-lang.org/1.76.0/alloc/vec/into_iter/struct.IntoIter.html" title="struct alloc::vec::into_iter::IntoIter">IntoIter</a>&lt;<a class="struct" href="struct.Message.html" title="struct maplibre::io::apc::Message">Message</a>&gt;</h4></section></div></details></div><script src="../../../trait.impl/maplibre/io/apc/trait.AsyncProcedureCall.js" async></script></section></div></main></body></html>