Safe API Framework 0.1.0 build 384e6ae
Layered API framework for safety-related applications (ERTMS RBC reference targeting CENELEC EN 50128 SIL 4)
Loading...
Searching...
No Matches
rte_ipc_pubsub.h File Reference

IPC Publish-Subscribe Pattern (one-to-many broadcasting). More...

Include dependency graph for rte_ipc_pubsub.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  rte_ipc_pubsub_topic_config_t
 Configuration for a pub-sub topic. More...
struct  rte_ipc_pubsub_subscriber_config_t
 Configuration for a subscriber. More...

Typedefs

typedef struct rte_ipc_pubsub_topic_s * rte_ipc_pubsub_topic_t
 Publish-subscribe topic handle.
typedef struct rte_ipc_pubsub_subscriber_s * rte_ipc_pubsub_subscriber_t
 Subscriber handle for receiving from a topic.

Functions

rte_status_t rte_ipc_pubsub_topic_create (rte_ipc_pubsub_topic_t *topic_out, const rte_ipc_pubsub_topic_config_t *config)
 Create a publish-subscribe topic.
rte_status_t rte_ipc_pubsub_publish (rte_ipc_pubsub_topic_t topic, const void *message, size_t message_size)
 Publish a message to all subscribers on a topic.
rte_status_t rte_ipc_pubsub_topic_destroy (rte_ipc_pubsub_topic_t topic)
 Destroy a publish-subscribe topic.
rte_status_t rte_ipc_pubsub_subscribe (rte_ipc_pubsub_subscriber_t *subscriber_out, const rte_ipc_pubsub_subscriber_config_t *config)
 Subscribe to a topic.
rte_status_t rte_ipc_pubsub_receive (rte_ipc_pubsub_subscriber_t subscriber, void *message_out, size_t message_size, rte_duration_ms_t timeout_ms)
 Receive a message from subscribed topic (blocking with timeout).
rte_status_t rte_ipc_pubsub_unsubscribe (rte_ipc_pubsub_subscriber_t subscriber)
 Unsubscribe from a topic.

Detailed Description

IPC Publish-Subscribe Pattern (one-to-many broadcasting).

Implements publish-subscribe communication where one publisher sends messages to multiple subscribers on a topic. Subscribers are registered at initialization time (static, no dynamic registration).

Safety Properties:

  • Static subscriber registration (no surprise subscribers)
  • Decouples publishers from subscribers
  • Bounded queues per subscriber (no unbounded growth)
  • Delivery guarantees (at-least-once)
  • Type-safe message handling

Use Case:

  • Track database publishes state changes (topic="track_status")
  • Multiple controllers subscribe: signal manager, speed manager, router
  • Each reacts independently without knowing about others

Architecture:

Publisher
│
rte_ipc_publish()
│
▼
┌──────────────────┐
│ Topic "track" │
│ (broadcast) │
└────┬─┬─┬────────┘
│ │ │
┌────▼─▼─▼────────────────────┐
│ Subscriber Queues │
├──────────────────────────────┤
│ [Queue] Signal Manager │
│ [Queue] Speed Manager │
│ [Queue] Route Manager │
└──────────────────────────────┘
│ │ │
▼ ▼ ▼
Consumer Consumer Consumer

Definition in file rte_ipc_pubsub.h.

Typedef Documentation

◆ rte_ipc_pubsub_topic_t

typedef struct rte_ipc_pubsub_topic_s* rte_ipc_pubsub_topic_t

Publish-subscribe topic handle.

Definition at line 65 of file rte_ipc_pubsub.h.

◆ rte_ipc_pubsub_subscriber_t

typedef struct rte_ipc_pubsub_subscriber_s* rte_ipc_pubsub_subscriber_t

Subscriber handle for receiving from a topic.

Definition at line 142 of file rte_ipc_pubsub.h.

Function Documentation

◆ rte_ipc_pubsub_topic_create()

rte_status_t rte_ipc_pubsub_topic_create ( rte_ipc_pubsub_topic_t * topic_out,
const rte_ipc_pubsub_topic_config_t * config )

Create a publish-subscribe topic.

Topics are created before any publishers or subscribers are attached.

Parameters
topic_outReceives topic handle (not NULL)
configTopic configuration (not NULL)
Returns
RTE_STATUS_OK on success RTE_STATUS_INVALID_PARAM if config is invalid

Example:

.topic_name = "track_status",
.message_size = sizeof(track_status_t),
.max_subscribers = 5
};
rte_ipc_pubsub_topic_create(&topic, &topic_config);
struct rte_ipc_pubsub_topic_s * rte_ipc_pubsub_topic_t
Publish-subscribe topic handle.
rte_status_t rte_ipc_pubsub_topic_create(rte_ipc_pubsub_topic_t *topic_out, const rte_ipc_pubsub_topic_config_t *config)
Create a publish-subscribe topic.
Configuration for a pub-sub topic.
Track status event (published to all subscribers).

