Orderbook: Avoid usize fields in data

This commit is contained in:
Christian Kamm 2022-06-18 17:49:07 +02:00
parent 6ff4ff5910
commit be98f6524a
3 changed files with 34 additions and 31 deletions

View File

@ -38,16 +38,17 @@ pub struct BookSide {
// pub meta_data: MetaData,
// todo: do we want this type at this level?
pub book_side_type: BookSideType,
pub bump_index: usize,
pub free_list_len: usize,
pub padding: [u8; 3],
pub bump_index: u32,
pub free_list_len: u32,
pub free_list_head: NodeHandle,
pub root_node: NodeHandle,
pub leaf_count: usize,
pub leaf_count: u32,
pub nodes: [AnyNode; MAX_BOOK_NODES],
}
const_assert_eq!(
std::mem::size_of::<BookSide>(),
8 + 8 * 2 + 4 + 4 + 8 + 88 * 1024
1 + 3 + 4 * 2 + 4 + 4 + 4 + 88 * 1024
);
const_assert_eq!(std::mem::size_of::<BookSide>() % 8, 0);
@ -277,12 +278,12 @@ impl BookSide {
if self.free_list_len == 0 {
require!(
self.bump_index < self.nodes.len() && self.bump_index < (u32::MAX as usize),
(self.bump_index as usize) < self.nodes.len() && self.bump_index < u32::MAX,
MangoError::SomeError // todo
);
self.nodes[self.bump_index] = *val;
let key = self.bump_index as u32;
self.nodes[self.bump_index as usize] = *val;
let key = self.bump_index;
self.bump_index += 1;
return Ok(key);
}
@ -391,7 +392,7 @@ impl BookSide {
}
pub fn is_full(&self) -> bool {
self.free_list_len <= 1 && self.bump_index >= self.nodes.len() - 1
self.free_list_len <= 1 && (self.bump_index as usize) >= self.nodes.len() - 1
}
/// When a node changes, the parents' child_earliest_expiry may need to be updated.
@ -450,6 +451,7 @@ mod tests {
fn new_bookside(book_side_type: BookSideType) -> BookSide {
BookSide {
book_side_type,
padding: [0u8; 3],
bump_index: 0,
free_list_len: 0,
free_list_head: 0,

View File

@ -24,6 +24,7 @@ mod tests {
fn new_bookside(book_side_type: BookSideType) -> BookSide {
BookSide {
book_side_type,
padding: [0u8; 3],
bump_index: 0,
free_list_len: 0,
free_list_head: 0,

View File

@ -8,24 +8,24 @@ use std::mem::size_of;
use super::Side;
pub const MAX_NUM_EVENTS: usize = 512;
pub const MAX_NUM_EVENTS: u32 = 512;
pub trait QueueHeader: bytemuck::Pod {
type Item: bytemuck::Pod + Copy;
fn head(&self) -> usize;
fn set_head(&mut self, value: usize);
fn set_head(&mut self, value: u32);
fn count(&self) -> usize;
fn set_count(&mut self, value: usize);
fn set_count(&mut self, value: u32);
fn incr_event_id(&mut self);
fn decr_event_id(&mut self, n: usize);
fn decr_event_id(&mut self, n: u64);
}
#[account(zero_copy)]
pub struct EventQueue {
pub header: EventQueueHeader,
pub buf: [AnyEvent; MAX_NUM_EVENTS],
pub buf: [AnyEvent; MAX_NUM_EVENTS as usize],
}
impl EventQueue {
@ -53,7 +53,7 @@ impl EventQueue {
self.buf[slot] = value;
let count = self.header.count();
self.header.set_count(count + 1);
self.header.set_count((count + 1) as u32); // guaranteed because of full() check
self.header.incr_event_id();
Ok(())
@ -79,10 +79,10 @@ impl EventQueue {
let value = self.buf[self.header.head()];
let count = self.header.count();
self.header.set_count(count - 1);
self.header.set_count((count - 1) as u32);
let head = self.header.head();
self.header.set_head((head + 1) % self.buf.len());
self.header.set_head(((head + 1) % self.buf.len()) as u32);
Ok(value)
}
@ -90,8 +90,8 @@ impl EventQueue {
pub fn revert_pushes(&mut self, desired_len: usize) -> Result<()> {
require!(desired_len <= self.header.count(), MangoError::SomeError);
let len_diff = self.header.count() - desired_len;
self.header.set_count(desired_len);
self.header.decr_event_id(len_diff);
self.header.set_count(desired_len as u32);
self.header.decr_event_id(len_diff as u64);
Ok(())
}
@ -125,35 +125,35 @@ impl<'a> Iterator for EventQueueIterator<'a> {
#[zero_copy]
#[derive(Pod)]
pub struct EventQueueHeader {
head: usize,
count: usize,
pub seq_num: usize,
head: u32,
count: u32,
pub seq_num: u64,
}
impl QueueHeader for EventQueueHeader {
type Item = AnyEvent;
fn head(&self) -> usize {
self.head
self.head as usize
}
fn set_head(&mut self, value: usize) {
fn set_head(&mut self, value: u32) {
self.head = value;
}
fn count(&self) -> usize {
self.count
self.count as usize
}
fn set_count(&mut self, value: usize) {
fn set_count(&mut self, value: u32) {
self.count = value;
}
fn incr_event_id(&mut self) {
self.seq_num += 1;
}
fn decr_event_id(&mut self, n: usize) {
fn decr_event_id(&mut self, n: u64) {
self.seq_num -= n;
}
}
const_assert_eq!(std::mem::size_of::<EventQueue>(), 8 * 3 + 512 * 200);
const_assert_eq!(std::mem::size_of::<EventQueue>(), 4 * 2 + 8 + 512 * 200);
const_assert_eq!(std::mem::size_of::<EventQueue>() % 8, 0);
const EVENT_SIZE: usize = 200;
@ -184,7 +184,7 @@ pub struct FillEvent {
pub market_fees_applied: bool,
pub padding: [u8; 3],
pub timestamp: u64,
pub seq_num: usize, // note: usize same as u64
pub seq_num: u64,
pub maker: Pubkey,
pub maker_order_id: i128,
@ -212,7 +212,7 @@ impl FillEvent {
maker_out: bool,
maker_slot: u8,
timestamp: u64,
seq_num: usize,
seq_num: u64,
maker: Pubkey,
maker_order_id: i128,
maker_client_order_id: u64,
@ -272,7 +272,7 @@ pub struct OutEvent {
pub owner_slot: u8,
padding0: [u8; 5],
pub timestamp: u64,
pub seq_num: usize,
pub seq_num: u64,
pub owner: Pubkey,
pub quantity: i64,
padding1: [u8; EVENT_SIZE - 64],
@ -284,7 +284,7 @@ impl OutEvent {
side: Side,
owner_slot: u8,
timestamp: u64,
seq_num: usize,
seq_num: u64,
owner: Pubkey,
quantity: i64,
) -> Self {