use crate::concurrent::counters::{self, CountersReader};
pub const CLIENT_HEARTBEAT_TYPE_ID: i32 = 11;
#[derive(Copy, Clone)]
#[repr(C, packed(4))]
struct HeartbeatTimestampKeyDefn {
registration_id: i64,
}
pub fn find_counter_id_by_registration_id(
counters_reader: &CountersReader,
counter_type_id: i32,
registration_id: i64,
) -> Option<i32> {
let buffer = counters_reader.meta_data_buffer();
for i in 0..counters_reader.max_counter_id() {
if counters_reader.counter_state(i).expect("Error getting counter state") == counters::RECORD_ALLOCATED {
let record_offset = CountersReader::metadata_offset(i);
let key = buffer.get::<HeartbeatTimestampKeyDefn>(record_offset + *counters::KEY_OFFSET);
if registration_id == key.registration_id
&& buffer.get::<i32>(record_offset + *counters::TYPE_ID_OFFSET) == counter_type_id
{
return Some(i);
}
}
}
None
}
pub fn is_active(counters_reader: &CountersReader, counter_id: i32, counter_type_id: i32, registration_id: i64) -> bool {
let buffer = counters_reader.meta_data_buffer();
let record_offset = CountersReader::metadata_offset(counter_id);
let key = buffer.get::<HeartbeatTimestampKeyDefn>(record_offset + *counters::KEY_OFFSET);
registration_id == key.registration_id
&& buffer.get::<i32>(record_offset + *counters::TYPE_ID_OFFSET) == counter_type_id
&& counters_reader
.counter_state(counter_id)
.expect("Error getting counter state")
== counters::RECORD_ALLOCATED
}