Local makros Local types declarations Local variables declarations Global variables declarations Local function declarations Global functions

Definition at line 25 of file rte_ipc_pubsub.c.

◆ rte_ipc_pubsub_publish()

rte_status_t rte_ipc_pubsub_publish ( rte_ipc_pubsub_topic_t topic,
const void * message,
size_t message_size )

Publish a message to all subscribers on a topic.

Message is delivered to all registered subscribers asynchronously. If a subscriber queue is full, behavior depends on overflow strategy.

Parameters
topicTopic handle (not NULL)
messageMessage to publish (not NULL)
message_sizeSize of message
Returns
RTE_STATUS_OK on success RTE_STATUS_INVALID_PARAM if arguments invalid RTE_STATUS_ERROR if delivery failed

Example:

track_status_t status = {
.track_id = 1,
.occupancy = OCCUPIED,
.speed_limit = 40
};
rte_ipc_pubsub_publish(topic, &status, sizeof(status));
rte_status_t rte_ipc_pubsub_publish(rte_ipc_pubsub_topic_t topic, const void *message, size_t message_size)
Publish a message to all subscribers on a topic.

Definition at line 53 of file rte_ipc_pubsub.c.

◆ rte_ipc_pubsub_topic_destroy()

rte_status_t rte_ipc_pubsub_topic_destroy ( rte_ipc_pubsub_topic_t topic)

Destroy a publish-subscribe topic.

Parameters
topicTopic handle (not NULL)
Returns
RTE_STATUS_OK on success

Definition at line 67 of file rte_ipc_pubsub.c.

◆ rte_ipc_pubsub_subscribe()

rte_status_t rte_ipc_pubsub_subscribe ( rte_ipc_pubsub_subscriber_t * subscriber_out,
const rte_ipc_pubsub_subscriber_config_t * config )

Subscribe to a topic.

Registers a subscriber to receive messages from a topic. Must be called during initialization, before publishing.

Parameters
subscriber_outReceives subscriber handle (not NULL)
configSubscriber configuration (not NULL)
Returns
RTE_STATUS_OK on success RTE_STATUS_INVALID_PARAM if config invalid RTE_STATUS_ERROR if max subscribers reached

Example:

.subscriber_name = "signal_manager",
.topic = track_status_topic,
.queue_depth = 10
};
rte_ipc_pubsub_subscribe(&subscriber, &sub_config);
struct rte_ipc_pubsub_subscriber_s * rte_ipc_pubsub_subscriber_t
Subscriber handle for receiving from a topic.
rte_status_t rte_ipc_pubsub_subscribe(rte_ipc_pubsub_subscriber_t *subscriber_out, const rte_ipc_pubsub_subscriber_config_t *config)
Subscribe to a topic.
Configuration for a subscriber.

Definition at line 77 of file rte_ipc_pubsub.c.

◆ rte_ipc_pubsub_receive()

rte_status_t rte_ipc_pubsub_receive ( rte_ipc_pubsub_subscriber_t subscriber,
void * message_out,
size_t message_size,
rte_duration_ms_t timeout_ms )

Receive a message from subscribed topic (blocking with timeout).

Parameters
subscriberSubscriber handle (not NULL)
message_outDestination buffer for message (not NULL)
message_sizeMax size of message buffer
timeout_msMax wait time; 0 = poll, UINT32_MAX = infinite
Returns
RTE_STATUS_OK on success (message received) RTE_STATUS_TIMEOUT if no message within timeout RTE_STATUS_INVALID_PARAM on invalid arguments

Example:

subscriber,
&status, sizeof(status),
1000 // Poll every 1 second
);
if (result == RTE_STATUS_OK) {
printf("Track %d status: %d\n", status.track_id, status.occupancy);
// React to status change...
}
rte_status_t
Common result/status codes.
Definition rte_status.h:27
@ RTE_STATUS_OK
Definition rte_status.h:28
rte_status_t rte_ipc_pubsub_receive(rte_ipc_pubsub_subscriber_t subscriber, void *message_out, size_t message_size, rte_duration_ms_t timeout_ms)
Receive a message from subscribed topic (blocking with timeout).

Definition at line 95 of file rte_ipc_pubsub.c.

◆ rte_ipc_pubsub_unsubscribe()

rte_status_t rte_ipc_pubsub_unsubscribe ( rte_ipc_pubsub_subscriber_t subscriber)

Unsubscribe from a topic.

Parameters
subscriberSubscriber handle (not NULL)
Returns
RTE_STATUS_OK on success

Definition at line 108 of file rte_ipc_pubsub.c.