Skip to main content

fidl_fuchsia_memory_sampler_common/
fidl_fuchsia_memory_sampler_common.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::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
8use futures::future::{self, MaybeDone, TryFutureExt};
9use zx_status;
10
11/// A build ID is a 20 bytes long sequence.
12pub const BUILD_ID_BYTES: u32 = 20;
13
14/// Address region that corresponds to an executable segment in an ELF module.
15#[derive(Clone, Debug, Default, PartialEq)]
16pub struct ExecutableSegment {
17    /// Start of the region as mapped in memory.
18    pub start_address: Option<u64>,
19    /// Size of the range of addresses that are part of the region.
20    pub size: Option<u64>,
21    /// Offset of the region in the ELF binary before loading.
22    pub relative_address: Option<u64>,
23    #[doc(hidden)]
24    pub __source_breaking: fidl::marker::SourceBreaking,
25}
26
27impl fidl::Persistable for ExecutableSegment {}
28
29/// Information necessary for the symbolization of a module.
30/// Represents the subset of an ELF module relevant for the purposes of
31/// the profiler. The main use case for this map is the symbolization of stack traces.
32#[derive(Clone, Debug, Default, PartialEq)]
33pub struct ModuleMap {
34    /// Build ID, a string which uniquely identifies a module build.
35    pub build_id: Option<Vec<u8>>,
36    /// Collection of executable segments.
37    pub executable_segments: Option<Vec<ExecutableSegment>>,
38    #[doc(hidden)]
39    pub __source_breaking: fidl::marker::SourceBreaking,
40}
41
42impl fidl::Persistable for ModuleMap {}
43
44#[derive(Clone, Debug, Default, PartialEq)]
45pub struct RecordAllocationEvent {
46    /// Address of the allocation, to uniquely identify it.
47    pub address: Option<u64>,
48    /// Stack frames collected at the allocation point.
49    pub stack_trace: Option<StackTrace>,
50    /// Size (in bytes) of this allocation.
51    pub size: Option<u64>,
52    #[doc(hidden)]
53    pub __source_breaking: fidl::marker::SourceBreaking,
54}
55
56impl fidl::Persistable for RecordAllocationEvent {}
57
58#[derive(Clone, Debug, Default, PartialEq)]
59pub struct RecordDeallocationEvent {
60    /// Address of the deallocation, to uniquely identify it.
61    pub address: Option<u64>,
62    /// Stack frames collected at the deallocation point.
63    pub stack_trace: Option<StackTrace>,
64    #[doc(hidden)]
65    pub __source_breaking: fidl::marker::SourceBreaking,
66}
67
68impl fidl::Persistable for RecordDeallocationEvent {}
69
70#[derive(Clone, Debug, Default, PartialEq)]
71pub struct SamplerSetProcessInfoRequest {
72    pub process_name: Option<String>,
73    pub module_map: Option<Vec<ModuleMap>>,
74    #[doc(hidden)]
75    pub __source_breaking: fidl::marker::SourceBreaking,
76}
77
78impl fidl::Persistable for SamplerSetProcessInfoRequest {}
79
80/// A stack trace, as a collection of stack frames.
81#[derive(Clone, Debug, Default, PartialEq)]
82pub struct StackTrace {
83    /// Ordered vector of frame pointers, from the narrower to the wider location.
84    pub stack_frames: Option<Vec<u64>>,
85    #[doc(hidden)]
86    pub __source_breaking: fidl::marker::SourceBreaking,
87}
88
89impl fidl::Persistable for StackTrace {}
90
91#[derive(Clone, Debug)]
92pub enum SamplerDatagram {
93    RecordAllocation(RecordAllocationEvent),
94    RecordDeallocation(RecordDeallocationEvent),
95    #[doc(hidden)]
96    __SourceBreaking {
97        unknown_ordinal: u64,
98    },
99}
100
101/// Pattern that matches an unknown `SamplerDatagram` member.
102#[macro_export]
103macro_rules! SamplerDatagramUnknown {
104    () => {
105        _
106    };
107}
108
109// Custom PartialEq so that unknown variants are not equal to themselves.
110impl PartialEq for SamplerDatagram {
111    fn eq(&self, other: &Self) -> bool {
112        match (self, other) {
113            (Self::RecordAllocation(x), Self::RecordAllocation(y)) => *x == *y,
114            (Self::RecordDeallocation(x), Self::RecordDeallocation(y)) => *x == *y,
115            _ => false,
116        }
117    }
118}
119
120impl SamplerDatagram {
121    #[inline]
122    pub fn ordinal(&self) -> u64 {
123        match *self {
124            Self::RecordAllocation(_) => 1,
125            Self::RecordDeallocation(_) => 2,
126            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
127        }
128    }
129
130    #[inline]
131    pub fn unknown_variant_for_testing() -> Self {
132        Self::__SourceBreaking { unknown_ordinal: 0 }
133    }
134
135    #[inline]
136    pub fn is_unknown(&self) -> bool {
137        match self {
138            Self::__SourceBreaking { .. } => true,
139            _ => false,
140        }
141    }
142}
143
144impl fidl::Persistable for SamplerDatagram {}
145
146pub mod sampler_ordinals {
147    pub const RECORD_ALLOCATION: u64 = 0x6b0add9f7769824d;
148    pub const RECORD_DEALLOCATION: u64 = 0x503bff5ec34dbeeb;
149    pub const SET_PROCESS_INFO: u64 = 0x68a0557106e51783;
150    pub const SET_SHARED_SOCKET: u64 = 0x32e9c11b7a2958fd;
151}
152
153mod internal {
154    use super::*;
155
156    impl ExecutableSegment {
157        #[inline(always)]
158        fn max_ordinal_present(&self) -> u64 {
159            if let Some(_) = self.relative_address {
160                return 3;
161            }
162            if let Some(_) = self.size {
163                return 2;
164            }
165            if let Some(_) = self.start_address {
166                return 1;
167            }
168            0
169        }
170    }
171
172    impl fidl::encoding::ValueTypeMarker for ExecutableSegment {
173        type Borrowed<'a> = &'a Self;
174        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
175            value
176        }
177    }
178
179    unsafe impl fidl::encoding::TypeMarker for ExecutableSegment {
180        type Owned = Self;
181
182        #[inline(always)]
183        fn inline_align(_context: fidl::encoding::Context) -> usize {
184            8
185        }
186
187        #[inline(always)]
188        fn inline_size(_context: fidl::encoding::Context) -> usize {
189            16
190        }
191    }
192
193    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<ExecutableSegment, D>
194        for &ExecutableSegment
195    {
196        unsafe fn encode(
197            self,
198            encoder: &mut fidl::encoding::Encoder<'_, D>,
199            offset: usize,
200            mut depth: fidl::encoding::Depth,
201        ) -> fidl::Result<()> {
202            encoder.debug_check_bounds::<ExecutableSegment>(offset);
203            // Vector header
204            let max_ordinal: u64 = self.max_ordinal_present();
205            encoder.write_num(max_ordinal, offset);
206            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
207            // Calling encoder.out_of_line_offset(0) is not allowed.
208            if max_ordinal == 0 {
209                return Ok(());
210            }
211            depth.increment()?;
212            let envelope_size = 8;
213            let bytes_len = max_ordinal as usize * envelope_size;
214            #[allow(unused_variables)]
215            let offset = encoder.out_of_line_offset(bytes_len);
216            let mut _prev_end_offset: usize = 0;
217            if 1 > max_ordinal {
218                return Ok(());
219            }
220
221            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
222            // are envelope_size bytes.
223            let cur_offset: usize = (1 - 1) * envelope_size;
224
225            // Zero reserved fields.
226            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
227
228            // Safety:
229            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
230            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
231            //   envelope_size bytes, there is always sufficient room.
232            fidl::encoding::encode_in_envelope_optional::<u64, D>(
233                self.start_address.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
234                encoder,
235                offset + cur_offset,
236                depth,
237            )?;
238
239            _prev_end_offset = cur_offset + envelope_size;
240            if 2 > max_ordinal {
241                return Ok(());
242            }
243
244            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
245            // are envelope_size bytes.
246            let cur_offset: usize = (2 - 1) * envelope_size;
247
248            // Zero reserved fields.
249            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
250
251            // Safety:
252            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
253            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
254            //   envelope_size bytes, there is always sufficient room.
255            fidl::encoding::encode_in_envelope_optional::<u64, D>(
256                self.size.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
257                encoder,
258                offset + cur_offset,
259                depth,
260            )?;
261
262            _prev_end_offset = cur_offset + envelope_size;
263            if 3 > max_ordinal {
264                return Ok(());
265            }
266
267            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
268            // are envelope_size bytes.
269            let cur_offset: usize = (3 - 1) * envelope_size;
270
271            // Zero reserved fields.
272            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
273
274            // Safety:
275            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
276            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
277            //   envelope_size bytes, there is always sufficient room.
278            fidl::encoding::encode_in_envelope_optional::<u64, D>(
279                self.relative_address
280                    .as_ref()
281                    .map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
282                encoder,
283                offset + cur_offset,
284                depth,
285            )?;
286
287            _prev_end_offset = cur_offset + envelope_size;
288
289            Ok(())
290        }
291    }
292
293    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ExecutableSegment {
294        #[inline(always)]
295        fn new_empty() -> Self {
296            Self::default()
297        }
298
299        unsafe fn decode(
300            &mut self,
301            decoder: &mut fidl::encoding::Decoder<'_, D>,
302            offset: usize,
303            mut depth: fidl::encoding::Depth,
304        ) -> fidl::Result<()> {
305            decoder.debug_check_bounds::<Self>(offset);
306            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
307                None => return Err(fidl::Error::NotNullable),
308                Some(len) => len,
309            };
310            // Calling decoder.out_of_line_offset(0) is not allowed.
311            if len == 0 {
312                return Ok(());
313            };
314            depth.increment()?;
315            let envelope_size = 8;
316            let bytes_len = len * envelope_size;
317            let offset = decoder.out_of_line_offset(bytes_len)?;
318            // Decode the envelope for each type.
319            let mut _next_ordinal_to_read = 0;
320            let mut next_offset = offset;
321            let end_offset = offset + bytes_len;
322            _next_ordinal_to_read += 1;
323            if next_offset >= end_offset {
324                return Ok(());
325            }
326
327            // Decode unknown envelopes for gaps in ordinals.
328            while _next_ordinal_to_read < 1 {
329                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
330                _next_ordinal_to_read += 1;
331                next_offset += envelope_size;
332            }
333
334            let next_out_of_line = decoder.next_out_of_line();
335            let handles_before = decoder.remaining_handles();
336            if let Some((inlined, num_bytes, num_handles)) =
337                fidl::encoding::decode_envelope_header(decoder, next_offset)?
338            {
339                let member_inline_size =
340                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
341                if inlined != (member_inline_size <= 4) {
342                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
343                }
344                let inner_offset;
345                let mut inner_depth = depth.clone();
346                if inlined {
347                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
348                    inner_offset = next_offset;
349                } else {
350                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
351                    inner_depth.increment()?;
352                }
353                let val_ref = self.start_address.get_or_insert_with(|| fidl::new_empty!(u64, D));
354                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
355                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
356                {
357                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
358                }
359                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
360                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
361                }
362            }
363
364            next_offset += envelope_size;
365            _next_ordinal_to_read += 1;
366            if next_offset >= end_offset {
367                return Ok(());
368            }
369
370            // Decode unknown envelopes for gaps in ordinals.
371            while _next_ordinal_to_read < 2 {
372                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
373                _next_ordinal_to_read += 1;
374                next_offset += envelope_size;
375            }
376
377            let next_out_of_line = decoder.next_out_of_line();
378            let handles_before = decoder.remaining_handles();
379            if let Some((inlined, num_bytes, num_handles)) =
380                fidl::encoding::decode_envelope_header(decoder, next_offset)?
381            {
382                let member_inline_size =
383                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
384                if inlined != (member_inline_size <= 4) {
385                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
386                }
387                let inner_offset;
388                let mut inner_depth = depth.clone();
389                if inlined {
390                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
391                    inner_offset = next_offset;
392                } else {
393                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
394                    inner_depth.increment()?;
395                }
396                let val_ref = self.size.get_or_insert_with(|| fidl::new_empty!(u64, D));
397                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
398                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
399                {
400                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
401                }
402                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
403                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
404                }
405            }
406
407            next_offset += envelope_size;
408            _next_ordinal_to_read += 1;
409            if next_offset >= end_offset {
410                return Ok(());
411            }
412
413            // Decode unknown envelopes for gaps in ordinals.
414            while _next_ordinal_to_read < 3 {
415                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
416                _next_ordinal_to_read += 1;
417                next_offset += envelope_size;
418            }
419
420            let next_out_of_line = decoder.next_out_of_line();
421            let handles_before = decoder.remaining_handles();
422            if let Some((inlined, num_bytes, num_handles)) =
423                fidl::encoding::decode_envelope_header(decoder, next_offset)?
424            {
425                let member_inline_size =
426                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
427                if inlined != (member_inline_size <= 4) {
428                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
429                }
430                let inner_offset;
431                let mut inner_depth = depth.clone();
432                if inlined {
433                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
434                    inner_offset = next_offset;
435                } else {
436                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
437                    inner_depth.increment()?;
438                }
439                let val_ref = self.relative_address.get_or_insert_with(|| fidl::new_empty!(u64, D));
440                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
441                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
442                {
443                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
444                }
445                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
446                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
447                }
448            }
449
450            next_offset += envelope_size;
451
452            // Decode the remaining unknown envelopes.
453            while next_offset < end_offset {
454                _next_ordinal_to_read += 1;
455                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
456                next_offset += envelope_size;
457            }
458
459            Ok(())
460        }
461    }
462
463    impl ModuleMap {
464        #[inline(always)]
465        fn max_ordinal_present(&self) -> u64 {
466            if let Some(_) = self.executable_segments {
467                return 2;
468            }
469            if let Some(_) = self.build_id {
470                return 1;
471            }
472            0
473        }
474    }
475
476    impl fidl::encoding::ValueTypeMarker for ModuleMap {
477        type Borrowed<'a> = &'a Self;
478        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
479            value
480        }
481    }
482
483    unsafe impl fidl::encoding::TypeMarker for ModuleMap {
484        type Owned = Self;
485
486        #[inline(always)]
487        fn inline_align(_context: fidl::encoding::Context) -> usize {
488            8
489        }
490
491        #[inline(always)]
492        fn inline_size(_context: fidl::encoding::Context) -> usize {
493            16
494        }
495    }
496
497    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<ModuleMap, D>
498        for &ModuleMap
499    {
500        unsafe fn encode(
501            self,
502            encoder: &mut fidl::encoding::Encoder<'_, D>,
503            offset: usize,
504            mut depth: fidl::encoding::Depth,
505        ) -> fidl::Result<()> {
506            encoder.debug_check_bounds::<ModuleMap>(offset);
507            // Vector header
508            let max_ordinal: u64 = self.max_ordinal_present();
509            encoder.write_num(max_ordinal, offset);
510            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
511            // Calling encoder.out_of_line_offset(0) is not allowed.
512            if max_ordinal == 0 {
513                return Ok(());
514            }
515            depth.increment()?;
516            let envelope_size = 8;
517            let bytes_len = max_ordinal as usize * envelope_size;
518            #[allow(unused_variables)]
519            let offset = encoder.out_of_line_offset(bytes_len);
520            let mut _prev_end_offset: usize = 0;
521            if 1 > max_ordinal {
522                return Ok(());
523            }
524
525            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
526            // are envelope_size bytes.
527            let cur_offset: usize = (1 - 1) * envelope_size;
528
529            // Zero reserved fields.
530            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
531
532            // Safety:
533            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
534            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
535            //   envelope_size bytes, there is always sufficient room.
536            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<u8, 20>, D>(
537                self.build_id.as_ref().map(
538                    <fidl::encoding::Vector<u8, 20> as fidl::encoding::ValueTypeMarker>::borrow,
539                ),
540                encoder,
541                offset + cur_offset,
542                depth,
543            )?;
544
545            _prev_end_offset = cur_offset + envelope_size;
546            if 2 > max_ordinal {
547                return Ok(());
548            }
549
550            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
551            // are envelope_size bytes.
552            let cur_offset: usize = (2 - 1) * envelope_size;
553
554            // Zero reserved fields.
555            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
556
557            // Safety:
558            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
559            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
560            //   envelope_size bytes, there is always sufficient room.
561            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<ExecutableSegment>, D>(
562            self.executable_segments.as_ref().map(<fidl::encoding::UnboundedVector<ExecutableSegment> as fidl::encoding::ValueTypeMarker>::borrow),
563            encoder, offset + cur_offset, depth
564        )?;
565
566            _prev_end_offset = cur_offset + envelope_size;
567
568            Ok(())
569        }
570    }
571
572    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ModuleMap {
573        #[inline(always)]
574        fn new_empty() -> Self {
575            Self::default()
576        }
577
578        unsafe fn decode(
579            &mut self,
580            decoder: &mut fidl::encoding::Decoder<'_, D>,
581            offset: usize,
582            mut depth: fidl::encoding::Depth,
583        ) -> fidl::Result<()> {
584            decoder.debug_check_bounds::<Self>(offset);
585            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
586                None => return Err(fidl::Error::NotNullable),
587                Some(len) => len,
588            };
589            // Calling decoder.out_of_line_offset(0) is not allowed.
590            if len == 0 {
591                return Ok(());
592            };
593            depth.increment()?;
594            let envelope_size = 8;
595            let bytes_len = len * envelope_size;
596            let offset = decoder.out_of_line_offset(bytes_len)?;
597            // Decode the envelope for each type.
598            let mut _next_ordinal_to_read = 0;
599            let mut next_offset = offset;
600            let end_offset = offset + bytes_len;
601            _next_ordinal_to_read += 1;
602            if next_offset >= end_offset {
603                return Ok(());
604            }
605
606            // Decode unknown envelopes for gaps in ordinals.
607            while _next_ordinal_to_read < 1 {
608                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
609                _next_ordinal_to_read += 1;
610                next_offset += envelope_size;
611            }
612
613            let next_out_of_line = decoder.next_out_of_line();
614            let handles_before = decoder.remaining_handles();
615            if let Some((inlined, num_bytes, num_handles)) =
616                fidl::encoding::decode_envelope_header(decoder, next_offset)?
617            {
618                let member_inline_size =
619                    <fidl::encoding::Vector<u8, 20> as fidl::encoding::TypeMarker>::inline_size(
620                        decoder.context,
621                    );
622                if inlined != (member_inline_size <= 4) {
623                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
624                }
625                let inner_offset;
626                let mut inner_depth = depth.clone();
627                if inlined {
628                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
629                    inner_offset = next_offset;
630                } else {
631                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
632                    inner_depth.increment()?;
633                }
634                let val_ref = self
635                    .build_id
636                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u8, 20>, D));
637                fidl::decode!(fidl::encoding::Vector<u8, 20>, D, val_ref, decoder, inner_offset, inner_depth)?;
638                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
639                {
640                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
641                }
642                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
643                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
644                }
645            }
646
647            next_offset += envelope_size;
648            _next_ordinal_to_read += 1;
649            if next_offset >= end_offset {
650                return Ok(());
651            }
652
653            // Decode unknown envelopes for gaps in ordinals.
654            while _next_ordinal_to_read < 2 {
655                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
656                _next_ordinal_to_read += 1;
657                next_offset += envelope_size;
658            }
659
660            let next_out_of_line = decoder.next_out_of_line();
661            let handles_before = decoder.remaining_handles();
662            if let Some((inlined, num_bytes, num_handles)) =
663                fidl::encoding::decode_envelope_header(decoder, next_offset)?
664            {
665                let member_inline_size = <fidl::encoding::UnboundedVector<ExecutableSegment> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
666                if inlined != (member_inline_size <= 4) {
667                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
668                }
669                let inner_offset;
670                let mut inner_depth = depth.clone();
671                if inlined {
672                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
673                    inner_offset = next_offset;
674                } else {
675                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
676                    inner_depth.increment()?;
677                }
678                let val_ref = self.executable_segments.get_or_insert_with(|| {
679                    fidl::new_empty!(fidl::encoding::UnboundedVector<ExecutableSegment>, D)
680                });
681                fidl::decode!(
682                    fidl::encoding::UnboundedVector<ExecutableSegment>,
683                    D,
684                    val_ref,
685                    decoder,
686                    inner_offset,
687                    inner_depth
688                )?;
689                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
690                {
691                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
692                }
693                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
694                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
695                }
696            }
697
698            next_offset += envelope_size;
699
700            // Decode the remaining unknown envelopes.
701            while next_offset < end_offset {
702                _next_ordinal_to_read += 1;
703                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
704                next_offset += envelope_size;
705            }
706
707            Ok(())
708        }
709    }
710
711    impl RecordAllocationEvent {
712        #[inline(always)]
713        fn max_ordinal_present(&self) -> u64 {
714            if let Some(_) = self.size {
715                return 3;
716            }
717            if let Some(_) = self.stack_trace {
718                return 2;
719            }
720            if let Some(_) = self.address {
721                return 1;
722            }
723            0
724        }
725    }
726
727    impl fidl::encoding::ValueTypeMarker for RecordAllocationEvent {
728        type Borrowed<'a> = &'a Self;
729        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
730            value
731        }
732    }
733
734    unsafe impl fidl::encoding::TypeMarker for RecordAllocationEvent {
735        type Owned = Self;
736
737        #[inline(always)]
738        fn inline_align(_context: fidl::encoding::Context) -> usize {
739            8
740        }
741
742        #[inline(always)]
743        fn inline_size(_context: fidl::encoding::Context) -> usize {
744            16
745        }
746    }
747
748    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<RecordAllocationEvent, D>
749        for &RecordAllocationEvent
750    {
751        unsafe fn encode(
752            self,
753            encoder: &mut fidl::encoding::Encoder<'_, D>,
754            offset: usize,
755            mut depth: fidl::encoding::Depth,
756        ) -> fidl::Result<()> {
757            encoder.debug_check_bounds::<RecordAllocationEvent>(offset);
758            // Vector header
759            let max_ordinal: u64 = self.max_ordinal_present();
760            encoder.write_num(max_ordinal, offset);
761            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
762            // Calling encoder.out_of_line_offset(0) is not allowed.
763            if max_ordinal == 0 {
764                return Ok(());
765            }
766            depth.increment()?;
767            let envelope_size = 8;
768            let bytes_len = max_ordinal as usize * envelope_size;
769            #[allow(unused_variables)]
770            let offset = encoder.out_of_line_offset(bytes_len);
771            let mut _prev_end_offset: usize = 0;
772            if 1 > max_ordinal {
773                return Ok(());
774            }
775
776            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
777            // are envelope_size bytes.
778            let cur_offset: usize = (1 - 1) * envelope_size;
779
780            // Zero reserved fields.
781            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
782
783            // Safety:
784            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
785            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
786            //   envelope_size bytes, there is always sufficient room.
787            fidl::encoding::encode_in_envelope_optional::<u64, D>(
788                self.address.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
789                encoder,
790                offset + cur_offset,
791                depth,
792            )?;
793
794            _prev_end_offset = cur_offset + envelope_size;
795            if 2 > max_ordinal {
796                return Ok(());
797            }
798
799            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
800            // are envelope_size bytes.
801            let cur_offset: usize = (2 - 1) * envelope_size;
802
803            // Zero reserved fields.
804            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
805
806            // Safety:
807            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
808            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
809            //   envelope_size bytes, there is always sufficient room.
810            fidl::encoding::encode_in_envelope_optional::<StackTrace, D>(
811                self.stack_trace
812                    .as_ref()
813                    .map(<StackTrace as fidl::encoding::ValueTypeMarker>::borrow),
814                encoder,
815                offset + cur_offset,
816                depth,
817            )?;
818
819            _prev_end_offset = cur_offset + envelope_size;
820            if 3 > max_ordinal {
821                return Ok(());
822            }
823
824            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
825            // are envelope_size bytes.
826            let cur_offset: usize = (3 - 1) * envelope_size;
827
828            // Zero reserved fields.
829            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
830
831            // Safety:
832            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
833            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
834            //   envelope_size bytes, there is always sufficient room.
835            fidl::encoding::encode_in_envelope_optional::<u64, D>(
836                self.size.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
837                encoder,
838                offset + cur_offset,
839                depth,
840            )?;
841
842            _prev_end_offset = cur_offset + envelope_size;
843
844            Ok(())
845        }
846    }
847
848    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RecordAllocationEvent {
849        #[inline(always)]
850        fn new_empty() -> Self {
851            Self::default()
852        }
853
854        unsafe fn decode(
855            &mut self,
856            decoder: &mut fidl::encoding::Decoder<'_, D>,
857            offset: usize,
858            mut depth: fidl::encoding::Depth,
859        ) -> fidl::Result<()> {
860            decoder.debug_check_bounds::<Self>(offset);
861            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
862                None => return Err(fidl::Error::NotNullable),
863                Some(len) => len,
864            };
865            // Calling decoder.out_of_line_offset(0) is not allowed.
866            if len == 0 {
867                return Ok(());
868            };
869            depth.increment()?;
870            let envelope_size = 8;
871            let bytes_len = len * envelope_size;
872            let offset = decoder.out_of_line_offset(bytes_len)?;
873            // Decode the envelope for each type.
874            let mut _next_ordinal_to_read = 0;
875            let mut next_offset = offset;
876            let end_offset = offset + bytes_len;
877            _next_ordinal_to_read += 1;
878            if next_offset >= end_offset {
879                return Ok(());
880            }
881
882            // Decode unknown envelopes for gaps in ordinals.
883            while _next_ordinal_to_read < 1 {
884                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
885                _next_ordinal_to_read += 1;
886                next_offset += envelope_size;
887            }
888
889            let next_out_of_line = decoder.next_out_of_line();
890            let handles_before = decoder.remaining_handles();
891            if let Some((inlined, num_bytes, num_handles)) =
892                fidl::encoding::decode_envelope_header(decoder, next_offset)?
893            {
894                let member_inline_size =
895                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
896                if inlined != (member_inline_size <= 4) {
897                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
898                }
899                let inner_offset;
900                let mut inner_depth = depth.clone();
901                if inlined {
902                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
903                    inner_offset = next_offset;
904                } else {
905                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
906                    inner_depth.increment()?;
907                }
908                let val_ref = self.address.get_or_insert_with(|| fidl::new_empty!(u64, D));
909                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
910                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
911                {
912                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
913                }
914                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
915                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
916                }
917            }
918
919            next_offset += envelope_size;
920            _next_ordinal_to_read += 1;
921            if next_offset >= end_offset {
922                return Ok(());
923            }
924
925            // Decode unknown envelopes for gaps in ordinals.
926            while _next_ordinal_to_read < 2 {
927                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
928                _next_ordinal_to_read += 1;
929                next_offset += envelope_size;
930            }
931
932            let next_out_of_line = decoder.next_out_of_line();
933            let handles_before = decoder.remaining_handles();
934            if let Some((inlined, num_bytes, num_handles)) =
935                fidl::encoding::decode_envelope_header(decoder, next_offset)?
936            {
937                let member_inline_size =
938                    <StackTrace as fidl::encoding::TypeMarker>::inline_size(decoder.context);
939                if inlined != (member_inline_size <= 4) {
940                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
941                }
942                let inner_offset;
943                let mut inner_depth = depth.clone();
944                if inlined {
945                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
946                    inner_offset = next_offset;
947                } else {
948                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
949                    inner_depth.increment()?;
950                }
951                let val_ref =
952                    self.stack_trace.get_or_insert_with(|| fidl::new_empty!(StackTrace, D));
953                fidl::decode!(StackTrace, D, val_ref, decoder, inner_offset, inner_depth)?;
954                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
955                {
956                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
957                }
958                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
959                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
960                }
961            }
962
963            next_offset += envelope_size;
964            _next_ordinal_to_read += 1;
965            if next_offset >= end_offset {
966                return Ok(());
967            }
968
969            // Decode unknown envelopes for gaps in ordinals.
970            while _next_ordinal_to_read < 3 {
971                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
972                _next_ordinal_to_read += 1;
973                next_offset += envelope_size;
974            }
975
976            let next_out_of_line = decoder.next_out_of_line();
977            let handles_before = decoder.remaining_handles();
978            if let Some((inlined, num_bytes, num_handles)) =
979                fidl::encoding::decode_envelope_header(decoder, next_offset)?
980            {
981                let member_inline_size =
982                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
983                if inlined != (member_inline_size <= 4) {
984                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
985                }
986                let inner_offset;
987                let mut inner_depth = depth.clone();
988                if inlined {
989                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
990                    inner_offset = next_offset;
991                } else {
992                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
993                    inner_depth.increment()?;
994                }
995                let val_ref = self.size.get_or_insert_with(|| fidl::new_empty!(u64, D));
996                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
997                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
998                {
999                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1000                }
1001                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1002                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1003                }
1004            }
1005
1006            next_offset += envelope_size;
1007
1008            // Decode the remaining unknown envelopes.
1009            while next_offset < end_offset {
1010                _next_ordinal_to_read += 1;
1011                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1012                next_offset += envelope_size;
1013            }
1014
1015            Ok(())
1016        }
1017    }
1018
1019    impl RecordDeallocationEvent {
1020        #[inline(always)]
1021        fn max_ordinal_present(&self) -> u64 {
1022            if let Some(_) = self.stack_trace {
1023                return 2;
1024            }
1025            if let Some(_) = self.address {
1026                return 1;
1027            }
1028            0
1029        }
1030    }
1031
1032    impl fidl::encoding::ValueTypeMarker for RecordDeallocationEvent {
1033        type Borrowed<'a> = &'a Self;
1034        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1035            value
1036        }
1037    }
1038
1039    unsafe impl fidl::encoding::TypeMarker for RecordDeallocationEvent {
1040        type Owned = Self;
1041
1042        #[inline(always)]
1043        fn inline_align(_context: fidl::encoding::Context) -> usize {
1044            8
1045        }
1046
1047        #[inline(always)]
1048        fn inline_size(_context: fidl::encoding::Context) -> usize {
1049            16
1050        }
1051    }
1052
1053    unsafe impl<D: fidl::encoding::ResourceDialect>
1054        fidl::encoding::Encode<RecordDeallocationEvent, D> for &RecordDeallocationEvent
1055    {
1056        unsafe fn encode(
1057            self,
1058            encoder: &mut fidl::encoding::Encoder<'_, D>,
1059            offset: usize,
1060            mut depth: fidl::encoding::Depth,
1061        ) -> fidl::Result<()> {
1062            encoder.debug_check_bounds::<RecordDeallocationEvent>(offset);
1063            // Vector header
1064            let max_ordinal: u64 = self.max_ordinal_present();
1065            encoder.write_num(max_ordinal, offset);
1066            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1067            // Calling encoder.out_of_line_offset(0) is not allowed.
1068            if max_ordinal == 0 {
1069                return Ok(());
1070            }
1071            depth.increment()?;
1072            let envelope_size = 8;
1073            let bytes_len = max_ordinal as usize * envelope_size;
1074            #[allow(unused_variables)]
1075            let offset = encoder.out_of_line_offset(bytes_len);
1076            let mut _prev_end_offset: usize = 0;
1077            if 1 > max_ordinal {
1078                return Ok(());
1079            }
1080
1081            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1082            // are envelope_size bytes.
1083            let cur_offset: usize = (1 - 1) * envelope_size;
1084
1085            // Zero reserved fields.
1086            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1087
1088            // Safety:
1089            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1090            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1091            //   envelope_size bytes, there is always sufficient room.
1092            fidl::encoding::encode_in_envelope_optional::<u64, D>(
1093                self.address.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
1094                encoder,
1095                offset + cur_offset,
1096                depth,
1097            )?;
1098
1099            _prev_end_offset = cur_offset + envelope_size;
1100            if 2 > max_ordinal {
1101                return Ok(());
1102            }
1103
1104            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1105            // are envelope_size bytes.
1106            let cur_offset: usize = (2 - 1) * envelope_size;
1107
1108            // Zero reserved fields.
1109            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1110
1111            // Safety:
1112            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1113            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1114            //   envelope_size bytes, there is always sufficient room.
1115            fidl::encoding::encode_in_envelope_optional::<StackTrace, D>(
1116                self.stack_trace
1117                    .as_ref()
1118                    .map(<StackTrace as fidl::encoding::ValueTypeMarker>::borrow),
1119                encoder,
1120                offset + cur_offset,
1121                depth,
1122            )?;
1123
1124            _prev_end_offset = cur_offset + envelope_size;
1125
1126            Ok(())
1127        }
1128    }
1129
1130    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1131        for RecordDeallocationEvent
1132    {
1133        #[inline(always)]
1134        fn new_empty() -> Self {
1135            Self::default()
1136        }
1137
1138        unsafe fn decode(
1139            &mut self,
1140            decoder: &mut fidl::encoding::Decoder<'_, D>,
1141            offset: usize,
1142            mut depth: fidl::encoding::Depth,
1143        ) -> fidl::Result<()> {
1144            decoder.debug_check_bounds::<Self>(offset);
1145            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1146                None => return Err(fidl::Error::NotNullable),
1147                Some(len) => len,
1148            };
1149            // Calling decoder.out_of_line_offset(0) is not allowed.
1150            if len == 0 {
1151                return Ok(());
1152            };
1153            depth.increment()?;
1154            let envelope_size = 8;
1155            let bytes_len = len * envelope_size;
1156            let offset = decoder.out_of_line_offset(bytes_len)?;
1157            // Decode the envelope for each type.
1158            let mut _next_ordinal_to_read = 0;
1159            let mut next_offset = offset;
1160            let end_offset = offset + bytes_len;
1161            _next_ordinal_to_read += 1;
1162            if next_offset >= end_offset {
1163                return Ok(());
1164            }
1165
1166            // Decode unknown envelopes for gaps in ordinals.
1167            while _next_ordinal_to_read < 1 {
1168                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1169                _next_ordinal_to_read += 1;
1170                next_offset += envelope_size;
1171            }
1172
1173            let next_out_of_line = decoder.next_out_of_line();
1174            let handles_before = decoder.remaining_handles();
1175            if let Some((inlined, num_bytes, num_handles)) =
1176                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1177            {
1178                let member_inline_size =
1179                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1180                if inlined != (member_inline_size <= 4) {
1181                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1182                }
1183                let inner_offset;
1184                let mut inner_depth = depth.clone();
1185                if inlined {
1186                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1187                    inner_offset = next_offset;
1188                } else {
1189                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1190                    inner_depth.increment()?;
1191                }
1192                let val_ref = self.address.get_or_insert_with(|| fidl::new_empty!(u64, D));
1193                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
1194                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1195                {
1196                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1197                }
1198                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1199                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1200                }
1201            }
1202
1203            next_offset += envelope_size;
1204            _next_ordinal_to_read += 1;
1205            if next_offset >= end_offset {
1206                return Ok(());
1207            }
1208
1209            // Decode unknown envelopes for gaps in ordinals.
1210            while _next_ordinal_to_read < 2 {
1211                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1212                _next_ordinal_to_read += 1;
1213                next_offset += envelope_size;
1214            }
1215
1216            let next_out_of_line = decoder.next_out_of_line();
1217            let handles_before = decoder.remaining_handles();
1218            if let Some((inlined, num_bytes, num_handles)) =
1219                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1220            {
1221                let member_inline_size =
1222                    <StackTrace as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1223                if inlined != (member_inline_size <= 4) {
1224                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1225                }
1226                let inner_offset;
1227                let mut inner_depth = depth.clone();
1228                if inlined {
1229                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1230                    inner_offset = next_offset;
1231                } else {
1232                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1233                    inner_depth.increment()?;
1234                }
1235                let val_ref =
1236                    self.stack_trace.get_or_insert_with(|| fidl::new_empty!(StackTrace, D));
1237                fidl::decode!(StackTrace, D, val_ref, decoder, inner_offset, inner_depth)?;
1238                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1239                {
1240                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1241                }
1242                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1243                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1244                }
1245            }
1246
1247            next_offset += envelope_size;
1248
1249            // Decode the remaining unknown envelopes.
1250            while next_offset < end_offset {
1251                _next_ordinal_to_read += 1;
1252                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1253                next_offset += envelope_size;
1254            }
1255
1256            Ok(())
1257        }
1258    }
1259
1260    impl SamplerSetProcessInfoRequest {
1261        #[inline(always)]
1262        fn max_ordinal_present(&self) -> u64 {
1263            if let Some(_) = self.module_map {
1264                return 2;
1265            }
1266            if let Some(_) = self.process_name {
1267                return 1;
1268            }
1269            0
1270        }
1271    }
1272
1273    impl fidl::encoding::ValueTypeMarker for SamplerSetProcessInfoRequest {
1274        type Borrowed<'a> = &'a Self;
1275        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1276            value
1277        }
1278    }
1279
1280    unsafe impl fidl::encoding::TypeMarker for SamplerSetProcessInfoRequest {
1281        type Owned = Self;
1282
1283        #[inline(always)]
1284        fn inline_align(_context: fidl::encoding::Context) -> usize {
1285            8
1286        }
1287
1288        #[inline(always)]
1289        fn inline_size(_context: fidl::encoding::Context) -> usize {
1290            16
1291        }
1292    }
1293
1294    unsafe impl<D: fidl::encoding::ResourceDialect>
1295        fidl::encoding::Encode<SamplerSetProcessInfoRequest, D> for &SamplerSetProcessInfoRequest
1296    {
1297        unsafe fn encode(
1298            self,
1299            encoder: &mut fidl::encoding::Encoder<'_, D>,
1300            offset: usize,
1301            mut depth: fidl::encoding::Depth,
1302        ) -> fidl::Result<()> {
1303            encoder.debug_check_bounds::<SamplerSetProcessInfoRequest>(offset);
1304            // Vector header
1305            let max_ordinal: u64 = self.max_ordinal_present();
1306            encoder.write_num(max_ordinal, offset);
1307            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1308            // Calling encoder.out_of_line_offset(0) is not allowed.
1309            if max_ordinal == 0 {
1310                return Ok(());
1311            }
1312            depth.increment()?;
1313            let envelope_size = 8;
1314            let bytes_len = max_ordinal as usize * envelope_size;
1315            #[allow(unused_variables)]
1316            let offset = encoder.out_of_line_offset(bytes_len);
1317            let mut _prev_end_offset: usize = 0;
1318            if 1 > max_ordinal {
1319                return Ok(());
1320            }
1321
1322            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1323            // are envelope_size bytes.
1324            let cur_offset: usize = (1 - 1) * envelope_size;
1325
1326            // Zero reserved fields.
1327            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1328
1329            // Safety:
1330            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1331            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1332            //   envelope_size bytes, there is always sufficient room.
1333            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<32>, D>(
1334                self.process_name.as_ref().map(
1335                    <fidl::encoding::BoundedString<32> as fidl::encoding::ValueTypeMarker>::borrow,
1336                ),
1337                encoder,
1338                offset + cur_offset,
1339                depth,
1340            )?;
1341
1342            _prev_end_offset = cur_offset + envelope_size;
1343            if 2 > max_ordinal {
1344                return Ok(());
1345            }
1346
1347            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1348            // are envelope_size bytes.
1349            let cur_offset: usize = (2 - 1) * envelope_size;
1350
1351            // Zero reserved fields.
1352            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1353
1354            // Safety:
1355            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1356            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1357            //   envelope_size bytes, there is always sufficient room.
1358            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<ModuleMap>, D>(
1359            self.module_map.as_ref().map(<fidl::encoding::UnboundedVector<ModuleMap> as fidl::encoding::ValueTypeMarker>::borrow),
1360            encoder, offset + cur_offset, depth
1361        )?;
1362
1363            _prev_end_offset = cur_offset + envelope_size;
1364
1365            Ok(())
1366        }
1367    }
1368
1369    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1370        for SamplerSetProcessInfoRequest
1371    {
1372        #[inline(always)]
1373        fn new_empty() -> Self {
1374            Self::default()
1375        }
1376
1377        unsafe fn decode(
1378            &mut self,
1379            decoder: &mut fidl::encoding::Decoder<'_, D>,
1380            offset: usize,
1381            mut depth: fidl::encoding::Depth,
1382        ) -> fidl::Result<()> {
1383            decoder.debug_check_bounds::<Self>(offset);
1384            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1385                None => return Err(fidl::Error::NotNullable),
1386                Some(len) => len,
1387            };
1388            // Calling decoder.out_of_line_offset(0) is not allowed.
1389            if len == 0 {
1390                return Ok(());
1391            };
1392            depth.increment()?;
1393            let envelope_size = 8;
1394            let bytes_len = len * envelope_size;
1395            let offset = decoder.out_of_line_offset(bytes_len)?;
1396            // Decode the envelope for each type.
1397            let mut _next_ordinal_to_read = 0;
1398            let mut next_offset = offset;
1399            let end_offset = offset + bytes_len;
1400            _next_ordinal_to_read += 1;
1401            if next_offset >= end_offset {
1402                return Ok(());
1403            }
1404
1405            // Decode unknown envelopes for gaps in ordinals.
1406            while _next_ordinal_to_read < 1 {
1407                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1408                _next_ordinal_to_read += 1;
1409                next_offset += envelope_size;
1410            }
1411
1412            let next_out_of_line = decoder.next_out_of_line();
1413            let handles_before = decoder.remaining_handles();
1414            if let Some((inlined, num_bytes, num_handles)) =
1415                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1416            {
1417                let member_inline_size =
1418                    <fidl::encoding::BoundedString<32> as fidl::encoding::TypeMarker>::inline_size(
1419                        decoder.context,
1420                    );
1421                if inlined != (member_inline_size <= 4) {
1422                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1423                }
1424                let inner_offset;
1425                let mut inner_depth = depth.clone();
1426                if inlined {
1427                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1428                    inner_offset = next_offset;
1429                } else {
1430                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1431                    inner_depth.increment()?;
1432                }
1433                let val_ref = self
1434                    .process_name
1435                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<32>, D));
1436                fidl::decode!(
1437                    fidl::encoding::BoundedString<32>,
1438                    D,
1439                    val_ref,
1440                    decoder,
1441                    inner_offset,
1442                    inner_depth
1443                )?;
1444                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1445                {
1446                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1447                }
1448                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1449                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1450                }
1451            }
1452
1453            next_offset += envelope_size;
1454            _next_ordinal_to_read += 1;
1455            if next_offset >= end_offset {
1456                return Ok(());
1457            }
1458
1459            // Decode unknown envelopes for gaps in ordinals.
1460            while _next_ordinal_to_read < 2 {
1461                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1462                _next_ordinal_to_read += 1;
1463                next_offset += envelope_size;
1464            }
1465
1466            let next_out_of_line = decoder.next_out_of_line();
1467            let handles_before = decoder.remaining_handles();
1468            if let Some((inlined, num_bytes, num_handles)) =
1469                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1470            {
1471                let member_inline_size = <fidl::encoding::UnboundedVector<ModuleMap> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1472                if inlined != (member_inline_size <= 4) {
1473                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1474                }
1475                let inner_offset;
1476                let mut inner_depth = depth.clone();
1477                if inlined {
1478                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1479                    inner_offset = next_offset;
1480                } else {
1481                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1482                    inner_depth.increment()?;
1483                }
1484                let val_ref = self.module_map.get_or_insert_with(|| {
1485                    fidl::new_empty!(fidl::encoding::UnboundedVector<ModuleMap>, D)
1486                });
1487                fidl::decode!(
1488                    fidl::encoding::UnboundedVector<ModuleMap>,
1489                    D,
1490                    val_ref,
1491                    decoder,
1492                    inner_offset,
1493                    inner_depth
1494                )?;
1495                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1496                {
1497                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1498                }
1499                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1500                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1501                }
1502            }
1503
1504            next_offset += envelope_size;
1505
1506            // Decode the remaining unknown envelopes.
1507            while next_offset < end_offset {
1508                _next_ordinal_to_read += 1;
1509                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1510                next_offset += envelope_size;
1511            }
1512
1513            Ok(())
1514        }
1515    }
1516
1517    impl StackTrace {
1518        #[inline(always)]
1519        fn max_ordinal_present(&self) -> u64 {
1520            if let Some(_) = self.stack_frames {
1521                return 1;
1522            }
1523            0
1524        }
1525    }
1526
1527    impl fidl::encoding::ValueTypeMarker for StackTrace {
1528        type Borrowed<'a> = &'a Self;
1529        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1530            value
1531        }
1532    }
1533
1534    unsafe impl fidl::encoding::TypeMarker for StackTrace {
1535        type Owned = Self;
1536
1537        #[inline(always)]
1538        fn inline_align(_context: fidl::encoding::Context) -> usize {
1539            8
1540        }
1541
1542        #[inline(always)]
1543        fn inline_size(_context: fidl::encoding::Context) -> usize {
1544            16
1545        }
1546    }
1547
1548    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<StackTrace, D>
1549        for &StackTrace
1550    {
1551        unsafe fn encode(
1552            self,
1553            encoder: &mut fidl::encoding::Encoder<'_, D>,
1554            offset: usize,
1555            mut depth: fidl::encoding::Depth,
1556        ) -> fidl::Result<()> {
1557            encoder.debug_check_bounds::<StackTrace>(offset);
1558            // Vector header
1559            let max_ordinal: u64 = self.max_ordinal_present();
1560            encoder.write_num(max_ordinal, offset);
1561            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1562            // Calling encoder.out_of_line_offset(0) is not allowed.
1563            if max_ordinal == 0 {
1564                return Ok(());
1565            }
1566            depth.increment()?;
1567            let envelope_size = 8;
1568            let bytes_len = max_ordinal as usize * envelope_size;
1569            #[allow(unused_variables)]
1570            let offset = encoder.out_of_line_offset(bytes_len);
1571            let mut _prev_end_offset: usize = 0;
1572            if 1 > max_ordinal {
1573                return Ok(());
1574            }
1575
1576            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1577            // are envelope_size bytes.
1578            let cur_offset: usize = (1 - 1) * envelope_size;
1579
1580            // Zero reserved fields.
1581            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1582
1583            // Safety:
1584            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1585            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1586            //   envelope_size bytes, there is always sufficient room.
1587            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<u64>, D>(
1588            self.stack_frames.as_ref().map(<fidl::encoding::UnboundedVector<u64> as fidl::encoding::ValueTypeMarker>::borrow),
1589            encoder, offset + cur_offset, depth
1590        )?;
1591
1592            _prev_end_offset = cur_offset + envelope_size;
1593
1594            Ok(())
1595        }
1596    }
1597
1598    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for StackTrace {
1599        #[inline(always)]
1600        fn new_empty() -> Self {
1601            Self::default()
1602        }
1603
1604        unsafe fn decode(
1605            &mut self,
1606            decoder: &mut fidl::encoding::Decoder<'_, D>,
1607            offset: usize,
1608            mut depth: fidl::encoding::Depth,
1609        ) -> fidl::Result<()> {
1610            decoder.debug_check_bounds::<Self>(offset);
1611            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1612                None => return Err(fidl::Error::NotNullable),
1613                Some(len) => len,
1614            };
1615            // Calling decoder.out_of_line_offset(0) is not allowed.
1616            if len == 0 {
1617                return Ok(());
1618            };
1619            depth.increment()?;
1620            let envelope_size = 8;
1621            let bytes_len = len * envelope_size;
1622            let offset = decoder.out_of_line_offset(bytes_len)?;
1623            // Decode the envelope for each type.
1624            let mut _next_ordinal_to_read = 0;
1625            let mut next_offset = offset;
1626            let end_offset = offset + bytes_len;
1627            _next_ordinal_to_read += 1;
1628            if next_offset >= end_offset {
1629                return Ok(());
1630            }
1631
1632            // Decode unknown envelopes for gaps in ordinals.
1633            while _next_ordinal_to_read < 1 {
1634                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1635                _next_ordinal_to_read += 1;
1636                next_offset += envelope_size;
1637            }
1638
1639            let next_out_of_line = decoder.next_out_of_line();
1640            let handles_before = decoder.remaining_handles();
1641            if let Some((inlined, num_bytes, num_handles)) =
1642                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1643            {
1644                let member_inline_size = <fidl::encoding::UnboundedVector<u64> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1645                if inlined != (member_inline_size <= 4) {
1646                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1647                }
1648                let inner_offset;
1649                let mut inner_depth = depth.clone();
1650                if inlined {
1651                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1652                    inner_offset = next_offset;
1653                } else {
1654                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1655                    inner_depth.increment()?;
1656                }
1657                let val_ref = self.stack_frames.get_or_insert_with(|| {
1658                    fidl::new_empty!(fidl::encoding::UnboundedVector<u64>, D)
1659                });
1660                fidl::decode!(
1661                    fidl::encoding::UnboundedVector<u64>,
1662                    D,
1663                    val_ref,
1664                    decoder,
1665                    inner_offset,
1666                    inner_depth
1667                )?;
1668                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1669                {
1670                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1671                }
1672                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1673                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1674                }
1675            }
1676
1677            next_offset += envelope_size;
1678
1679            // Decode the remaining unknown envelopes.
1680            while next_offset < end_offset {
1681                _next_ordinal_to_read += 1;
1682                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1683                next_offset += envelope_size;
1684            }
1685
1686            Ok(())
1687        }
1688    }
1689
1690    impl fidl::encoding::ValueTypeMarker for SamplerDatagram {
1691        type Borrowed<'a> = &'a Self;
1692        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1693            value
1694        }
1695    }
1696
1697    unsafe impl fidl::encoding::TypeMarker for SamplerDatagram {
1698        type Owned = Self;
1699
1700        #[inline(always)]
1701        fn inline_align(_context: fidl::encoding::Context) -> usize {
1702            8
1703        }
1704
1705        #[inline(always)]
1706        fn inline_size(_context: fidl::encoding::Context) -> usize {
1707            16
1708        }
1709    }
1710
1711    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SamplerDatagram, D>
1712        for &SamplerDatagram
1713    {
1714        #[inline]
1715        unsafe fn encode(
1716            self,
1717            encoder: &mut fidl::encoding::Encoder<'_, D>,
1718            offset: usize,
1719            _depth: fidl::encoding::Depth,
1720        ) -> fidl::Result<()> {
1721            encoder.debug_check_bounds::<SamplerDatagram>(offset);
1722            encoder.write_num::<u64>(self.ordinal(), offset);
1723            match self {
1724                SamplerDatagram::RecordAllocation(ref val) => {
1725                    fidl::encoding::encode_in_envelope::<RecordAllocationEvent, D>(
1726                        <RecordAllocationEvent as fidl::encoding::ValueTypeMarker>::borrow(val),
1727                        encoder,
1728                        offset + 8,
1729                        _depth,
1730                    )
1731                }
1732                SamplerDatagram::RecordDeallocation(ref val) => {
1733                    fidl::encoding::encode_in_envelope::<RecordDeallocationEvent, D>(
1734                        <RecordDeallocationEvent as fidl::encoding::ValueTypeMarker>::borrow(val),
1735                        encoder,
1736                        offset + 8,
1737                        _depth,
1738                    )
1739                }
1740                SamplerDatagram::__SourceBreaking { .. } => Err(fidl::Error::UnknownUnionTag),
1741            }
1742        }
1743    }
1744
1745    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SamplerDatagram {
1746        #[inline(always)]
1747        fn new_empty() -> Self {
1748            Self::__SourceBreaking { unknown_ordinal: 0 }
1749        }
1750
1751        #[inline]
1752        unsafe fn decode(
1753            &mut self,
1754            decoder: &mut fidl::encoding::Decoder<'_, D>,
1755            offset: usize,
1756            mut depth: fidl::encoding::Depth,
1757        ) -> fidl::Result<()> {
1758            decoder.debug_check_bounds::<Self>(offset);
1759            #[allow(unused_variables)]
1760            let next_out_of_line = decoder.next_out_of_line();
1761            let handles_before = decoder.remaining_handles();
1762            let (ordinal, inlined, num_bytes, num_handles) =
1763                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
1764
1765            let member_inline_size = match ordinal {
1766                1 => <RecordAllocationEvent as fidl::encoding::TypeMarker>::inline_size(
1767                    decoder.context,
1768                ),
1769                2 => <RecordDeallocationEvent as fidl::encoding::TypeMarker>::inline_size(
1770                    decoder.context,
1771                ),
1772                0 => return Err(fidl::Error::UnknownUnionTag),
1773                _ => num_bytes as usize,
1774            };
1775
1776            if inlined != (member_inline_size <= 4) {
1777                return Err(fidl::Error::InvalidInlineBitInEnvelope);
1778            }
1779            let _inner_offset;
1780            if inlined {
1781                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
1782                _inner_offset = offset + 8;
1783            } else {
1784                depth.increment()?;
1785                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1786            }
1787            match ordinal {
1788                1 => {
1789                    #[allow(irrefutable_let_patterns)]
1790                    if let SamplerDatagram::RecordAllocation(_) = self {
1791                        // Do nothing, read the value into the object
1792                    } else {
1793                        // Initialize `self` to the right variant
1794                        *self = SamplerDatagram::RecordAllocation(fidl::new_empty!(
1795                            RecordAllocationEvent,
1796                            D
1797                        ));
1798                    }
1799                    #[allow(irrefutable_let_patterns)]
1800                    if let SamplerDatagram::RecordAllocation(ref mut val) = self {
1801                        fidl::decode!(
1802                            RecordAllocationEvent,
1803                            D,
1804                            val,
1805                            decoder,
1806                            _inner_offset,
1807                            depth
1808                        )?;
1809                    } else {
1810                        unreachable!()
1811                    }
1812                }
1813                2 => {
1814                    #[allow(irrefutable_let_patterns)]
1815                    if let SamplerDatagram::RecordDeallocation(_) = self {
1816                        // Do nothing, read the value into the object
1817                    } else {
1818                        // Initialize `self` to the right variant
1819                        *self = SamplerDatagram::RecordDeallocation(fidl::new_empty!(
1820                            RecordDeallocationEvent,
1821                            D
1822                        ));
1823                    }
1824                    #[allow(irrefutable_let_patterns)]
1825                    if let SamplerDatagram::RecordDeallocation(ref mut val) = self {
1826                        fidl::decode!(
1827                            RecordDeallocationEvent,
1828                            D,
1829                            val,
1830                            decoder,
1831                            _inner_offset,
1832                            depth
1833                        )?;
1834                    } else {
1835                        unreachable!()
1836                    }
1837                }
1838                #[allow(deprecated)]
1839                ordinal => {
1840                    for _ in 0..num_handles {
1841                        decoder.drop_next_handle()?;
1842                    }
1843                    *self = SamplerDatagram::__SourceBreaking { unknown_ordinal: ordinal };
1844                }
1845            }
1846            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
1847                return Err(fidl::Error::InvalidNumBytesInEnvelope);
1848            }
1849            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1850                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1851            }
1852            Ok(())
1853        }
1854    }
1855}