Orderbook: Avoid usize fields in data
This commit is contained in:
parent
6ff4ff5910
commit
be98f6524a
|
@ -38,16 +38,17 @@ pub struct BookSide {
|
||||||
// pub meta_data: MetaData,
|
// pub meta_data: MetaData,
|
||||||
// todo: do we want this type at this level?
|
// todo: do we want this type at this level?
|
||||||
pub book_side_type: BookSideType,
|
pub book_side_type: BookSideType,
|
||||||
pub bump_index: usize,
|
pub padding: [u8; 3],
|
||||||
pub free_list_len: usize,
|
pub bump_index: u32,
|
||||||
|
pub free_list_len: u32,
|
||||||
pub free_list_head: NodeHandle,
|
pub free_list_head: NodeHandle,
|
||||||
pub root_node: NodeHandle,
|
pub root_node: NodeHandle,
|
||||||
pub leaf_count: usize,
|
pub leaf_count: u32,
|
||||||
pub nodes: [AnyNode; MAX_BOOK_NODES],
|
pub nodes: [AnyNode; MAX_BOOK_NODES],
|
||||||
}
|
}
|
||||||
const_assert_eq!(
|
const_assert_eq!(
|
||||||
std::mem::size_of::<BookSide>(),
|
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);
|
const_assert_eq!(std::mem::size_of::<BookSide>() % 8, 0);
|
||||||
|
|
||||||
|
@ -277,12 +278,12 @@ impl BookSide {
|
||||||
|
|
||||||
if self.free_list_len == 0 {
|
if self.free_list_len == 0 {
|
||||||
require!(
|
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
|
MangoError::SomeError // todo
|
||||||
);
|
);
|
||||||
|
|
||||||
self.nodes[self.bump_index] = *val;
|
self.nodes[self.bump_index as usize] = *val;
|
||||||
let key = self.bump_index as u32;
|
let key = self.bump_index;
|
||||||
self.bump_index += 1;
|
self.bump_index += 1;
|
||||||
return Ok(key);
|
return Ok(key);
|
||||||
}
|
}
|
||||||
|
@ -391,7 +392,7 @@ impl BookSide {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_full(&self) -> bool {
|
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.
|
/// 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 {
|
fn new_bookside(book_side_type: BookSideType) -> BookSide {
|
||||||
BookSide {
|
BookSide {
|
||||||
book_side_type,
|
book_side_type,
|
||||||
|
padding: [0u8; 3],
|
||||||
bump_index: 0,
|
bump_index: 0,
|
||||||
free_list_len: 0,
|
free_list_len: 0,
|
||||||
free_list_head: 0,
|
free_list_head: 0,
|
||||||
|
|
|
@ -24,6 +24,7 @@ mod tests {
|
||||||
fn new_bookside(book_side_type: BookSideType) -> BookSide {
|
fn new_bookside(book_side_type: BookSideType) -> BookSide {
|
||||||
BookSide {
|
BookSide {
|
||||||
book_side_type,
|
book_side_type,
|
||||||
|
padding: [0u8; 3],
|
||||||
bump_index: 0,
|
bump_index: 0,
|
||||||
free_list_len: 0,
|
free_list_len: 0,
|
||||||
free_list_head: 0,
|
free_list_head: 0,
|
||||||
|
|
|
@ -8,24 +8,24 @@ use std::mem::size_of;
|
||||||
|
|
||||||
use super::Side;
|
use super::Side;
|
||||||
|
|
||||||
pub const MAX_NUM_EVENTS: usize = 512;
|
pub const MAX_NUM_EVENTS: u32 = 512;
|
||||||
|
|
||||||
pub trait QueueHeader: bytemuck::Pod {
|
pub trait QueueHeader: bytemuck::Pod {
|
||||||
type Item: bytemuck::Pod + Copy;
|
type Item: bytemuck::Pod + Copy;
|
||||||
|
|
||||||
fn head(&self) -> usize;
|
fn head(&self) -> usize;
|
||||||
fn set_head(&mut self, value: usize);
|
fn set_head(&mut self, value: u32);
|
||||||
fn count(&self) -> usize;
|
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 incr_event_id(&mut self);
|
||||||
fn decr_event_id(&mut self, n: usize);
|
fn decr_event_id(&mut self, n: u64);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[account(zero_copy)]
|
#[account(zero_copy)]
|
||||||
pub struct EventQueue {
|
pub struct EventQueue {
|
||||||
pub header: EventQueueHeader,
|
pub header: EventQueueHeader,
|
||||||
pub buf: [AnyEvent; MAX_NUM_EVENTS],
|
pub buf: [AnyEvent; MAX_NUM_EVENTS as usize],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EventQueue {
|
impl EventQueue {
|
||||||
|
@ -53,7 +53,7 @@ impl EventQueue {
|
||||||
self.buf[slot] = value;
|
self.buf[slot] = value;
|
||||||
|
|
||||||
let count = self.header.count();
|
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();
|
self.header.incr_event_id();
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -79,10 +79,10 @@ impl EventQueue {
|
||||||
let value = self.buf[self.header.head()];
|
let value = self.buf[self.header.head()];
|
||||||
|
|
||||||
let count = self.header.count();
|
let count = self.header.count();
|
||||||
self.header.set_count(count - 1);
|
self.header.set_count((count - 1) as u32);
|
||||||
|
|
||||||
let head = self.header.head();
|
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)
|
Ok(value)
|
||||||
}
|
}
|
||||||
|
@ -90,8 +90,8 @@ impl EventQueue {
|
||||||
pub fn revert_pushes(&mut self, desired_len: usize) -> Result<()> {
|
pub fn revert_pushes(&mut self, desired_len: usize) -> Result<()> {
|
||||||
require!(desired_len <= self.header.count(), MangoError::SomeError);
|
require!(desired_len <= self.header.count(), MangoError::SomeError);
|
||||||
let len_diff = self.header.count() - desired_len;
|
let len_diff = self.header.count() - desired_len;
|
||||||
self.header.set_count(desired_len);
|
self.header.set_count(desired_len as u32);
|
||||||
self.header.decr_event_id(len_diff);
|
self.header.decr_event_id(len_diff as u64);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,35 +125,35 @@ impl<'a> Iterator for EventQueueIterator<'a> {
|
||||||
#[zero_copy]
|
#[zero_copy]
|
||||||
#[derive(Pod)]
|
#[derive(Pod)]
|
||||||
pub struct EventQueueHeader {
|
pub struct EventQueueHeader {
|
||||||
head: usize,
|
head: u32,
|
||||||
count: usize,
|
count: u32,
|
||||||
pub seq_num: usize,
|
pub seq_num: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl QueueHeader for EventQueueHeader {
|
impl QueueHeader for EventQueueHeader {
|
||||||
type Item = AnyEvent;
|
type Item = AnyEvent;
|
||||||
|
|
||||||
fn head(&self) -> usize {
|
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;
|
self.head = value;
|
||||||
}
|
}
|
||||||
fn count(&self) -> usize {
|
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;
|
self.count = value;
|
||||||
}
|
}
|
||||||
fn incr_event_id(&mut self) {
|
fn incr_event_id(&mut self) {
|
||||||
self.seq_num += 1;
|
self.seq_num += 1;
|
||||||
}
|
}
|
||||||
fn decr_event_id(&mut self, n: usize) {
|
fn decr_event_id(&mut self, n: u64) {
|
||||||
self.seq_num -= n;
|
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_assert_eq!(std::mem::size_of::<EventQueue>() % 8, 0);
|
||||||
|
|
||||||
const EVENT_SIZE: usize = 200;
|
const EVENT_SIZE: usize = 200;
|
||||||
|
@ -184,7 +184,7 @@ pub struct FillEvent {
|
||||||
pub market_fees_applied: bool,
|
pub market_fees_applied: bool,
|
||||||
pub padding: [u8; 3],
|
pub padding: [u8; 3],
|
||||||
pub timestamp: u64,
|
pub timestamp: u64,
|
||||||
pub seq_num: usize, // note: usize same as u64
|
pub seq_num: u64,
|
||||||
|
|
||||||
pub maker: Pubkey,
|
pub maker: Pubkey,
|
||||||
pub maker_order_id: i128,
|
pub maker_order_id: i128,
|
||||||
|
@ -212,7 +212,7 @@ impl FillEvent {
|
||||||
maker_out: bool,
|
maker_out: bool,
|
||||||
maker_slot: u8,
|
maker_slot: u8,
|
||||||
timestamp: u64,
|
timestamp: u64,
|
||||||
seq_num: usize,
|
seq_num: u64,
|
||||||
maker: Pubkey,
|
maker: Pubkey,
|
||||||
maker_order_id: i128,
|
maker_order_id: i128,
|
||||||
maker_client_order_id: u64,
|
maker_client_order_id: u64,
|
||||||
|
@ -272,7 +272,7 @@ pub struct OutEvent {
|
||||||
pub owner_slot: u8,
|
pub owner_slot: u8,
|
||||||
padding0: [u8; 5],
|
padding0: [u8; 5],
|
||||||
pub timestamp: u64,
|
pub timestamp: u64,
|
||||||
pub seq_num: usize,
|
pub seq_num: u64,
|
||||||
pub owner: Pubkey,
|
pub owner: Pubkey,
|
||||||
pub quantity: i64,
|
pub quantity: i64,
|
||||||
padding1: [u8; EVENT_SIZE - 64],
|
padding1: [u8; EVENT_SIZE - 64],
|
||||||
|
@ -284,7 +284,7 @@ impl OutEvent {
|
||||||
side: Side,
|
side: Side,
|
||||||
owner_slot: u8,
|
owner_slot: u8,
|
||||||
timestamp: u64,
|
timestamp: u64,
|
||||||
seq_num: usize,
|
seq_num: u64,
|
||||||
owner: Pubkey,
|
owner: Pubkey,
|
||||||
quantity: i64,
|
quantity: i64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
|
|
Loading…
Reference in New Issue