forked from M-Labs/artiq
1
0
Fork 0

firmware: optimize integer array/list rpc

This commit is contained in:
pca006132 2021-01-21 12:16:14 +08:00 committed by David Nadlinger
parent c229e76d07
commit 3832b261b1
1 changed files with 12 additions and 16 deletions

View File

@ -204,21 +204,19 @@ unsafe fn send_value<W>(writer: &mut W, tag: Tag, data: &mut *const ())
let mut data = (*ptr).elements; let mut data = (*ptr).elements;
writer.write_u8(tag.as_u8())?; writer.write_u8(tag.as_u8())?;
match tag { match tag {
// we cannot use NetworkEndian::from_slice_i32 as the data is not mutable,
// and that is not needed as the data is already in network endian
Tag::Bool => { Tag::Bool => {
let slice = slice::from_raw_parts(data as *const u8, length); let slice = slice::from_raw_parts(data as *const u8, length);
writer.write_all(slice)?; writer.write_all(slice)?;
}, },
Tag::Int32 => { Tag::Int32 => {
let slice = slice::from_raw_parts(data as *const u32, length); let slice = slice::from_raw_parts(data as *const u8, length * 4);
for v in slice.iter() { writer.write_all(slice)?;
writer.write_u32(*v)?;
}
}, },
Tag::Int64 | Tag::Float64 => { Tag::Int64 | Tag::Float64 => {
let slice = slice::from_raw_parts(data as *const u64, length); let slice = slice::from_raw_parts(data as *const u8, length * 8);
for v in slice.iter() { writer.write_all(slice)?;
writer.write_u64(*v)?;
}
}, },
_ => { _ => {
for _ in 0..length { for _ in 0..length {
@ -245,21 +243,19 @@ unsafe fn send_value<W>(writer: &mut W, tag: Tag, data: &mut *const ())
let mut data = *buffer; let mut data = *buffer;
writer.write_u8(elt_tag.as_u8())?; writer.write_u8(elt_tag.as_u8())?;
match elt_tag { match elt_tag {
// we cannot use NetworkEndian::from_slice_i32 as the data is not mutable,
// and that is not needed as the data is already in network endian
Tag::Bool => { Tag::Bool => {
let slice = slice::from_raw_parts(data as *const u8, length); let slice = slice::from_raw_parts(data as *const u8, length);
writer.write_all(slice)?; writer.write_all(slice)?;
}, },
Tag::Int32 => { Tag::Int32 => {
let slice = slice::from_raw_parts(data as *const u32, length); let slice = slice::from_raw_parts(data as *const u8, length * 4);
for v in slice.iter() { writer.write_all(slice)?;
writer.write_u32(*v)?;
}
}, },
Tag::Int64 | Tag::Float64 => { Tag::Int64 | Tag::Float64 => {
let slice = slice::from_raw_parts(data as *const u64, length); let slice = slice::from_raw_parts(data as *const u8, length * 8);
for v in slice.iter() { writer.write_all(slice)?;
writer.write_u64(*v)?;
}
}, },
_ => { _ => {
for _ in 0..length { for _ in 0..length {