Skip to main content

fidl_fuchsia_starnix_psi/
fidl_fuchsia_starnix_psi.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10pub use fidl_fuchsia_starnix_psi__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, Default, PartialEq)]
15pub struct PsiProviderWatchMemoryStallResponse {
16    pub event: Option<fidl::Event>,
17    #[doc(hidden)]
18    pub __source_breaking: fidl::marker::SourceBreaking,
19}
20
21impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
22    for PsiProviderWatchMemoryStallResponse
23{
24}
25
26#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
27pub struct PsiProviderMarker;
28
29impl fidl::endpoints::ProtocolMarker for PsiProviderMarker {
30    type Proxy = PsiProviderProxy;
31    type RequestStream = PsiProviderRequestStream;
32    #[cfg(target_os = "fuchsia")]
33    type SynchronousProxy = PsiProviderSynchronousProxy;
34
35    const DEBUG_NAME: &'static str = "fuchsia.starnix.psi.PsiProvider";
36}
37impl fidl::endpoints::DiscoverableProtocolMarker for PsiProviderMarker {}
38pub type PsiProviderGetMemoryPressureStatsResult =
39    Result<PsiProviderGetMemoryPressureStatsResponse, i32>;
40pub type PsiProviderWatchMemoryStallResult = Result<PsiProviderWatchMemoryStallResponse, i32>;
41
42pub trait PsiProviderProxyInterface: Send + Sync {
43    type GetMemoryPressureStatsResponseFut: std::future::Future<Output = Result<PsiProviderGetMemoryPressureStatsResult, fidl::Error>>
44        + Send;
45    fn r#get_memory_pressure_stats(&self) -> Self::GetMemoryPressureStatsResponseFut;
46    type WatchMemoryStallResponseFut: std::future::Future<Output = Result<PsiProviderWatchMemoryStallResult, fidl::Error>>
47        + Send;
48    fn r#watch_memory_stall(
49        &self,
50        payload: &PsiProviderWatchMemoryStallRequest,
51    ) -> Self::WatchMemoryStallResponseFut;
52}
53#[derive(Debug)]
54#[cfg(target_os = "fuchsia")]
55pub struct PsiProviderSynchronousProxy {
56    client: fidl::client::sync::Client,
57}
58
59#[cfg(target_os = "fuchsia")]
60impl fidl::endpoints::SynchronousProxy for PsiProviderSynchronousProxy {
61    type Proxy = PsiProviderProxy;
62    type Protocol = PsiProviderMarker;
63
64    fn from_channel(inner: fidl::Channel) -> Self {
65        Self::new(inner)
66    }
67
68    fn into_channel(self) -> fidl::Channel {
69        self.client.into_channel()
70    }
71
72    fn as_channel(&self) -> &fidl::Channel {
73        self.client.as_channel()
74    }
75}
76
77#[cfg(target_os = "fuchsia")]
78impl PsiProviderSynchronousProxy {
79    pub fn new(channel: fidl::Channel) -> Self {
80        Self { client: fidl::client::sync::Client::new(channel) }
81    }
82
83    pub fn into_channel(self) -> fidl::Channel {
84        self.client.into_channel()
85    }
86
87    /// Waits until an event arrives and returns it. It is safe for other
88    /// threads to make concurrent requests while waiting for an event.
89    pub fn wait_for_event(
90        &self,
91        deadline: zx::MonotonicInstant,
92    ) -> Result<PsiProviderEvent, fidl::Error> {
93        PsiProviderEvent::decode(self.client.wait_for_event::<PsiProviderMarker>(deadline)?)
94    }
95
96    pub fn r#get_memory_pressure_stats(
97        &self,
98        ___deadline: zx::MonotonicInstant,
99    ) -> Result<PsiProviderGetMemoryPressureStatsResult, fidl::Error> {
100        let _response = self.client.send_query::<
101            fidl::encoding::EmptyPayload,
102            fidl::encoding::FlexibleResultType<PsiProviderGetMemoryPressureStatsResponse, i32>,
103            PsiProviderMarker,
104        >(
105            (),
106            0x2122b26519bc6d20,
107            fidl::encoding::DynamicFlags::FLEXIBLE,
108            ___deadline,
109        )?
110        .into_result::<PsiProviderMarker>("get_memory_pressure_stats")?;
111        Ok(_response.map(|x| x))
112    }
113
114    pub fn r#watch_memory_stall(
115        &self,
116        mut payload: &PsiProviderWatchMemoryStallRequest,
117        ___deadline: zx::MonotonicInstant,
118    ) -> Result<PsiProviderWatchMemoryStallResult, fidl::Error> {
119        let _response = self.client.send_query::<
120            PsiProviderWatchMemoryStallRequest,
121            fidl::encoding::FlexibleResultType<PsiProviderWatchMemoryStallResponse, i32>,
122            PsiProviderMarker,
123        >(
124            payload,
125            0x1c45c961cce60400,
126            fidl::encoding::DynamicFlags::FLEXIBLE,
127            ___deadline,
128        )?
129        .into_result::<PsiProviderMarker>("watch_memory_stall")?;
130        Ok(_response.map(|x| x))
131    }
132}
133
134#[cfg(target_os = "fuchsia")]
135impl From<PsiProviderSynchronousProxy> for zx::NullableHandle {
136    fn from(value: PsiProviderSynchronousProxy) -> Self {
137        value.into_channel().into()
138    }
139}
140
141#[cfg(target_os = "fuchsia")]
142impl From<fidl::Channel> for PsiProviderSynchronousProxy {
143    fn from(value: fidl::Channel) -> Self {
144        Self::new(value)
145    }
146}
147
148#[cfg(target_os = "fuchsia")]
149impl fidl::endpoints::FromClient for PsiProviderSynchronousProxy {
150    type Protocol = PsiProviderMarker;
151
152    fn from_client(value: fidl::endpoints::ClientEnd<PsiProviderMarker>) -> Self {
153        Self::new(value.into_channel())
154    }
155}
156
157#[derive(Debug, Clone)]
158pub struct PsiProviderProxy {
159    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
160}
161
162impl fidl::endpoints::Proxy for PsiProviderProxy {
163    type Protocol = PsiProviderMarker;
164
165    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
166        Self::new(inner)
167    }
168
169    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
170        self.client.into_channel().map_err(|client| Self { client })
171    }
172
173    fn as_channel(&self) -> &::fidl::AsyncChannel {
174        self.client.as_channel()
175    }
176}
177
178impl PsiProviderProxy {
179    /// Create a new Proxy for fuchsia.starnix.psi/PsiProvider.
180    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
181        let protocol_name = <PsiProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
182        Self { client: fidl::client::Client::new(channel, protocol_name) }
183    }
184
185    /// Get a Stream of events from the remote end of the protocol.
186    ///
187    /// # Panics
188    ///
189    /// Panics if the event stream was already taken.
190    pub fn take_event_stream(&self) -> PsiProviderEventStream {
191        PsiProviderEventStream { event_receiver: self.client.take_event_receiver() }
192    }
193
194    pub fn r#get_memory_pressure_stats(
195        &self,
196    ) -> fidl::client::QueryResponseFut<
197        PsiProviderGetMemoryPressureStatsResult,
198        fidl::encoding::DefaultFuchsiaResourceDialect,
199    > {
200        PsiProviderProxyInterface::r#get_memory_pressure_stats(self)
201    }
202
203    pub fn r#watch_memory_stall(
204        &self,
205        mut payload: &PsiProviderWatchMemoryStallRequest,
206    ) -> fidl::client::QueryResponseFut<
207        PsiProviderWatchMemoryStallResult,
208        fidl::encoding::DefaultFuchsiaResourceDialect,
209    > {
210        PsiProviderProxyInterface::r#watch_memory_stall(self, payload)
211    }
212}
213
214impl PsiProviderProxyInterface for PsiProviderProxy {
215    type GetMemoryPressureStatsResponseFut = fidl::client::QueryResponseFut<
216        PsiProviderGetMemoryPressureStatsResult,
217        fidl::encoding::DefaultFuchsiaResourceDialect,
218    >;
219    fn r#get_memory_pressure_stats(&self) -> Self::GetMemoryPressureStatsResponseFut {
220        fn _decode(
221            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
222        ) -> Result<PsiProviderGetMemoryPressureStatsResult, fidl::Error> {
223            let _response = fidl::client::decode_transaction_body::<
224                fidl::encoding::FlexibleResultType<PsiProviderGetMemoryPressureStatsResponse, i32>,
225                fidl::encoding::DefaultFuchsiaResourceDialect,
226                0x2122b26519bc6d20,
227            >(_buf?)?
228            .into_result::<PsiProviderMarker>("get_memory_pressure_stats")?;
229            Ok(_response.map(|x| x))
230        }
231        self.client.send_query_and_decode::<
232            fidl::encoding::EmptyPayload,
233            PsiProviderGetMemoryPressureStatsResult,
234        >(
235            (),
236            0x2122b26519bc6d20,
237            fidl::encoding::DynamicFlags::FLEXIBLE,
238            _decode,
239        )
240    }
241
242    type WatchMemoryStallResponseFut = fidl::client::QueryResponseFut<
243        PsiProviderWatchMemoryStallResult,
244        fidl::encoding::DefaultFuchsiaResourceDialect,
245    >;
246    fn r#watch_memory_stall(
247        &self,
248        mut payload: &PsiProviderWatchMemoryStallRequest,
249    ) -> Self::WatchMemoryStallResponseFut {
250        fn _decode(
251            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
252        ) -> Result<PsiProviderWatchMemoryStallResult, fidl::Error> {
253            let _response = fidl::client::decode_transaction_body::<
254                fidl::encoding::FlexibleResultType<PsiProviderWatchMemoryStallResponse, i32>,
255                fidl::encoding::DefaultFuchsiaResourceDialect,
256                0x1c45c961cce60400,
257            >(_buf?)?
258            .into_result::<PsiProviderMarker>("watch_memory_stall")?;
259            Ok(_response.map(|x| x))
260        }
261        self.client.send_query_and_decode::<
262            PsiProviderWatchMemoryStallRequest,
263            PsiProviderWatchMemoryStallResult,
264        >(
265            payload,
266            0x1c45c961cce60400,
267            fidl::encoding::DynamicFlags::FLEXIBLE,
268            _decode,
269        )
270    }
271}
272
273pub struct PsiProviderEventStream {
274    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
275}
276
277impl std::marker::Unpin for PsiProviderEventStream {}
278
279impl futures::stream::FusedStream for PsiProviderEventStream {
280    fn is_terminated(&self) -> bool {
281        self.event_receiver.is_terminated()
282    }
283}
284
285impl futures::Stream for PsiProviderEventStream {
286    type Item = Result<PsiProviderEvent, fidl::Error>;
287
288    fn poll_next(
289        mut self: std::pin::Pin<&mut Self>,
290        cx: &mut std::task::Context<'_>,
291    ) -> std::task::Poll<Option<Self::Item>> {
292        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
293            &mut self.event_receiver,
294            cx
295        )?) {
296            Some(buf) => std::task::Poll::Ready(Some(PsiProviderEvent::decode(buf))),
297            None => std::task::Poll::Ready(None),
298        }
299    }
300}
301
302#[derive(Debug)]
303pub enum PsiProviderEvent {
304    #[non_exhaustive]
305    _UnknownEvent {
306        /// Ordinal of the event that was sent.
307        ordinal: u64,
308    },
309}
310
311impl PsiProviderEvent {
312    /// Decodes a message buffer as a [`PsiProviderEvent`].
313    fn decode(
314        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
315    ) -> Result<PsiProviderEvent, fidl::Error> {
316        let (bytes, _handles) = buf.split_mut();
317        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
318        debug_assert_eq!(tx_header.tx_id, 0);
319        match tx_header.ordinal {
320            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
321                Ok(PsiProviderEvent::_UnknownEvent { ordinal: tx_header.ordinal })
322            }
323            _ => Err(fidl::Error::UnknownOrdinal {
324                ordinal: tx_header.ordinal,
325                protocol_name: <PsiProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
326            }),
327        }
328    }
329}
330
331/// A Stream of incoming requests for fuchsia.starnix.psi/PsiProvider.
332pub struct PsiProviderRequestStream {
333    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
334    is_terminated: bool,
335}
336
337impl std::marker::Unpin for PsiProviderRequestStream {}
338
339impl futures::stream::FusedStream for PsiProviderRequestStream {
340    fn is_terminated(&self) -> bool {
341        self.is_terminated
342    }
343}
344
345impl fidl::endpoints::RequestStream for PsiProviderRequestStream {
346    type Protocol = PsiProviderMarker;
347    type ControlHandle = PsiProviderControlHandle;
348
349    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
350        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
351    }
352
353    fn control_handle(&self) -> Self::ControlHandle {
354        PsiProviderControlHandle { inner: self.inner.clone() }
355    }
356
357    fn into_inner(
358        self,
359    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
360    {
361        (self.inner, self.is_terminated)
362    }
363
364    fn from_inner(
365        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
366        is_terminated: bool,
367    ) -> Self {
368        Self { inner, is_terminated }
369    }
370}
371
372impl futures::Stream for PsiProviderRequestStream {
373    type Item = Result<PsiProviderRequest, fidl::Error>;
374
375    fn poll_next(
376        mut self: std::pin::Pin<&mut Self>,
377        cx: &mut std::task::Context<'_>,
378    ) -> std::task::Poll<Option<Self::Item>> {
379        let this = &mut *self;
380        if this.inner.check_shutdown(cx) {
381            this.is_terminated = true;
382            return std::task::Poll::Ready(None);
383        }
384        if this.is_terminated {
385            panic!("polled PsiProviderRequestStream after completion");
386        }
387        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
388            |bytes, handles| {
389                match this.inner.channel().read_etc(cx, bytes, handles) {
390                    std::task::Poll::Ready(Ok(())) => {}
391                    std::task::Poll::Pending => return std::task::Poll::Pending,
392                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
393                        this.is_terminated = true;
394                        return std::task::Poll::Ready(None);
395                    }
396                    std::task::Poll::Ready(Err(e)) => {
397                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
398                            e.into(),
399                        ))));
400                    }
401                }
402
403                // A message has been received from the channel
404                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
405
406                std::task::Poll::Ready(Some(match header.ordinal {
407                    0x2122b26519bc6d20 => {
408                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
409                        let mut req = fidl::new_empty!(
410                            fidl::encoding::EmptyPayload,
411                            fidl::encoding::DefaultFuchsiaResourceDialect
412                        );
413                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
414                        let control_handle = PsiProviderControlHandle { inner: this.inner.clone() };
415                        Ok(PsiProviderRequest::GetMemoryPressureStats {
416                            responder: PsiProviderGetMemoryPressureStatsResponder {
417                                control_handle: std::mem::ManuallyDrop::new(control_handle),
418                                tx_id: header.tx_id,
419                            },
420                        })
421                    }
422                    0x1c45c961cce60400 => {
423                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
424                        let mut req = fidl::new_empty!(
425                            PsiProviderWatchMemoryStallRequest,
426                            fidl::encoding::DefaultFuchsiaResourceDialect
427                        );
428                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<PsiProviderWatchMemoryStallRequest>(&header, _body_bytes, handles, &mut req)?;
429                        let control_handle = PsiProviderControlHandle { inner: this.inner.clone() };
430                        Ok(PsiProviderRequest::WatchMemoryStall {
431                            payload: req,
432                            responder: PsiProviderWatchMemoryStallResponder {
433                                control_handle: std::mem::ManuallyDrop::new(control_handle),
434                                tx_id: header.tx_id,
435                            },
436                        })
437                    }
438                    _ if header.tx_id == 0
439                        && header
440                            .dynamic_flags()
441                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
442                    {
443                        Ok(PsiProviderRequest::_UnknownMethod {
444                            ordinal: header.ordinal,
445                            control_handle: PsiProviderControlHandle { inner: this.inner.clone() },
446                            method_type: fidl::MethodType::OneWay,
447                        })
448                    }
449                    _ if header
450                        .dynamic_flags()
451                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
452                    {
453                        this.inner.send_framework_err(
454                            fidl::encoding::FrameworkErr::UnknownMethod,
455                            header.tx_id,
456                            header.ordinal,
457                            header.dynamic_flags(),
458                            (bytes, handles),
459                        )?;
460                        Ok(PsiProviderRequest::_UnknownMethod {
461                            ordinal: header.ordinal,
462                            control_handle: PsiProviderControlHandle { inner: this.inner.clone() },
463                            method_type: fidl::MethodType::TwoWay,
464                        })
465                    }
466                    _ => Err(fidl::Error::UnknownOrdinal {
467                        ordinal: header.ordinal,
468                        protocol_name:
469                            <PsiProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
470                    }),
471                }))
472            },
473        )
474    }
475}
476
477#[derive(Debug)]
478pub enum PsiProviderRequest {
479    GetMemoryPressureStats {
480        responder: PsiProviderGetMemoryPressureStatsResponder,
481    },
482    WatchMemoryStall {
483        payload: PsiProviderWatchMemoryStallRequest,
484        responder: PsiProviderWatchMemoryStallResponder,
485    },
486    /// An interaction was received which does not match any known method.
487    #[non_exhaustive]
488    _UnknownMethod {
489        /// Ordinal of the method that was called.
490        ordinal: u64,
491        control_handle: PsiProviderControlHandle,
492        method_type: fidl::MethodType,
493    },
494}
495
496impl PsiProviderRequest {
497    #[allow(irrefutable_let_patterns)]
498    pub fn into_get_memory_pressure_stats(
499        self,
500    ) -> Option<(PsiProviderGetMemoryPressureStatsResponder)> {
501        if let PsiProviderRequest::GetMemoryPressureStats { responder } = self {
502            Some((responder))
503        } else {
504            None
505        }
506    }
507
508    #[allow(irrefutable_let_patterns)]
509    pub fn into_watch_memory_stall(
510        self,
511    ) -> Option<(PsiProviderWatchMemoryStallRequest, PsiProviderWatchMemoryStallResponder)> {
512        if let PsiProviderRequest::WatchMemoryStall { payload, responder } = self {
513            Some((payload, responder))
514        } else {
515            None
516        }
517    }
518
519    /// Name of the method defined in FIDL
520    pub fn method_name(&self) -> &'static str {
521        match *self {
522            PsiProviderRequest::GetMemoryPressureStats { .. } => "get_memory_pressure_stats",
523            PsiProviderRequest::WatchMemoryStall { .. } => "watch_memory_stall",
524            PsiProviderRequest::_UnknownMethod {
525                method_type: fidl::MethodType::OneWay, ..
526            } => "unknown one-way method",
527            PsiProviderRequest::_UnknownMethod {
528                method_type: fidl::MethodType::TwoWay, ..
529            } => "unknown two-way method",
530        }
531    }
532}
533
534#[derive(Debug, Clone)]
535pub struct PsiProviderControlHandle {
536    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
537}
538
539impl fidl::endpoints::ControlHandle for PsiProviderControlHandle {
540    fn shutdown(&self) {
541        self.inner.shutdown()
542    }
543
544    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
545        self.inner.shutdown_with_epitaph(status)
546    }
547
548    fn is_closed(&self) -> bool {
549        self.inner.channel().is_closed()
550    }
551    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
552        self.inner.channel().on_closed()
553    }
554
555    #[cfg(target_os = "fuchsia")]
556    fn signal_peer(
557        &self,
558        clear_mask: zx::Signals,
559        set_mask: zx::Signals,
560    ) -> Result<(), zx_status::Status> {
561        use fidl::Peered;
562        self.inner.channel().signal_peer(clear_mask, set_mask)
563    }
564}
565
566impl PsiProviderControlHandle {}
567
568#[must_use = "FIDL methods require a response to be sent"]
569#[derive(Debug)]
570pub struct PsiProviderGetMemoryPressureStatsResponder {
571    control_handle: std::mem::ManuallyDrop<PsiProviderControlHandle>,
572    tx_id: u32,
573}
574
575/// Set the the channel to be shutdown (see [`PsiProviderControlHandle::shutdown`])
576/// if the responder is dropped without sending a response, so that the client
577/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
578impl std::ops::Drop for PsiProviderGetMemoryPressureStatsResponder {
579    fn drop(&mut self) {
580        self.control_handle.shutdown();
581        // Safety: drops once, never accessed again
582        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
583    }
584}
585
586impl fidl::endpoints::Responder for PsiProviderGetMemoryPressureStatsResponder {
587    type ControlHandle = PsiProviderControlHandle;
588
589    fn control_handle(&self) -> &PsiProviderControlHandle {
590        &self.control_handle
591    }
592
593    fn drop_without_shutdown(mut self) {
594        // Safety: drops once, never accessed again due to mem::forget
595        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
596        // Prevent Drop from running (which would shut down the channel)
597        std::mem::forget(self);
598    }
599}
600
601impl PsiProviderGetMemoryPressureStatsResponder {
602    /// Sends a response to the FIDL transaction.
603    ///
604    /// Sets the channel to shutdown if an error occurs.
605    pub fn send(
606        self,
607        mut result: Result<&PsiProviderGetMemoryPressureStatsResponse, i32>,
608    ) -> Result<(), fidl::Error> {
609        let _result = self.send_raw(result);
610        if _result.is_err() {
611            self.control_handle.shutdown();
612        }
613        self.drop_without_shutdown();
614        _result
615    }
616
617    /// Similar to "send" but does not shutdown the channel if an error occurs.
618    pub fn send_no_shutdown_on_err(
619        self,
620        mut result: Result<&PsiProviderGetMemoryPressureStatsResponse, i32>,
621    ) -> Result<(), fidl::Error> {
622        let _result = self.send_raw(result);
623        self.drop_without_shutdown();
624        _result
625    }
626
627    fn send_raw(
628        &self,
629        mut result: Result<&PsiProviderGetMemoryPressureStatsResponse, i32>,
630    ) -> Result<(), fidl::Error> {
631        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
632            PsiProviderGetMemoryPressureStatsResponse,
633            i32,
634        >>(
635            fidl::encoding::FlexibleResult::new(result),
636            self.tx_id,
637            0x2122b26519bc6d20,
638            fidl::encoding::DynamicFlags::FLEXIBLE,
639        )
640    }
641}
642
643#[must_use = "FIDL methods require a response to be sent"]
644#[derive(Debug)]
645pub struct PsiProviderWatchMemoryStallResponder {
646    control_handle: std::mem::ManuallyDrop<PsiProviderControlHandle>,
647    tx_id: u32,
648}
649
650/// Set the the channel to be shutdown (see [`PsiProviderControlHandle::shutdown`])
651/// if the responder is dropped without sending a response, so that the client
652/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
653impl std::ops::Drop for PsiProviderWatchMemoryStallResponder {
654    fn drop(&mut self) {
655        self.control_handle.shutdown();
656        // Safety: drops once, never accessed again
657        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
658    }
659}
660
661impl fidl::endpoints::Responder for PsiProviderWatchMemoryStallResponder {
662    type ControlHandle = PsiProviderControlHandle;
663
664    fn control_handle(&self) -> &PsiProviderControlHandle {
665        &self.control_handle
666    }
667
668    fn drop_without_shutdown(mut self) {
669        // Safety: drops once, never accessed again due to mem::forget
670        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
671        // Prevent Drop from running (which would shut down the channel)
672        std::mem::forget(self);
673    }
674}
675
676impl PsiProviderWatchMemoryStallResponder {
677    /// Sends a response to the FIDL transaction.
678    ///
679    /// Sets the channel to shutdown if an error occurs.
680    pub fn send(
681        self,
682        mut result: Result<PsiProviderWatchMemoryStallResponse, i32>,
683    ) -> Result<(), fidl::Error> {
684        let _result = self.send_raw(result);
685        if _result.is_err() {
686            self.control_handle.shutdown();
687        }
688        self.drop_without_shutdown();
689        _result
690    }
691
692    /// Similar to "send" but does not shutdown the channel if an error occurs.
693    pub fn send_no_shutdown_on_err(
694        self,
695        mut result: Result<PsiProviderWatchMemoryStallResponse, i32>,
696    ) -> Result<(), fidl::Error> {
697        let _result = self.send_raw(result);
698        self.drop_without_shutdown();
699        _result
700    }
701
702    fn send_raw(
703        &self,
704        mut result: Result<PsiProviderWatchMemoryStallResponse, i32>,
705    ) -> Result<(), fidl::Error> {
706        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
707            PsiProviderWatchMemoryStallResponse,
708            i32,
709        >>(
710            fidl::encoding::FlexibleResult::new(result.as_mut().map_err(|e| *e)),
711            self.tx_id,
712            0x1c45c961cce60400,
713            fidl::encoding::DynamicFlags::FLEXIBLE,
714        )
715    }
716}
717
718mod internal {
719    use super::*;
720
721    impl PsiProviderWatchMemoryStallResponse {
722        #[inline(always)]
723        fn max_ordinal_present(&self) -> u64 {
724            if let Some(_) = self.event {
725                return 1;
726            }
727            0
728        }
729    }
730
731    impl fidl::encoding::ResourceTypeMarker for PsiProviderWatchMemoryStallResponse {
732        type Borrowed<'a> = &'a mut Self;
733        fn take_or_borrow<'a>(
734            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
735        ) -> Self::Borrowed<'a> {
736            value
737        }
738    }
739
740    unsafe impl fidl::encoding::TypeMarker for PsiProviderWatchMemoryStallResponse {
741        type Owned = Self;
742
743        #[inline(always)]
744        fn inline_align(_context: fidl::encoding::Context) -> usize {
745            8
746        }
747
748        #[inline(always)]
749        fn inline_size(_context: fidl::encoding::Context) -> usize {
750            16
751        }
752    }
753
754    unsafe impl
755        fidl::encoding::Encode<
756            PsiProviderWatchMemoryStallResponse,
757            fidl::encoding::DefaultFuchsiaResourceDialect,
758        > for &mut PsiProviderWatchMemoryStallResponse
759    {
760        unsafe fn encode(
761            self,
762            encoder: &mut fidl::encoding::Encoder<
763                '_,
764                fidl::encoding::DefaultFuchsiaResourceDialect,
765            >,
766            offset: usize,
767            mut depth: fidl::encoding::Depth,
768        ) -> fidl::Result<()> {
769            encoder.debug_check_bounds::<PsiProviderWatchMemoryStallResponse>(offset);
770            // Vector header
771            let max_ordinal: u64 = self.max_ordinal_present();
772            encoder.write_num(max_ordinal, offset);
773            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
774            // Calling encoder.out_of_line_offset(0) is not allowed.
775            if max_ordinal == 0 {
776                return Ok(());
777            }
778            depth.increment()?;
779            let envelope_size = 8;
780            let bytes_len = max_ordinal as usize * envelope_size;
781            #[allow(unused_variables)]
782            let offset = encoder.out_of_line_offset(bytes_len);
783            let mut _prev_end_offset: usize = 0;
784            if 1 > max_ordinal {
785                return Ok(());
786            }
787
788            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
789            // are envelope_size bytes.
790            let cur_offset: usize = (1 - 1) * envelope_size;
791
792            // Zero reserved fields.
793            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
794
795            // Safety:
796            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
797            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
798            //   envelope_size bytes, there is always sufficient room.
799            fidl::encoding::encode_in_envelope_optional::<
800                fidl::encoding::HandleType<
801                    fidl::Event,
802                    { fidl::ObjectType::EVENT.into_raw() },
803                    2147483648,
804                >,
805                fidl::encoding::DefaultFuchsiaResourceDialect,
806            >(
807                self.event.as_mut().map(
808                    <fidl::encoding::HandleType<
809                        fidl::Event,
810                        { fidl::ObjectType::EVENT.into_raw() },
811                        2147483648,
812                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
813                ),
814                encoder,
815                offset + cur_offset,
816                depth,
817            )?;
818
819            _prev_end_offset = cur_offset + envelope_size;
820
821            Ok(())
822        }
823    }
824
825    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
826        for PsiProviderWatchMemoryStallResponse
827    {
828        #[inline(always)]
829        fn new_empty() -> Self {
830            Self::default()
831        }
832
833        unsafe fn decode(
834            &mut self,
835            decoder: &mut fidl::encoding::Decoder<
836                '_,
837                fidl::encoding::DefaultFuchsiaResourceDialect,
838            >,
839            offset: usize,
840            mut depth: fidl::encoding::Depth,
841        ) -> fidl::Result<()> {
842            decoder.debug_check_bounds::<Self>(offset);
843            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
844                None => return Err(fidl::Error::NotNullable),
845                Some(len) => len,
846            };
847            // Calling decoder.out_of_line_offset(0) is not allowed.
848            if len == 0 {
849                return Ok(());
850            };
851            depth.increment()?;
852            let envelope_size = 8;
853            let bytes_len = len * envelope_size;
854            let offset = decoder.out_of_line_offset(bytes_len)?;
855            // Decode the envelope for each type.
856            let mut _next_ordinal_to_read = 0;
857            let mut next_offset = offset;
858            let end_offset = offset + bytes_len;
859            _next_ordinal_to_read += 1;
860            if next_offset >= end_offset {
861                return Ok(());
862            }
863
864            // Decode unknown envelopes for gaps in ordinals.
865            while _next_ordinal_to_read < 1 {
866                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
867                _next_ordinal_to_read += 1;
868                next_offset += envelope_size;
869            }
870
871            let next_out_of_line = decoder.next_out_of_line();
872            let handles_before = decoder.remaining_handles();
873            if let Some((inlined, num_bytes, num_handles)) =
874                fidl::encoding::decode_envelope_header(decoder, next_offset)?
875            {
876                let member_inline_size = <fidl::encoding::HandleType<
877                    fidl::Event,
878                    { fidl::ObjectType::EVENT.into_raw() },
879                    2147483648,
880                > as fidl::encoding::TypeMarker>::inline_size(
881                    decoder.context
882                );
883                if inlined != (member_inline_size <= 4) {
884                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
885                }
886                let inner_offset;
887                let mut inner_depth = depth.clone();
888                if inlined {
889                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
890                    inner_offset = next_offset;
891                } else {
892                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
893                    inner_depth.increment()?;
894                }
895                let val_ref =
896                self.event.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
897                fidl::decode!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
898                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
899                {
900                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
901                }
902                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
903                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
904                }
905            }
906
907            next_offset += envelope_size;
908
909            // Decode the remaining unknown envelopes.
910            while next_offset < end_offset {
911                _next_ordinal_to_read += 1;
912                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
913                next_offset += envelope_size;
914            }
915
916            Ok(())
917        }
918    }
919}