api: add event channel overflow event

This commit is contained in:
link2xt
2024-05-21 19:14:41 +00:00
parent 18f2a09b35
commit 469ff799ad
8 changed files with 48 additions and 24 deletions

View File

@@ -6324,6 +6324,14 @@ void dc_event_unref(dc_event_t* event);
#define DC_EVENT_CHATLIST_ITEM_CHANGED 2301 #define DC_EVENT_CHATLIST_ITEM_CHANGED 2301
/**
* Inform that some events have been skipped due to event channel overflow.
*
* @param data1 (int) number of events that have been skipped
*/
#define DC_EVENT_CHANNEL_OVERFLOW 2400
/** /**
* @} * @}
*/ */

View File

@@ -566,6 +566,7 @@ pub unsafe extern "C" fn dc_event_get_id(event: *mut dc_event_t) -> libc::c_int
EventType::AccountsBackgroundFetchDone => 2200, EventType::AccountsBackgroundFetchDone => 2200,
EventType::ChatlistChanged => 2300, EventType::ChatlistChanged => 2300,
EventType::ChatlistItemChanged { .. } => 2301, EventType::ChatlistItemChanged { .. } => 2301,
EventType::EventChannelOverflow { .. } => 2400,
} }
} }
@@ -624,6 +625,7 @@ pub unsafe extern "C" fn dc_event_get_data1_int(event: *mut dc_event_t) -> libc:
EventType::ChatlistItemChanged { chat_id } => { EventType::ChatlistItemChanged { chat_id } => {
chat_id.unwrap_or_default().to_u32() as libc::c_int chat_id.unwrap_or_default().to_u32() as libc::c_int
} }
EventType::EventChannelOverflow { n } => *n as libc::c_int,
} }
} }
@@ -662,8 +664,9 @@ pub unsafe extern "C" fn dc_event_get_data2_int(event: *mut dc_event_t) -> libc:
| EventType::AccountsBackgroundFetchDone | EventType::AccountsBackgroundFetchDone
| EventType::ChatlistChanged | EventType::ChatlistChanged
| EventType::ChatlistItemChanged { .. } | EventType::ChatlistItemChanged { .. }
| EventType::ConfigSynced { .. } => 0, | EventType::ConfigSynced { .. }
EventType::ChatModified(_) => 0, | EventType::ChatModified(_)
| EventType::EventChannelOverflow { .. } => 0,
EventType::MsgsChanged { msg_id, .. } EventType::MsgsChanged { msg_id, .. }
| EventType::ReactionsChanged { msg_id, .. } | EventType::ReactionsChanged { msg_id, .. }
| EventType::IncomingMsg { msg_id, .. } | EventType::IncomingMsg { msg_id, .. }
@@ -729,7 +732,8 @@ pub unsafe extern "C" fn dc_event_get_data2_str(event: *mut dc_event_t) -> *mut
| EventType::ChatEphemeralTimerModified { .. } | EventType::ChatEphemeralTimerModified { .. }
| EventType::IncomingMsgBunch { .. } | EventType::IncomingMsgBunch { .. }
| EventType::ChatlistItemChanged { .. } | EventType::ChatlistItemChanged { .. }
| EventType::ChatlistChanged => ptr::null_mut(), | EventType::ChatlistChanged
| EventType::EventChannelOverflow { .. } => ptr::null_mut(),
EventType::ConfigureProgress { comment, .. } => { EventType::ConfigureProgress { comment, .. } => {
if let Some(comment) = comment { if let Some(comment) = comment {
comment.to_c_string().unwrap_or_default().into_raw() comment.to_c_string().unwrap_or_default().into_raw()

View File

@@ -263,6 +263,9 @@ pub enum EventType {
/// If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. /// If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
ChatlistItemChanged { chat_id: Option<u32> }, ChatlistItemChanged { chat_id: Option<u32> },
/// Inform than some events have been skipped due to event channel overflow.
EventChannelOverflow { n: u64 },
} }
impl From<CoreEventType> for EventType { impl From<CoreEventType> for EventType {
@@ -378,6 +381,7 @@ impl From<CoreEventType> for EventType {
chat_id: chat_id.map(|id| id.to_u32()), chat_id: chat_id.map(|id| id.to_u32()),
}, },
CoreEventType::ChatlistChanged => ChatlistChanged, CoreEventType::ChatlistChanged => ChatlistChanged,
CoreEventType::EventChannelOverflow { n } => EventChannelOverflow { n },
} }
} }
} }

View File

