mirror of
				https://github.com/bspeice/capnp_cookbook_2
				synced 2025-10-31 01:10:27 -04:00 
			
		
		
		
	Update main.rs to move messages across threads
This commit is contained in:
		
							
								
								
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -12,7 +12,7 @@ dependencies = [ | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "capnp_cookbook_1" | ||||
| name = "capnp_cookbook_2" | ||||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "capnp 0.8.14 (registry+https://github.com/rust-lang/crates.io-index)", | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| [package] | ||||
| name = "capnp_cookbook_1" | ||||
| name = "capnp_cookbook_2" | ||||
| version = "0.1.0" | ||||
| authors = ["Bradlee Speice <bspeice@kcg.com>"] | ||||
|  | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								src/.main.rs.swp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/.main.rs.swp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										44
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								src/main.rs
									
									
									
									
									
								
							| @ -1,57 +1,45 @@ | ||||
| // Note that we use `capnp` here, NOT `capnpc` | ||||
| extern crate capnp; | ||||
|  | ||||
| // We create a module here to define how we are to access the code | ||||
| // being included. | ||||
| pub mod point_capnp { | ||||
|     // The environment variable OUT_DIR is set by Cargo, and | ||||
|     // is the location of all the code that was built as part | ||||
|     // of the codegen step. | ||||
|     // point_capnp.rs is the actual file to include | ||||
|     include!(concat!(env!("OUT_DIR"), "/point_capnp.rs")); | ||||
| } | ||||
|  | ||||
| fn main() { | ||||
|  | ||||
|     // The process of building a Cap'N Proto message is a bit tedious. | ||||
|     // We start by creating a generic Builder; it acts as the message | ||||
|     // container that we'll later be filling with content of our `Point` | ||||
|     let mut builder = capnp::message::Builder::new_default(); | ||||
|  | ||||
|     // Because we need a mutable reference to the `builder` later, | ||||
|     // we fence off this part of the code to allow sequential mutable | ||||
|     // borrows. As I understand it, non-lexical lifetimes: | ||||
|     // https://github.com/rust-lang/rust-roadmap/issues/16 | ||||
|     // will make this no longer necessary | ||||
|     { | ||||
|         // And now we can set up the actual message we're trying to create | ||||
|         let mut point_msg = builder.init_root::<point_capnp::point::Builder>(); | ||||
|  | ||||
|         // Stuff our message with some content | ||||
|         point_msg.set_x(12); | ||||
|  | ||||
|         point_msg.set_y(14); | ||||
|     } | ||||
|  | ||||
|     // It's now time to serialize our message to binary. Let's set up a buffer for that: | ||||
|     let mut buffer = Vec::new(); | ||||
|  | ||||
|     // And actually fill that buffer with our data | ||||
|     capnp::serialize::write_message(&mut buffer, &builder).unwrap(); | ||||
|  | ||||
|     // Finally, let's deserialize the data | ||||
|     let deserialized = capnp::serialize::read_message( | ||||
|         &mut buffer.as_slice(), | ||||
|         capnp::message::ReaderOptions::new() | ||||
|     ).unwrap(); | ||||
|  | ||||
|     // `deserialized` is currently a generic reader; it understands | ||||
|     // the content of the message we gave it (i.e. that there are two | ||||
|     // int32 values) but doesn't really know what they represent (the Point). | ||||
|     // This is where we map the generic data back into our schema. | ||||
|     let point_reader = deserialized.get_root::<point_capnp::point::Reader>().unwrap(); | ||||
|     let point_reader: capnp::message::TypedReader<capnp::serialize::OwnedSegments, point_capnp::point::Owned> = | ||||
| 		capnp::message::TypedReader::new(deserialized); | ||||
|  | ||||
|     // We can now get our x and y values back, and make sure they match | ||||
|     assert_eq!(point_reader.get_x(), 12); | ||||
|     assert_eq!(point_reader.get_y(), 14); | ||||
| 	// Because the point_reader is now working with OwnedSegments (which are owned vectors) and an Owned message | ||||
| 	// (which is 'static lifetime), this is now safe | ||||
|     let handle = std::thread::spawn(move || { | ||||
|  | ||||
|         // The point_reader owns its data, and we use .get() to retrieve the actual point_capnp::point::Reader | ||||
| 		// object from it | ||||
| 		let point_root = point_reader.get().unwrap(); | ||||
|  | ||||
|         assert_eq!(point_root.get_x(), 12); | ||||
|  | ||||
|         assert_eq!(point_root.get_y(), 14); | ||||
|     }); | ||||
|  | ||||
|     handle.join().unwrap(); | ||||
| } | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -0,0 +1,135 @@ | ||||
| // Generated by the capnpc-rust plugin to the Cap'n Proto schema compiler. | ||||
| // DO NOT EDIT. | ||||
| // source: point.capnp | ||||
|  | ||||
|  | ||||
| pub mod point { | ||||
|   #[derive(Copy, Clone)] | ||||
|   pub struct Owned; | ||||
|   impl <'a> ::capnp::traits::Owned<'a> for Owned { type Reader = Reader<'a>; type Builder = Builder<'a>; } | ||||
|   impl <'a> ::capnp::traits::OwnedStruct<'a> for Owned { type Reader = Reader<'a>; type Builder = Builder<'a>; } | ||||
|   impl ::capnp::traits::Pipelined for Owned { type Pipeline = Pipeline; } | ||||
|  | ||||
|   #[derive(Clone, Copy)] | ||||
|   pub struct Reader<'a> { reader: ::capnp::private::layout::StructReader<'a> } | ||||
|  | ||||
|   impl <'a,> ::capnp::traits::HasTypeId for Reader<'a,>  { | ||||
|     #[inline] | ||||
|     fn type_id() -> u64 { _private::TYPE_ID } | ||||
|   } | ||||
|   impl <'a,> ::capnp::traits::FromStructReader<'a> for Reader<'a,>  { | ||||
|     fn new(reader: ::capnp::private::layout::StructReader<'a>) -> Reader<'a,> { | ||||
|       Reader { reader: reader,  } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   impl <'a,> ::capnp::traits::FromPointerReader<'a> for Reader<'a,>  { | ||||
|     fn get_from_pointer(reader: &::capnp::private::layout::PointerReader<'a>) -> ::capnp::Result<Reader<'a,>> { | ||||
|       ::std::result::Result::Ok(::capnp::traits::FromStructReader::new(try!(reader.get_struct(::std::ptr::null())))) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   impl <'a,> ::capnp::traits::Imbue<'a> for Reader<'a,>  { | ||||
|     fn imbue(&mut self, cap_table: &'a ::capnp::private::layout::CapTable) { | ||||
|       self.reader.imbue(::capnp::private::layout::CapTableReader::Plain(cap_table)) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   impl <'a,> Reader<'a,>  { | ||||
|     pub fn borrow<'b>(&'b self) -> Reader<'b,> { | ||||
|       Reader { .. *self } | ||||
|     } | ||||
|  | ||||
|     pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> { | ||||
|       self.reader.total_size() | ||||
|     } | ||||
|     #[inline] | ||||
|     pub fn get_x(self) -> i32 { | ||||
|       self.reader.get_data_field::<i32>(0) | ||||
|     } | ||||
|     #[inline] | ||||
|     pub fn get_y(self) -> i32 { | ||||
|       self.reader.get_data_field::<i32>(1) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   pub struct Builder<'a> { builder: ::capnp::private::layout::StructBuilder<'a> } | ||||
|   impl <'a,> ::capnp::traits::HasStructSize for Builder<'a,>  { | ||||
|     #[inline] | ||||
|     fn struct_size() -> ::capnp::private::layout::StructSize { _private::STRUCT_SIZE } | ||||
|   } | ||||
|   impl <'a,> ::capnp::traits::HasTypeId for Builder<'a,>  { | ||||
|     #[inline] | ||||
|     fn type_id() -> u64 { _private::TYPE_ID } | ||||
|   } | ||||
|   impl <'a,> ::capnp::traits::FromStructBuilder<'a> for Builder<'a,>  { | ||||
|     fn new(builder: ::capnp::private::layout::StructBuilder<'a>) -> Builder<'a, > { | ||||
|       Builder { builder: builder,  } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   impl <'a,> ::capnp::traits::ImbueMut<'a> for Builder<'a,>  { | ||||
|     fn imbue_mut(&mut self, cap_table: &'a mut ::capnp::private::layout::CapTable) { | ||||
|       self.builder.imbue(::capnp::private::layout::CapTableBuilder::Plain(cap_table)) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   impl <'a,> ::capnp::traits::FromPointerBuilder<'a> for Builder<'a,>  { | ||||
|     fn init_pointer(builder: ::capnp::private::layout::PointerBuilder<'a>, _size: u32) -> Builder<'a,> { | ||||
|       ::capnp::traits::FromStructBuilder::new(builder.init_struct(_private::STRUCT_SIZE)) | ||||
|     } | ||||
|     fn get_from_pointer(builder: ::capnp::private::layout::PointerBuilder<'a>) -> ::capnp::Result<Builder<'a,>> { | ||||
|       ::std::result::Result::Ok(::capnp::traits::FromStructBuilder::new(try!(builder.get_struct(_private::STRUCT_SIZE, ::std::ptr::null())))) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   impl <'a,> ::capnp::traits::SetPointerBuilder<Builder<'a,>> for Reader<'a,>  { | ||||
|     fn set_pointer_builder<'b>(pointer: ::capnp::private::layout::PointerBuilder<'b>, value: Reader<'a,>) -> ::capnp::Result<()> { pointer.set_struct(&value.reader) } | ||||
|   } | ||||
|  | ||||
|   impl <'a,> Builder<'a,>  { | ||||
|     pub fn as_reader(self) -> Reader<'a,> { | ||||
|       ::capnp::traits::FromStructReader::new(self.builder.as_reader()) | ||||
|     } | ||||
|     pub fn borrow<'b>(&'b mut self) -> Builder<'b,> { | ||||
|       Builder { .. *self } | ||||
|     } | ||||
|     pub fn borrow_as_reader<'b>(&'b self) -> Reader<'b,> { | ||||
|       ::capnp::traits::FromStructReader::new(self.builder.as_reader()) | ||||
|     } | ||||
|  | ||||
|     pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> { | ||||
|       self.builder.as_reader().total_size() | ||||
|     } | ||||
|     #[inline] | ||||
|     pub fn get_x(self) -> i32 { | ||||
|       self.builder.get_data_field::<i32>(0) | ||||
|     } | ||||
|     #[inline] | ||||
|     pub fn set_x(&mut self, value: i32)  { | ||||
|       self.builder.set_data_field::<i32>(0, value); | ||||
|     } | ||||
|     #[inline] | ||||
|     pub fn get_y(self) -> i32 { | ||||
|       self.builder.get_data_field::<i32>(1) | ||||
|     } | ||||
|     #[inline] | ||||
|     pub fn set_y(&mut self, value: i32)  { | ||||
|       self.builder.set_data_field::<i32>(1, value); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   pub struct Pipeline { _typeless: ::capnp::any_pointer::Pipeline } | ||||
|   impl ::capnp::capability::FromTypelessPipeline for Pipeline { | ||||
|     fn new(typeless: ::capnp::any_pointer::Pipeline) -> Pipeline { | ||||
|       Pipeline { _typeless: typeless,  } | ||||
|     } | ||||
|   } | ||||
|   impl Pipeline  { | ||||
|   } | ||||
|   mod _private { | ||||
|     use capnp::private::layout; | ||||
|     pub const STRUCT_SIZE: layout::StructSize = layout::StructSize { data: 1, pointers: 0 }; | ||||
|     pub const TYPE_ID: u64 = 0x9571424bb794dcc2; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								target/debug/build/capnp_cookbook_2-d0e48217513814f8/build-script-build
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								target/debug/build/capnp_cookbook_2-d0e48217513814f8/build-script-build
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								target/debug/capnp_cookbook_2
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								target/debug/capnp_cookbook_2
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										1
									
								
								target/debug/capnp_cookbook_2.d
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								target/debug/capnp_cookbook_2.d
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| /home/bspeice/Development/capnp_cookbook_2/target/debug/capnp_cookbook_2: /home/bspeice/Development/capnp_cookbook_2/src/main.rs /home/bspeice/Development/capnp_cookbook_2/target/debug/build/capnp_cookbook_2-a0bfc56364380222/out/point_capnp.rs /home/bspeice/Development/capnp_cookbook_2/build.rs | ||||
		Reference in New Issue
	
	Block a user
	 Bradlee Speice
					Bradlee Speice