OMG CORBAservices: Event Service v1.2 — Spec Coverage (WP COS-EventService)
Spec: OMG CORBA Event Service v1.2 — formal/04-10-02 → (October 2004, 65 pages).
Note on filename versioning: the spec-coverage filename historically
carries the suffix 1.4, but the OMG-published spec is v1.2 (no 1.3 / 1.4
was ever published). The filename is kept for diff/reference stability; the
spec version stated above is authoritative.
Context. The CORBA Event Service is a prerequisite for the
TimerEventService from omg-time-1.1.md §2.2-§2.4 (the TimerEventService
works with CosEventChannelAdmin::EventChannel push channels) and provides
the event backend for the event ports in the CCM component model (see
corba-3.3.md Part 3 §6.7).
Implementation:
crates/corba-cos-event/· docs.rs — CosEventComm, CosEventChannelAdmin, and Typed Event (§2.1/§2.3/§2.5/§2.7).
Crate mapping:
- §2.1 CosEventComm —
crates/corba-cos-event/src/comm.rs - §2.3 CosEventChannelAdmin —
crates/corba-cos-event/src/channel.rs - §2.5/§2.7 Typed Event —
crates/corba-cos-event/src/typed.rs - §3 Lightweight Event Service —
crates/corba-cos-event/src/typed.rs(lightweight) - CosEvent → DDS topic bridge (not an OMG item) —
crates/corba-cos-event/src/dds_bridge.rs
§1 Service description
§1.1 Overview / §1.2 Event Communication / §1.3 Example Scenario
Spec: §1.1-§1.3, p. 1-1 to 1-3 — architecture overview, example.
Repo: —
Tests: —
Status: n/a (informative) — overview and example scenario.
§1.4 Design Principles / §1.5 Resolution of Technical Issues / §1.6 Quality of Service
Spec: §1.4-§1.6, p. 1-4 to 1-6 — design discussion.
Repo: —
Tests: —
Status: n/a (informative) — design principles and discussion; §1.6 explicitly sets no quality of service (“the event interfaces do not dictate qualities of service”).
§1.7 Generic Event Communication
Spec: §1.7, p. 1-7 — push/pull-model introduction (informative; normative definitions follow in §2.1).
Repo: —
Tests: —
Status: n/a (informative) — introduction; the normative definitions are in §2.1.
§2 Modules and interfaces
§2.1 The CosEventComm module
Spec: §2.1, p. 2-1 — the IDL module CosEventComm with the four base
interfaces.
Repo: crates/corba-cos-event/src/comm.rs (trait definitions
PushConsumer, PushSupplier, PullSupplier, PullConsumer; the helper
type AnyEvent as a payload-agnostic container; the errors Disconnected
and ConnectError).
Tests: crates/corba-cos-event/src/comm.rs::tests:
push_increments_counter_until_disconnect,
push_supplier_disconnect_terminates_the_connection,
pull_supplier_try_pull_returns_the_has_event_flag,
pull_consumer_disconnect_terminates_the_connection,
any_event_round_trip, connect_error_variants_distinct.
Status: done
§2.1.1 The PushConsumer interface
Spec: §2.1.1 — interface PushConsumer { void push(in any data) raises (Disconnected); void disconnect_push_consumer(); };.
Repo: crates/corba-cos-event/src/comm.rs trait PushConsumer with
push(&self, event: AnyEvent) -> Result<(), Disconnected> +
disconnect_push_consumer(&self).
Tests: crates/corba-cos-event/src/comm.rs::tests::push_increments_counter_until_disconnect
(push counts up to the disconnect, Disconnected afterwards);
crates/corba-cos-event/src/channel.rs::tests::proxy_push_consumer_push_before_connect_raises_disconnected
(push before connect yields Disconnected).
Status: done
§2.1.2 The PushSupplier interface
Spec: §2.1.2 — interface PushSupplier { void disconnect_push_supplier(); };.
Repo: crates/corba-cos-event/src/comm.rs trait PushSupplier; the channel-side implementation
crates/corba-cos-event/src/channel.rs::ProxyPushSupplier (impl PushSupplier for ProxyPushSupplier)
— the disconnect unregisters the consumer from the channel and calls its
disconnect_push_consumer.
Tests: crates/corba-cos-event/src/comm.rs::tests::push_supplier_disconnect_terminates_the_connection;
crates/corba-cos-event/src/channel.rs::tests::proxy_push_supplier_disconnect_stops_event_delivery
(no further event reaches the consumer after the disconnect).
Status: done
§2.1.3 The PullSupplier interface
Spec: §2.1.3 — pull()/try_pull()/disconnect_pull_supplier();
pull blocks until an event is available, try_pull additionally returns
the has_event flag.
Repo: crates/corba-cos-event/src/comm.rs trait PullSupplier with
pull() -> Result<AnyEvent, Disconnected>,
try_pull() -> Result<(AnyEvent, bool), Disconnected>,
disconnect_pull_supplier().
Tests: crates/corba-cos-event/src/comm.rs::tests:
pull_supplier_try_pull_returns_the_has_event_flag (flag true with the
event, false with an empty any),
pull_supplier_pull_returns_the_queued_event,
pull_supplier_disconnect_raises_disconnected_on_both_operations.
Status: done
§2.1.4 The PullConsumer interface
Spec: §2.1.4 — disconnect_pull_consumer().
Repo: crates/corba-cos-event/src/comm.rs trait PullConsumer; the channel-side implementation
crates/corba-cos-event/src/channel.rs::ProxyPullConsumer
(impl PullConsumer for ProxyPullConsumer).
Tests: crates/corba-cos-event/src/comm.rs::tests::pull_consumer_disconnect_terminates_the_connection;
crates/corba-cos-event/src/channel.rs::tests::proxy_pull_consumer_connect_and_disconnect_lifecycle.
Status: done
§2.1.5 Disconnection behavior
Spec: §2.1.5 — the disconnection lifecycle, Disconnected exception on
a call after disconnect.
Repo: crates/corba-cos-event/src/comm.rs error type Disconnected + disconnect paths in the
proxy implementations (crates/corba-cos-event/src/channel.rs).
Tests: crates/corba-cos-event/src/comm.rs::tests::disconnection_is_terminal_for_every_operation
(the disconnect is terminal and idempotent; every operation reports
Disconnected afterwards);
crates/corba-cos-event/src/channel.rs::tests::push_unregisters_a_consumer_that_reports_disconnected
(a consumer reporting Disconnected is unregistered instead of being
skipped silently);
crates/corba-cos-event/src/channel.rs::tests::destroy_wakes_blocked_pull_with_disconnected.
Status: done
§2.2 Event channels
Spec: §2.2, p. 2-4 — “The event channel is itself both a consumer and a supplier of the event data.” Push style (supplier pushes into the channel, the channel pushes to the consumer), pull style (the channel pulls from the supplier, the consumer pulls from the channel), mixed styles, several consumers and suppliers per channel.
Repo: crates/corba-cos-event/src/channel.rs (EventChannel, ProxyPushConsumer, ProxyPullSupplier, ProxyPullConsumer, ProxyPushSupplier).
Tests: crates/corba-cos-event/src/channel.rs::tests::push_fan_out_to_multiple_consumers, crates/corba-cos-event/src/channel.rs::tests::pull_supplier_dequeues_events, crates/corba-cos-event/src/channel.rs::tests::proxy_pull_consumer_forwards_pulled_events_into_the_channel.
Status: done
§2.3 The CosEventChannelAdmin module
Spec: §2.3, p. 2-8 — the IDL module CosEventChannelAdmin with the
channel and admin/proxy interfaces.
Repo: crates/corba-cos-event/src/channel.rs (see the sub-items).
Tests: crates/corba-cos-event/src/channel.rs::tests:
event_channel_admins_share_one_channel_state,
consumer_admin_returns_a_fresh_proxy_per_call,
supplier_admin_returns_a_fresh_proxy_per_call,
push_fan_out_to_multiple_consumers,
proxy_pull_consumer_forwards_pulled_events_into_the_channel.
Status: done
§2.3.1 The EventChannel interface
Spec: §2.3.1 — interface EventChannel { ConsumerAdmin for_consumers(); SupplierAdmin for_suppliers(); void destroy(); };;
destroy releases the channel and disconnects the attached endpoints.
Repo: crates/corba-cos-event/src/channel.rs EventChannel with for_consumers,
for_suppliers, destroy, is_destroyed.
Tests: crates/corba-cos-event/src/channel.rs::tests:
event_channel_admins_share_one_channel_state (both admin views address
the same channel state),
destroy_disconnects_registered_consumers (destroy calls
disconnect_push_consumer on every registered consumer),
destroy_disconnects_proxies,
destroy_wakes_blocked_pull_with_disconnected.
Status: done
§2.3.2 The ConsumerAdmin interface
Spec: §2.3.2 — obtain_push_supplier(), obtain_pull_supplier(); each
call returns a proxy of its own.
Repo: crates/corba-cos-event/src/channel.rs ConsumerAdmin.
Tests: crates/corba-cos-event/src/channel.rs::tests::consumer_admin_returns_a_fresh_proxy_per_call
(two calls return distinct proxies; the second one is unconnected and
accepts a consumer of its own).
Status: done
§2.3.3 The SupplierAdmin interface
Spec: §2.3.3 — obtain_push_consumer(), obtain_pull_consumer(); each
call returns a proxy of its own.
Repo: crates/corba-cos-event/src/channel.rs SupplierAdmin.
Tests: crates/corba-cos-event/src/channel.rs::tests::supplier_admin_returns_a_fresh_proxy_per_call.
Status: done
§2.3.4 The ProxyPushConsumer interface
Spec: §2.3.4 — connect_push_supplier() raises AlreadyConnected; a
push before the connect is Disconnected.
Repo: crates/corba-cos-event/src/channel.rs ProxyPushConsumer (connect_push_supplier,
impl PushConsumer).
Tests: crates/corba-cos-event/src/channel.rs::tests:
proxy_push_consumer_push_before_connect_raises_disconnected,
double_connect_yields_already_connected,
push_fan_out_to_multiple_consumers.
Status: done
§2.3.5 The ProxyPullSupplier interface
Spec: §2.3.5 — connect_pull_consumer() raises AlreadyConnected;
pull blocks until an event is available, try_pull returns the
has_event flag.
Repo: crates/corba-cos-event/src/channel.rs ProxyPullSupplier (connect_pull_consumer,
impl PullSupplier; the blocking pull waits on the Condvar
ChannelInner::ready rather than in a poll loop).
Tests: crates/corba-cos-event/src/channel.rs::tests:
proxy_pull_supplier_try_pull_reports_has_event_flag,
proxy_pull_supplier_pull_blocks_until_an_event_arrives (the call returns
only after a supplier has pushed),
proxy_pull_supplier_double_connect_yields_already_connected,
pull_supplier_dequeues_events, pull_supplier_disconnect_propagates.
Status: done
§2.3.6 The ProxyPullConsumer interface
Spec: §2.3.6 — connect_pull_supplier() raises AlreadyConnected;
inherited disconnect_pull_consumer().
Repo: crates/corba-cos-event/src/channel.rs ProxyPullConsumer with connect_pull_supplier,
forward_event as the push path into the channel, and impl PullConsumer
for the disconnect.
Tests: crates/corba-cos-event/src/channel.rs::tests:
proxy_pull_consumer_forwards_pulled_events_into_the_channel (the events
pulled from the supplier show up on the consumer side of the channel),
proxy_pull_consumer_connect_and_disconnect_lifecycle.
Status: done
§2.3.7 The ProxyPushSupplier interface
Spec: §2.3.7 — connect_push_consumer() raises AlreadyConnected;
disconnect_push_supplier() terminates the connection.
Repo: crates/corba-cos-event/src/channel.rs ProxyPushSupplier with connect_push_consumer,
is_connected, and impl PushSupplier (disconnect_push_supplier).
Tests: crates/corba-cos-event/src/channel.rs::tests:
proxy_push_supplier_double_connect_yields_already_connected,
proxy_push_supplier_disconnect_stops_event_delivery.
Status: done
§2.4 Typed event communication
Spec: §2.4, pp. 2-12 to 2-13 — typed push: the supplier calls operations of the agreed interface I on the consumer. Typed pull: for every interface I, Pull<I> is defined, “For every operation o in I, Pull contains two operations”: pull_o (blocks, returns the event data as out parameters) and boolean try_o.
Repo: crates/corba-cos-event/src/typed.rs (TypedInvocation, TypedPushConsumer::invoke, TypedPullSupplier::pull/try_pull).
Tests: crates/corba-cos-event/src/typed.rs::tests::typed_push_consumer_invoke_carries_operation_and_args, crates/corba-cos-event/src/typed.rs::tests::pull_supplier_try_pull_returns_queued_event.
Status: partial — typed push (operation name and arguments reach the consumer) and typed pull in generic form (TypedInvocation) are implemented; the derived interface Pull<I> is missing, own item.
§2.4.2 Derived interface Pull
Spec: §2.4.2, p. 2-13 — for every operation o of I, Pull<I> contains the operations pull_o (all in parameters become out parameters; blocks until an o-event is available) and boolean try_o (returns false when no o-event is available).
Repo: —
Tests: —
Status: open — no code generates or represents Pull<I>; TypedPullSupplier returns every operation as a generic TypedInvocation.
§2.5 The CosTypedEventComm module
Spec: §2.5, p. 2-14 — the IDL module CosTypedEventComm with
TypedPushConsumer and TypedPullSupplier.
Repo: crates/corba-cos-event/src/typed.rs (TypedPushConsumer,
TypedPushSupplier, TypedPullSupplier traits and the helper type
TypedInvocation).
Tests: crates/corba-cos-event/src/typed.rs::tests:
typed_push_consumer_invoke_carries_operation_and_args,
typed_push_supplier_disconnect_terminates_the_connection,
pull_supplier_try_pull_returns_queued_event.
Status: done — all three subscription patterns declared.
§2.5.1 The TypedPushConsumer interface
Spec: §2.5.1 — TypedPushConsumer : PushConsumer { Object get_typed_consumer(); };; in typed mode the channel calls the IDL
operation instead of push(any).
Repo: typed.rs trait TypedPushConsumer (with a get_typed_consumer
counterpart via TypedInvocation dispatch).
Tests: crates/corba-cos-event/src/typed.rs::tests:
typed_push_consumer_invoke_carries_operation_and_args (operation name and
encoded arguments reach the consumer, the reply travels back),
typed_push_consumer_disconnect_raises_disconnected,
dispatch_reaches_registered_consumers.
Status: done
§2.5.2 The TypedPullSupplier interface
Spec: §2.5.2 — TypedPullSupplier : PullSupplier { Object get_typed_supplier(); };.
Repo: crates/corba-cos-event/src/typed.rs::TypedPullSupplier trait
with pull/try_pull/disconnect operations.
Tests: typed::tests::{pull_supplier_try_pull_returns_queued_event, pull_supplier_try_pull_returns_none_for_empty, pull_supplier_disconnect_returns_error}.
Status: done
§2.6 Typed event channels
Spec: §2.6, p. 2-16 — “Typed event channels […] support both typed and generic event communication. These forms can be mixed at will. […] An event supplied in typed form can be consumed in generic form, or vice versa.”
Repo: —
Tests: —
Status: open — TypedEventChannel (crates/corba-cos-event/src/typed.rs) delivers only to typed consumers; a conversion between typed and generic form is missing.
§2.7 The CosTypedEventChannelAdmin module
Spec: §2.7, p. 2-16 — the IDL module with TypedEventChannel + TypedConsumerAdmin/TypedSupplierAdmin + typed proxies.
Repo: typed.rs TypedEventChannel with
for_consumers()/for_suppliers()/destroy() + separate
TypedConsumerAdmin and TypedSupplierAdmin structures + the
TypedPullSupplier trait for the pull-proxy path.
Tests: crates/corba-cos-event/src/typed.rs::tests:
typed_event_channel_for_consumers_returns_admin,
typed_event_channel_for_suppliers_returns_admin,
typed_consumer_admin_register_count_roundtrip,
typed_supplier_admin_try_pull_returns_first_available,
destroy_disables_dispatch.
Status: done — channel + admin splits + proxies live.
§2.7.1 The TypedEventChannel interface
Spec: §2.7.1 — for_consumers/for_suppliers/destroy analogous to
§2.3.1.
Repo: typed.rs::TypedEventChannel::{for_consumers, for_suppliers, destroy, is_destroyed}.
Tests: typed::tests::{typed_event_channel_for_consumers_returns_admin, typed_event_channel_for_suppliers_returns_admin, destroy_disables_dispatch}.
Status: done
§2.7.2-§2.7.5 Typed admin/proxy interfaces
Spec: §2.7.2-§2.7.5 — TypedConsumerAdmin, TypedSupplierAdmin, TypedProxyPushConsumer, TypedProxyPullSupplier.
Repo: typed.rs::{TypedConsumerAdmin, TypedSupplierAdmin} with
register_consumer/register_pull_supplier/try_pull/counter operations.
TypedProxyPushConsumer is covered via the existing TypedPushConsumer
trait; TypedProxyPullSupplier via the new TypedPullSupplier trait.
Tests: typed::tests::{typed_consumer_admin_register_count_roundtrip, typed_supplier_admin_register_count_roundtrip, typed_supplier_admin_try_pull_returns_first_available}.
Status: done — admin/proxy split implemented.
§2.8 Composing event channels and filtering
Spec: §2.8, p. 2-20 — “one event channel can consume events supplied by another”; the ProxyPushSupplier of a typed channel for I only pushes events of I and so acts as a type filter.
Repo: crates/corba-cos-event/src/channel.rs (proxies as PushConsumer/PushSupplier), crates/corba-cos-event/src/typed.rs (TypedEventChannel::dispatch by repository ID).
Tests: crates/corba-cos-event/src/typed.rs::tests::unknown_repo_id_dispatches_to_zero, crates/corba-cos-event/src/typed.rs::tests::dispatch_reaches_registered_consumers.
Status: partial — the type filter by repository ID is tested; no test chains two channels.
§2.9 Policies for finding event channels
Spec: §2.9, p. 2-20 — naming/trader-service references for channel discovery (informative).
Repo: —
Tests: —
Status: n/a (informative) — “The Event Service does not establish a policy for finding event channels.”
§3 Lightweight Event Service
§3.1 Platform Independent Model (PIM)
§3.1.1 Overview
Spec: §3.1.1 — lightweight-profile description.
Repo: —
Tests: —
Status: n/a (informative) — frame of the Lightweight profile; the mapping is in §3.1.2 and §3.1.3.
§3.1.2 The CosLightweightEventComm package
Spec: §3.1.2 — a lightweight variant of §2.1 (no typed event, no multi-consumer, reduced API).
Repo: crates/corba-cos-event/src/typed.rs::lightweight::{PROFILE_NAME, is_lightweight} as a profile marker; the lightweight subset uses the same
push path as TypedPushConsumer, without the disconnect lifecycle (via
channel destroy()).
Tests: typed::tests::{lightweight_profile_names_match_spec, lightweight_is_lightweight_recognizes_both_profiles}.
Status: done
§3.1.3 The CosLightweightEventChannel package
Spec: §3.1.3 — a lightweight variant of §2.3: the channel lifecycle is the only teardown, the profile has no endpoint disconnect operation.
Repo: crates/corba-cos-event/src/typed.rs::lightweight::CHANNEL_PROFILE_NAME
marker; the channel lifecycle via TypedEventChannel::destroy() without a
separate ConsumerAdmin/SupplierAdmin sub-profile (a profile subset of
§2.7.1).
Tests: crates/corba-cos-event/src/typed.rs::tests::lightweight_channel_destroy_is_the_only_teardown
(a consumer without a disconnect of its own receives no dispatches after
destroy());
crates/corba-cos-event/src/typed.rs::tests::lightweight_profile_names_match_spec.
Status: done
§3.2 Platform Specific Model: CORBA Service
§3.2.1 Overview
Spec: §3.2.1 — PSM marker.
Repo: —
Tests: —
Status: n/a (informative) — frame of the CORBA mapping; the IDL is in §3.2.2 and §3.2.3.
§3.2.2 CosEventChannelAdmin module (PSM)
Spec: §3.2.2 — IDL PSM, identical to §2.3.
Repo: identical to §2.3 (crates/corba-cos-event/src/channel.rs).
Tests: identical to §2.3 —
crates/corba-cos-event/src/channel.rs::tests:
event_channel_admins_share_one_channel_state,
consumer_admin_returns_a_fresh_proxy_per_call,
supplier_admin_returns_a_fresh_proxy_per_call,
proxy_push_consumer_push_before_connect_raises_disconnected,
proxy_pull_supplier_try_pull_reports_has_event_flag,
proxy_pull_consumer_forwards_pulled_events_into_the_channel,
proxy_push_supplier_disconnect_stops_event_delivery.
Status: done — see §2.3.
§3.2.3 CosEventComm module (PSM)
Spec: §3.2.3 — IDL PSM, identical to §2.1.
Repo: identical to §2.1 (crates/corba-cos-event/src/comm.rs).
Tests: identical to §2.1 —
crates/corba-cos-event/src/comm.rs::tests:
push_increments_counter_until_disconnect,
push_supplier_disconnect_terminates_the_connection,
pull_supplier_try_pull_returns_the_has_event_flag,
pull_supplier_pull_returns_the_queued_event,
pull_consumer_disconnect_terminates_the_connection,
disconnection_is_terminal_for_every_operation.
Status: done — see §2.1.
ZeroDDS-specific bridges (not an OMG item)
CosEvent → DDS-DCPS-topic bridge
Spec: not an OMG spec item; a ZeroDDS-specific migration layer that translates EventChannel push events into DDS-DCPS topics.
Repo: crates/corba-cos-event/src/dds_bridge.rs (TopicBridge as a
PushConsumer on the EventChannel; TopicMap as the repository-ID ⇒ topic
table with derive_topic_name as the fallback derivation for types that are
not listed; TopicSink as the handover point to the caller layer’s
DataWriter, which keeps the crate free of a DCPS dependency). An
unresolvable repository ID and a refusing sink both raise an error and count
in TopicBridge::rejected — never a silent drop.
Tests: crates/corba-cos-event/src/dds_bridge.rs::tests:
derives_topic_name_from_repository_id,
explicit_mapping_wins_over_derivation,
push_writes_the_payload_onto_the_resolved_topic,
unresolvable_repository_id_is_reported_not_dropped,
sink_failure_is_reported_not_swallowed,
disconnect_stops_forwarding,
event_channel_fan_out_reaches_the_dds_topic (a push into the EventChannel
reaches the DDS topic write).
Status: done — informative; not spec-required.
Audit status
26 done / 2 partial / 2 open / 0 blocked / 6 n/a (informative).
Open items: cos-event-service-1.4.open.en.md.
Test run: cargo test -p zerodds-corba-cos-event — 54 lib tests + 1 doc
test green, 0 failed.
OMG CORBAservices: Event Service v1.2 — Spec-Coverage (WP COS-EventService)
Spec: OMG CORBA Event Service v1.2 — formal/04-10-02 → (Oktober 2004, 65 Seiten).
Hinweis Filename-Versionierung: Der Spec-Coverage-Filename trägt
historisch das Suffix 1.4, die OMG-veröffentlichte Spec ist
v1.2 (es gibt keine 1.3 / 1.4 publiziert). Filename bleibt aus
Diff-/Referenz-Stabilität erhalten; Spec-Versionsangabe oben ist
maßgeblich.
Kontext. Der CORBA Event Service ist Voraussetzung für den
TimerEventService aus omg-time-1.1.md §2.2-§2.4 (TimerEventService
arbeitet mit CosEventChannelAdmin::EventChannel-Push-Channels) und
liefert das Event-Backend für die Event-Ports im CCM-Komponentenmodell
(siehe corba-3.3.md Part 3 §6.7).
Implementation:
crates/corba-cos-event/· docs.rs — CosEventComm, CosEventChannelAdmin und Typed-Event (§2.1/§2.3/§2.5/§2.7).
Crate-Mapping:
- §2.1 CosEventComm —
crates/corba-cos-event/src/comm.rs - §2.3 CosEventChannelAdmin —
crates/corba-cos-event/src/channel.rs - §2.5/§2.7 Typed Event —
crates/corba-cos-event/src/typed.rs - §3 Lightweight Event Service —
crates/corba-cos-event/src/typed.rs(lightweight) - CosEvent → DDS-Topic-Bridge (kein OMG-Item) —
crates/corba-cos-event/src/dds_bridge.rs
§1 Service Description
§1.1 Overview / §1.2 Event Communication / §1.3 Example Scenario
Spec: §1.1-§1.3, S. 1-1 bis 1-3 — Architektur-Überblick, Beispiel.
Repo: —
Tests: —
Status: n/a (informative) — Überblick und Beispielszenario.
§1.4 Design Principles / §1.5 Resolution of Technical Issues / §1.6 Quality of Service
Spec: §1.4-§1.6, S. 1-4 bis 1-6 — Design-Diskussion.
Repo: —
Tests: —
Status: n/a (informative) — Entwurfsprinzipien und Diskussion; §1.6 legt ausdrücklich keine Dienstgüte fest (“the event interfaces do not dictate qualities of service”).
§1.7 Generic Event Communication
Spec: §1.7, S. 1-7 — Push-/Pull-Modell-Einführung (informativ; normative Definitionen folgen in §2.1).
Repo: —
Tests: —
Status: n/a (informative) — Einführung; die normativen Definitionen stehen in §2.1.
§2 Modules and Interfaces
§2.1 The CosEventComm Module
Spec: §2.1, S. 2-1 — IDL-Modul CosEventComm mit den vier Basis-
Interfaces.
Repo: crates/corba-cos-event/src/comm.rs (Trait-Definitionen
PushConsumer, PushSupplier, PullSupplier, PullConsumer;
Helper-Typ AnyEvent als payload-agnostischer Container; Error
Disconnected und ConnectError).
Tests: crates/corba-cos-event/src/comm.rs::tests:
push_increments_counter_until_disconnect,
push_supplier_disconnect_terminates_the_connection,
pull_supplier_try_pull_returns_the_has_event_flag,
pull_consumer_disconnect_terminates_the_connection,
any_event_round_trip, connect_error_variants_distinct.
Status: done
§2.1.1 The PushConsumer Interface
Spec: §2.1.1 — interface PushConsumer { void push(in any data) raises (Disconnected); void disconnect_push_consumer(); };.
Repo: crates/corba-cos-event/src/comm.rs Trait PushConsumer mit
push(&self, event: AnyEvent) -> Result<(), Disconnected> +
disconnect_push_consumer(&self).
Tests: crates/corba-cos-event/src/comm.rs::tests::push_increments_counter_until_disconnect
(push zählt bis zum Disconnect, danach Disconnected);
crates/corba-cos-event/src/channel.rs::tests::proxy_push_consumer_push_before_connect_raises_disconnected
(push vor connect liefert Disconnected).
Status: done
§2.1.2 The PushSupplier Interface
Spec: §2.1.2 — interface PushSupplier { void disconnect_push_supplier(); };.
Repo: crates/corba-cos-event/src/comm.rs Trait PushSupplier; Channel-seitige
Implementation crates/corba-cos-event/src/channel.rs::ProxyPushSupplier
(impl PushSupplier for ProxyPushSupplier) — der Disconnect meldet den
Consumer beim Channel ab und ruft dessen
disconnect_push_consumer.
Tests: crates/corba-cos-event/src/comm.rs::tests::push_supplier_disconnect_terminates_the_connection;
crates/corba-cos-event/src/channel.rs::tests::proxy_push_supplier_disconnect_stops_event_delivery
(nach dem Disconnect erreicht kein weiteres Event den Consumer).
Status: done
§2.1.3 The PullSupplier Interface
Spec: §2.1.3 — pull()/try_pull()/disconnect_pull_supplier();
pull blockiert bis ein Event vorliegt, try_pull liefert zusätzlich
das has_event-Flag.
Repo: crates/corba-cos-event/src/comm.rs Trait PullSupplier mit
pull() -> Result<AnyEvent, Disconnected>,
try_pull() -> Result<(AnyEvent, bool), Disconnected>,
disconnect_pull_supplier().
Tests: crates/corba-cos-event/src/comm.rs::tests:
pull_supplier_try_pull_returns_the_has_event_flag (Flag true mit
Event, false mit leerem any),
pull_supplier_pull_returns_the_queued_event,
pull_supplier_disconnect_raises_disconnected_on_both_operations.
Status: done
§2.1.4 The PullConsumer Interface
Spec: §2.1.4 — disconnect_pull_consumer().
Repo: crates/corba-cos-event/src/comm.rs Trait PullConsumer; Channel-seitige
Implementation crates/corba-cos-event/src/channel.rs::ProxyPullConsumer
(impl PullConsumer for ProxyPullConsumer).
Tests: crates/corba-cos-event/src/comm.rs::tests::pull_consumer_disconnect_terminates_the_connection;
crates/corba-cos-event/src/channel.rs::tests::proxy_pull_consumer_connect_and_disconnect_lifecycle.
Status: done
§2.1.5 Disconnection Behavior
Spec: §2.1.5 — Disconnection-Lifecycle, Disconnected-Exception
beim Aufruf nach disconnect.
Repo: crates/corba-cos-event/src/comm.rs Error-Typ Disconnected + Disconnect-Pfade in den
Proxy-Implementations (crates/corba-cos-event/src/channel.rs).
Tests: crates/corba-cos-event/src/comm.rs::tests::disconnection_is_terminal_for_every_operation
(Disconnect ist terminal und idempotent, jede Operation meldet
danach Disconnected);
crates/corba-cos-event/src/channel.rs::tests::push_unregisters_a_consumer_that_reports_disconnected
(ein Consumer, der Disconnected meldet, wird abgemeldet statt still
übergangen); crates/corba-cos-event/src/channel.rs::tests::destroy_wakes_blocked_pull_with_disconnected.
Status: done
§2.2 Event Channels
Spec: §2.2, S. 2-4 — “The event channel is itself both a consumer and a supplier of the event data.” Push-Stil (Supplier pusht in den Kanal, der Kanal pusht zum Consumer), Pull-Stil (der Kanal pullt vom Supplier, der Consumer pullt vom Kanal), gemischte Stile, mehrere Consumer und Supplier je Kanal.
Repo: crates/corba-cos-event/src/channel.rs (EventChannel, ProxyPushConsumer, ProxyPullSupplier, ProxyPullConsumer, ProxyPushSupplier).
Tests: crates/corba-cos-event/src/channel.rs::tests::push_fan_out_to_multiple_consumers, crates/corba-cos-event/src/channel.rs::tests::pull_supplier_dequeues_events, crates/corba-cos-event/src/channel.rs::tests::proxy_pull_consumer_forwards_pulled_events_into_the_channel.
Status: done
§2.3 The CosEventChannelAdmin Module
Spec: §2.3, S. 2-8 — IDL-Modul CosEventChannelAdmin mit Channel-
und Admin-/Proxy-Interfaces.
Repo: crates/corba-cos-event/src/channel.rs (siehe
Sub-Items).
Tests: crates/corba-cos-event/src/channel.rs::tests:
event_channel_admins_share_one_channel_state,
consumer_admin_returns_a_fresh_proxy_per_call,
supplier_admin_returns_a_fresh_proxy_per_call,
push_fan_out_to_multiple_consumers,
proxy_pull_consumer_forwards_pulled_events_into_the_channel.
Status: done
§2.3.1 The EventChannel Interface
Spec: §2.3.1 — interface EventChannel { ConsumerAdmin for_consumers(); SupplierAdmin for_suppliers(); void destroy(); };;
destroy gibt den Channel frei und löst die verbundenen Endpunkte.
Repo: crates/corba-cos-event/src/channel.rs EventChannel mit for_consumers,
for_suppliers, destroy, is_destroyed.
Tests: crates/corba-cos-event/src/channel.rs::tests:
event_channel_admins_share_one_channel_state (beide Admin-Sichten
adressieren denselben Channel-State),
destroy_disconnects_registered_consumers (destroy ruft
disconnect_push_consumer auf jedem registrierten Consumer),
destroy_disconnects_proxies,
destroy_wakes_blocked_pull_with_disconnected.
Status: done
§2.3.2 The ConsumerAdmin Interface
Spec: §2.3.2 — obtain_push_supplier(), obtain_pull_supplier();
jeder Aufruf liefert einen eigenen Proxy.
Repo: crates/corba-cos-event/src/channel.rs ConsumerAdmin.
Tests: crates/corba-cos-event/src/channel.rs::tests::consumer_admin_returns_a_fresh_proxy_per_call
(zwei Aufrufe liefern verschiedene Proxies; der zweite ist unverbunden
und nimmt seinen eigenen Consumer an).
Status: done
§2.3.3 The SupplierAdmin Interface
Spec: §2.3.3 — obtain_push_consumer(), obtain_pull_consumer();
jeder Aufruf liefert einen eigenen Proxy.
Repo: crates/corba-cos-event/src/channel.rs SupplierAdmin.
Tests: crates/corba-cos-event/src/channel.rs::tests::supplier_admin_returns_a_fresh_proxy_per_call.
Status: done
§2.3.4 The ProxyPushConsumer Interface
Spec: §2.3.4 — connect_push_supplier() raises
AlreadyConnected; push vor dem Connect ist Disconnected.
Repo: crates/corba-cos-event/src/channel.rs ProxyPushConsumer (connect_push_supplier,
impl PushConsumer).
Tests: crates/corba-cos-event/src/channel.rs::tests:
proxy_push_consumer_push_before_connect_raises_disconnected,
double_connect_yields_already_connected,
push_fan_out_to_multiple_consumers.
Status: done
§2.3.5 The ProxyPullSupplier Interface
Spec: §2.3.5 — connect_pull_consumer() raises
AlreadyConnected; pull blockiert bis ein Event vorliegt,
try_pull liefert das has_event-Flag.
Repo: crates/corba-cos-event/src/channel.rs ProxyPullSupplier (connect_pull_consumer,
impl PullSupplier; das blockierende pull wartet auf der
Condvar ChannelInner::ready, nicht in einer Poll-Schleife).
Tests: crates/corba-cos-event/src/channel.rs::tests:
proxy_pull_supplier_try_pull_reports_has_event_flag,
proxy_pull_supplier_pull_blocks_until_an_event_arrives (der Aufruf
kehrt erst zurück, nachdem ein Supplier gepusht hat),
proxy_pull_supplier_double_connect_yields_already_connected,
pull_supplier_dequeues_events, pull_supplier_disconnect_propagates.
Status: done
§2.3.6 The ProxyPullConsumer Interface
Spec: §2.3.6 — connect_pull_supplier() raises
AlreadyConnected; geerbtes disconnect_pull_consumer().
Repo: crates/corba-cos-event/src/channel.rs ProxyPullConsumer mit connect_pull_supplier,
forward_event als Push-Pfad in den Channel und
impl PullConsumer für den Disconnect.
Tests: crates/corba-cos-event/src/channel.rs::tests:
proxy_pull_consumer_forwards_pulled_events_into_the_channel (die vom
Supplier gezogenen Events erscheinen auf der Consumer-Seite des
Channels), proxy_pull_consumer_connect_and_disconnect_lifecycle.
Status: done
§2.3.7 The ProxyPushSupplier Interface
Spec: §2.3.7 — connect_push_consumer() raises
AlreadyConnected; disconnect_push_supplier() beendet die
Verbindung.
Repo: crates/corba-cos-event/src/channel.rs ProxyPushSupplier mit connect_push_consumer,
is_connected und impl PushSupplier (disconnect_push_supplier).
Tests: crates/corba-cos-event/src/channel.rs::tests:
proxy_push_supplier_double_connect_yields_already_connected,
proxy_push_supplier_disconnect_stops_event_delivery.
Status: done
§2.4 Typed Event Communication
Spec: §2.4, S. 2-12 bis 2-13 — Typed Push: der Supplier ruft Operationen der vereinbarten Schnittstelle I am Consumer auf. Typed Pull: zu jeder Schnittstelle I ist Pull<I> definiert, “For every operation o in I, Pull contains two operations”: pull_o (blockiert, liefert die Ereignisdaten als out-Parameter) und boolean try_o.
Repo: crates/corba-cos-event/src/typed.rs (TypedInvocation, TypedPushConsumer::invoke, TypedPullSupplier::pull/try_pull).
Tests: crates/corba-cos-event/src/typed.rs::tests::typed_push_consumer_invoke_carries_operation_and_args, crates/corba-cos-event/src/typed.rs::tests::pull_supplier_try_pull_returns_queued_event.
Status: partial — Typed Push (Operationsname und Argumente erreichen den Consumer) und Typed Pull in generischer Form (TypedInvocation) sind umgesetzt; es fehlt die abgeleitete Schnittstelle Pull<I>, eigenes Item.
§2.4.2 Abgeleitete Schnittstelle Pull
Spec: §2.4.2, S. 2-13 — zu jeder Operation o von I enthält Pull<I> die Operationen pull_o (alle in-Parameter werden out-Parameter; blockiert, bis ein o-Ereignis vorliegt) und boolean try_o (liefert false, wenn kein o-Ereignis vorliegt).
Repo: —
Tests: —
Status: open — kein Code erzeugt oder bildet Pull<I> ab; TypedPullSupplier liefert jede Operation als generisches TypedInvocation.
§2.5 The CosTypedEventComm Module
Spec: §2.5, S. 2-14 — IDL-Modul CosTypedEventComm mit
TypedPushConsumer und TypedPullSupplier.
Repo: crates/corba-cos-event/src/typed.rs (TypedPushConsumer,
TypedPushSupplier, TypedPullSupplier-Traits und Helper-Typ
TypedInvocation).
Tests: crates/corba-cos-event/src/typed.rs::tests:
typed_push_consumer_invoke_carries_operation_and_args,
typed_push_supplier_disconnect_terminates_the_connection,
pull_supplier_try_pull_returns_queued_event.
Status: done — alle drei Subscription-Patterns ausgewiesen.
§2.5.1 The TypedPushConsumer Interface
Spec: §2.5.1 — TypedPushConsumer : PushConsumer { Object get_typed_consumer(); };; im Typed-Modus ruft der Channel die
IDL-Operation statt push(any).
Repo: typed.rs Trait TypedPushConsumer (mit
get_typed_consumer-Pendant via TypedInvocation-Dispatch).
Tests: crates/corba-cos-event/src/typed.rs::tests:
typed_push_consumer_invoke_carries_operation_and_args
(Operations-Name und kodierte Argumente erreichen den Consumer, die
Antwort geht zurück),
typed_push_consumer_disconnect_raises_disconnected,
dispatch_reaches_registered_consumers.
Status: done
§2.5.2 The TypedPullSupplier Interface
Spec: §2.5.2 — TypedPullSupplier : PullSupplier { Object get_typed_supplier(); };.
Repo: crates/corba-cos-event/src/typed.rs::TypedPullSupplier
Trait mit pull/try_pull/disconnect Operations.
Tests: typed::tests::{pull_supplier_try_pull_returns_queued_event, pull_supplier_try_pull_returns_none_for_empty, pull_supplier_disconnect_returns_error}.
Status: done
§2.6 Typed Event Channels
Spec: §2.6, S. 2-16 — “Typed event channels […] support both typed and generic event communication. These forms can be mixed at will. […] An event supplied in typed form can be consumed in generic form, or vice versa.”
Repo: —
Tests: —
Status: open — TypedEventChannel (crates/corba-cos-event/src/typed.rs) stellt nur an typisierte Consumer zu; eine Umsetzung zwischen typisierter und generischer Form fehlt.
§2.7 The CosTypedEventChannelAdmin Module
Spec: §2.7, S. 2-16 — IDL-Modul mit TypedEventChannel + TypedConsumerAdmin/TypedSupplierAdmin + Typed-Proxies.
Repo: typed.rs TypedEventChannel mit for_consumers()/
for_suppliers()/destroy() + getrennte TypedConsumerAdmin
und TypedSupplierAdmin Strukturen + TypedPullSupplier-Trait
für den Pull-Proxy-Pfad.
Tests: crates/corba-cos-event/src/typed.rs::tests:
typed_event_channel_for_consumers_returns_admin,
typed_event_channel_for_suppliers_returns_admin,
typed_consumer_admin_register_count_roundtrip,
typed_supplier_admin_try_pull_returns_first_available,
destroy_disables_dispatch.
Status: done — Channel + Admin-Splits + Proxies live.
§2.7.1 The TypedEventChannel Interface
Spec: §2.7.1 — for_consumers/for_suppliers/destroy analog
§2.3.1.
Repo: typed.rs::TypedEventChannel::{for_consumers, for_suppliers, destroy, is_destroyed}.
Tests: typed::tests::{typed_event_channel_for_consumers_returns_admin, typed_event_channel_for_suppliers_returns_admin, destroy_disables_dispatch}.
Status: done
§2.7.2-§2.7.5 Typed Admin/Proxy Interfaces
Spec: §2.7.2-§2.7.5 — TypedConsumerAdmin, TypedSupplierAdmin, TypedProxyPushConsumer, TypedProxyPullSupplier.
Repo: typed.rs::{TypedConsumerAdmin, TypedSupplierAdmin} mit
register_consumer/register_pull_supplier/try_pull/Counter-
Operationen. TypedProxyPushConsumer ist via existierender
TypedPushConsumer-Trait abgedeckt; TypedProxyPullSupplier
über den neuen TypedPullSupplier-Trait.
Tests: typed::tests::{typed_consumer_admin_register_count_roundtrip, typed_supplier_admin_register_count_roundtrip, typed_supplier_admin_try_pull_returns_first_available}.
Status: done — Admin-/Proxy-Split implementiert.
§2.8 Composing Event Channels and Filtering
Spec: §2.8, S. 2-20 — “one event channel can consume events supplied by another”; der ProxyPushSupplier eines typisierten Kanals für I pusht nur Ereignisse zu I und wirkt damit als Typfilter.
Repo: crates/corba-cos-event/src/channel.rs (Proxies als PushConsumer/PushSupplier), crates/corba-cos-event/src/typed.rs (TypedEventChannel::dispatch nach Repository-ID).
Tests: crates/corba-cos-event/src/typed.rs::tests::unknown_repo_id_dispatches_to_zero, crates/corba-cos-event/src/typed.rs::tests::dispatch_reaches_registered_consumers.
Status: partial — der Typfilter nach Repository-ID ist getestet; kein Test verkettet zwei Kanäle.
§2.9 Policies for Finding Event Channels
Spec: §2.9, S. 2-20 — Naming-/Trader-Service-Verweise zur Channel-Discovery (informativ).
Repo: —
Tests: —
Status: n/a (informative) — “The Event Service does not establish a policy for finding event channels.”
§3 Lightweight Event Service
§3.1 Platform Independent Model (PIM)
§3.1.1 Overview
Spec: §3.1.1 — Lightweight-Profile-Beschreibung.
Repo: —
Tests: —
Status: n/a (informative) — Rahmen des Lightweight-Profils; die Abbildung steht in §3.1.2 und §3.1.3.
§3.1.2 The CosLightweightEventComm Package
Spec: §3.1.2 — Lightweight-Variante von §2.1 (kein Typed-Event, kein Multi-Consumer, reduzierte API).
Repo: crates/corba-cos-event/src/typed.rs::lightweight:: {PROFILE_NAME, is_lightweight} als Profile-Marker; das
Lightweight-Subset nutzt denselben Push-Pfad wie
TypedPushConsumer, ohne disconnect-Lifecycle (per
Channel-destroy()).
Tests: typed::tests::{lightweight_profile_names_match_spec, lightweight_is_lightweight_recognizes_both_profiles}.
Status: done
§3.1.3 The CosLightweightEventChannel Package
Spec: §3.1.3 — Lightweight-Variante von §2.3: der Channel- Lifecycle ist der einzige Teardown, das Profil kennt keine Endpunkt-Disconnect-Operation.
Repo: crates/corba-cos-event/src/typed.rs::lightweight:: CHANNEL_PROFILE_NAME Marker; Channel-Lifecycle über
TypedEventChannel::destroy() ohne separates
ConsumerAdmin/SupplierAdmin-Sub-Profil (Profile-Subset von §2.7.1).
Tests: crates/corba-cos-event/src/typed.rs::tests::lightweight_channel_destroy_is_the_only_teardown
(ein Consumer ohne eigenen Disconnect erhält nach destroy() keine
Dispatches mehr);
crates/corba-cos-event/src/typed.rs::tests::lightweight_profile_names_match_spec.
Status: done
§3.2 Platform Specific Model: CORBA Service
§3.2.1 Overview
Spec: §3.2.1 — PSM-Marker.
Repo: —
Tests: —
Status: n/a (informative) — Rahmen der CORBA-Abbildung; die IDL steht in §3.2.2 und §3.2.3.
§3.2.2 CosEventChannelAdmin Module (PSM)
Spec: §3.2.2 — IDL-PSM, identisch zu §2.3.
Repo: identisch §2.3 (crates/corba-cos-event/src/channel.rs).
Tests: identisch §2.3 —
crates/corba-cos-event/src/channel.rs::tests:
event_channel_admins_share_one_channel_state,
consumer_admin_returns_a_fresh_proxy_per_call,
supplier_admin_returns_a_fresh_proxy_per_call,
proxy_push_consumer_push_before_connect_raises_disconnected,
proxy_pull_supplier_try_pull_reports_has_event_flag,
proxy_pull_consumer_forwards_pulled_events_into_the_channel,
proxy_push_supplier_disconnect_stops_event_delivery.
Status: done — siehe §2.3.
§3.2.3 CosEventComm Module (PSM)
Spec: §3.2.3 — IDL-PSM, identisch zu §2.1.
Repo: identisch §2.1 (crates/corba-cos-event/src/comm.rs).
Tests: identisch §2.1 —
crates/corba-cos-event/src/comm.rs::tests:
push_increments_counter_until_disconnect,
push_supplier_disconnect_terminates_the_connection,
pull_supplier_try_pull_returns_the_has_event_flag,
pull_supplier_pull_returns_the_queued_event,
pull_consumer_disconnect_terminates_the_connection,
disconnection_is_terminal_for_every_operation.
Status: done — siehe §2.1.
ZeroDDS-spezifische Bridges (kein OMG-Item)
CosEvent → DDS-DCPS-Topic Bridge
Spec: kein OMG-Spec-Item; ZeroDDS-spezifische Migrations-Schicht, die EventChannel-Push-Events in DDS-DCPS-Topics übersetzt.
Repo: crates/corba-cos-event/src/dds_bridge.rs
(TopicBridge als PushConsumer am EventChannel; TopicMap als
Repository-ID ⇒ Topic-Tabelle mit derive_topic_name als Ableitung
für nicht eingetragene Typen; TopicSink als Übergabepunkt an den
DataWriter der aufrufenden Schicht — dadurch bleibt das Crate frei von
einer DCPS-Abhängigkeit). Ein nicht auflösbarer Repository-ID und ein
ablehnender Sink erzeugen einen Fehler und zählen in
TopicBridge::rejected, kein stiller Drop.
Tests: crates/corba-cos-event/src/dds_bridge.rs::tests:
derives_topic_name_from_repository_id,
explicit_mapping_wins_over_derivation,
push_writes_the_payload_onto_the_resolved_topic,
unresolvable_repository_id_is_reported_not_dropped,
sink_failure_is_reported_not_swallowed,
disconnect_stops_forwarding,
event_channel_fan_out_reaches_the_dds_topic (Push in den
EventChannel erreicht den DDS-Topic-Write).
Status: done — informativ; nicht spec-pflichtig.
Audit-Status
26 done / 2 partial / 2 open / 0 blocked / 6 n/a (informative).
Offene Punkte: cos-event-service-1.4.open.md.
Test-Lauf: cargo test -p zerodds-corba-cos-event — 54 Lib-Tests +
1 Doc-Test grün, 0 failed.