use std::net::SocketAddr;
use std::sync::Arc;
use crossbeam::queue::SegQueue;
use rrddmma::rdma::qp::QpEndpoint;
use serde::{Deserialize, Serialize};
use thiserror::Error;
use crate::type_alias::*;
#[derive(Debug, Clone, Copy, Error, Serialize, Deserialize)]
pub(crate) enum ConnectRefuseReason {
#[error("invalid Rpc ID")]
InvalidRpcId,
#[error("session limit exceeded")]
SessionLimitExceeded,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) enum SmEventDetails {
ConnectRequest {
cli_uri: SocketAddr,
cli_ud_ep: QpEndpoint,
cli_sess_id: SessId,
cli_sess_rc_ep: QpEndpoint,
},
ConnectAcknowledge {
cli_sess_id: SessId,
svr_ud_ep: QpEndpoint,
svr_sess_id: SessId,
svr_sess_rc_ep: QpEndpoint,
},
ConnectRefuse {
cli_sess_id: SessId,
reason: ConnectRefuseReason,
},
Disconnect,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct SmEvent {
pub(crate) src_rpc_id: RpcId,
pub(crate) dst_rpc_id: RpcId,
pub(crate) details: SmEventDetails,
}
pub(crate) struct SmEventTx(Arc<SegQueue<SmEvent>>);
impl SmEventTx {
pub(crate) fn send(&self, event: SmEvent) {
self.0.push(event);
}
}
pub(crate) struct SmEventRx(Arc<SegQueue<SmEvent>>);
impl SmEventRx {
pub(crate) fn recv(&self) -> Option<SmEvent> {
self.0.pop()
}
pub(crate) fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
pub(crate) fn sm_event_channel() -> (SmEventTx, SmEventRx) {
let queue = Arc::new(SegQueue::new());
(SmEventTx(queue.clone()), SmEventRx(queue))
}