@@ -30,6 +30,7 @@ module.exports = {
DC_DOWNLOAD_IN_PROGRESS: 1000, DC_DOWNLOAD_IN_PROGRESS: 1000,
DC_DOWNLOAD_UNDECIPHERABLE: 30, DC_DOWNLOAD_UNDECIPHERABLE: 30,
DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE: 2200, DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE: 2200,
DC_EVENT_CHANNEL_OVERFLOW: 2400,
DC_EVENT_CHATLIST_CHANGED: 2300, DC_EVENT_CHATLIST_CHANGED: 2300,
DC_EVENT_CHATLIST_ITEM_CHANGED: 2301, DC_EVENT_CHATLIST_ITEM_CHANGED: 2301,
DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED: 2021, DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED: 2021,

View File

@@ -40,5 +40,6 @@ module.exports = {
2150: 'DC_EVENT_WEBXDC_REALTIME_DATA', 2150: 'DC_EVENT_WEBXDC_REALTIME_DATA',
2200: 'DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE', 2200: 'DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE',
2300: 'DC_EVENT_CHATLIST_CHANGED', 2300: 'DC_EVENT_CHATLIST_CHANGED',
2301: 'DC_EVENT_CHATLIST_ITEM_CHANGED' 2301: 'DC_EVENT_CHATLIST_ITEM_CHANGED',
2400: 'DC_EVENT_CHANNEL_OVERFLOW'
} }

View File

@@ -30,6 +30,7 @@ export enum C {
DC_DOWNLOAD_IN_PROGRESS = 1000, DC_DOWNLOAD_IN_PROGRESS = 1000,
DC_DOWNLOAD_UNDECIPHERABLE = 30, DC_DOWNLOAD_UNDECIPHERABLE = 30,
DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE = 2200, DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE = 2200,
DC_EVENT_CHANNEL_OVERFLOW = 2400,
DC_EVENT_CHATLIST_CHANGED = 2300, DC_EVENT_CHATLIST_CHANGED = 2300,
DC_EVENT_CHATLIST_ITEM_CHANGED = 2301, DC_EVENT_CHATLIST_ITEM_CHANGED = 2301,
DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED = 2021, DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED = 2021,
@@ -343,4 +344,5 @@ export const EventId2EventName: { [key: number]: string } = {
2200: 'DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE', 2200: 'DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE',
2300: 'DC_EVENT_CHATLIST_CHANGED', 2300: 'DC_EVENT_CHATLIST_CHANGED',
2301: 'DC_EVENT_CHATLIST_ITEM_CHANGED', 2301: 'DC_EVENT_CHATLIST_ITEM_CHANGED',
2400: 'DC_EVENT_CHANNEL_OVERFLOW',
} }

View File

@@ -71,16 +71,13 @@ impl EventEmitter {
/// [`try_recv`]: Self::try_recv /// [`try_recv`]: Self::try_recv
pub async fn recv(&self) -> Option<Event> { pub async fn recv(&self) -> Option<Event> {
let mut lock = self.0.lock().await; let mut lock = self.0.lock().await;
loop { match lock.recv().await {
match lock.recv().await { Err(async_broadcast::RecvError::Overflowed(n)) => Some(Event {
Err(async_broadcast::RecvError::Overflowed(_)) => { id: 0,
// Some events have been lost, typ: EventType::EventChannelOverflow { n },
// but the channel is not closed. }),
continue; Err(async_broadcast::RecvError::Closed) => None,
} Ok(event) => Some(event),
Err(async_broadcast::RecvError::Closed) => return None,
Ok(event) => return Some(event),
}
} }
} }
@@ -96,17 +93,18 @@ impl EventEmitter {
// to avoid blocking // to avoid blocking
// in case there is a concurrent call to `recv`. // in case there is a concurrent call to `recv`.
let mut lock = self.0.try_lock()?; let mut lock = self.0.try_lock()?;
loop { match lock.try_recv() {
match lock.try_recv() { Err(async_broadcast::TryRecvError::Overflowed(n)) => {
Err(async_broadcast::TryRecvError::Overflowed(_)) => { // Some events have been lost,
// Some events have been lost, // but the channel is not closed.
// but the channel is not closed. Ok(Event {
continue; id: 0,
} typ: EventType::EventChannelOverflow { n },
res @ (Err(async_broadcast::TryRecvError::Empty) })
| Err(async_broadcast::TryRecvError::Closed)
| Ok(_)) => return Ok(res?),
} }
res @ (Err(async_broadcast::TryRecvError::Empty)
| Err(async_broadcast::TryRecvError::Closed)
| Ok(_)) => Ok(res?),
} }
} }
} }

View File

@@ -315,4 +315,10 @@ pub enum EventType {
/// Event for using in tests, e.g. as a fence between normally generated events. /// Event for using in tests, e.g. as a fence between normally generated events.
#[cfg(test)] #[cfg(test)]
Test, Test,
/// Inform than some events have been skipped due to event channel overflow.
EventChannelOverflow {
/// Number of events skipped.
n: u64,
},
} }