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

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

Include dependency graph for sapi_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  sapi_ipc_pubsub_topic_config_t
 Configuration for a pub-sub topic. More...
struct  sapi_ipc_pubsub_subscriber_config_t
 Configuration for a subscriber. More...

Typedefs

typedef struct sapi_ipc_pubsub_topic_s * sapi_ipc_pubsub_topic_t
 Publish-subscribe topic handle.
typedef struct sapi_ipc_pubsub_subscriber_s * sapi_ipc_pubsub_subscriber_t
 Subscriber handle for receiving from a topic.

Functions

sapi_status_t sapi_ipc_pubsub_topic_create (sapi_ipc_pubsub_topic_t *topic_out, const sapi_ipc_pubsub_topic_config_t *config)
 Create a publish-subscribe topic.
sapi_status_t sapi_ipc_pubsub_publish (sapi_ipc_pubsub_topic_t topic, const void *message, size_t message_size)
 Publish a message to all subscribers on a topic.
sapi_status_t sapi_ipc_pubsub_topic_destroy (sapi_ipc_pubsub_topic_t topic)
 Destroy a publish-subscribe topic.
sapi_status_t sapi_ipc_pubsub_subscribe (sapi_ipc_pubsub_subscriber_t *subscriber_out, const sapi_ipc_pubsub_subscriber_config_t *config)
 Subscribe to a topic.
sapi_status_t sapi_ipc_pubsub_receive (sapi_ipc_pubsub_subscriber_t subscriber, void *message_out, size_t message_size, sapi_duration_ms_t timeout_ms)
 Receive a message from subscribed topic (blocking with timeout).
sapi_status_t sapi_ipc_pubsub_unsubscribe (sapi_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
sapi_ipc_publish()
┌──────────────────┐
│ Topic "track"
│ (broadcast) │
└────┬─┬─┬────────┘
│ │ │
┌────▼─▼─▼────────────────────┐
│ Subscriber Queues │
├──────────────────────────────┤
│ [Queue] Signal Manager │
│ [Queue] Speed Manager │
│ [Queue] Route Manager │
└──────────────────────────────┘
│ │ │
▼ ▼ ▼
Consumer Consumer Consumer

Definition in file sapi_ipc_pubsub.h.

Typedef Documentation

◆ sapi_ipc_pubsub_topic_t

typedef struct sapi_ipc_pubsub_topic_s* sapi_ipc_pubsub_topic_t

Publish-subscribe topic handle.

Definition at line 65 of file sapi_ipc_pubsub.h.

◆ sapi_ipc_pubsub_subscriber_t

typedef struct sapi_ipc_pubsub_subscriber_s* sapi_ipc_pubsub_subscriber_t

Subscriber handle for receiving from a topic.

Definition at line 142 of file sapi_ipc_pubsub.h.

Function Documentation

◆ sapi_ipc_pubsub_topic_create()

sapi_status_t sapi_ipc_pubsub_topic_create ( sapi_ipc_pubsub_topic_t * topic_out,
const sapi_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
SAPI_STATUS_OK on success SAPI_STATUS_INVALID_PARAM if config is invalid

Example:

.topic_name = "track_status",
.message_size = sizeof(track_status_t),
.max_subscribers = 5
};
sapi_ipc_pubsub_topic_create(&topic, &topic_config);
sapi_status_t sapi_ipc_pubsub_topic_create(sapi_ipc_pubsub_topic_t *topic_out, const sapi_ipc_pubsub_topic_config_t *config)
Create a publish-subscribe topic.
struct sapi_ipc_pubsub_topic_s * sapi_ipc_pubsub_topic_t
Publish-subscribe topic handle.
Configuration for a pub-sub topic.

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

Definition at line 25 of file sapi_ipc_pubsub.c.

◆ sapi_ipc_pubsub_publish()

sapi_status_t sapi_ipc_pubsub_publish ( sapi_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
SAPI_STATUS_OK on success SAPI_STATUS_INVALID_PARAM if arguments invalid SAPI_STATUS_ERROR if delivery failed

Example:

track_status_t status = {
.track_id = 1,
.occupancy = OCCUPIED,
.speed_limit = 40
};
sapi_ipc_pubsub_publish(topic, &status, sizeof(status));
sapi_status_t sapi_ipc_pubsub_publish(sapi_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 sapi_ipc_pubsub.c.

◆ sapi_ipc_pubsub_topic_destroy()

sapi_status_t sapi_ipc_pubsub_topic_destroy ( sapi_ipc_pubsub_topic_t topic)

Destroy a publish-subscribe topic.

Parameters
topicTopic handle (not NULL)
Returns
SAPI_STATUS_OK on success

Definition at line 67 of file sapi_ipc_pubsub.c.

◆ sapi_ipc_pubsub_subscribe()

sapi_status_t sapi_ipc_pubsub_subscribe ( sapi_ipc_pubsub_subscriber_t * subscriber_out,
const sapi_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
SAPI_STATUS_OK on success SAPI_STATUS_INVALID_PARAM if config invalid SAPI_STATUS_ERROR if max subscribers reached

Example:

.subscriber_name = "signal_manager",
.topic = track_status_topic,
.queue_depth = 10
};
sapi_ipc_pubsub_subscribe(&subscriber, &sub_config);
sapi_status_t sapi_ipc_pubsub_subscribe(sapi_ipc_pubsub_subscriber_t *subscriber_out, const sapi_ipc_pubsub_subscriber_config_t *config)
Subscribe to a topic.
struct sapi_ipc_pubsub_subscriber_s * sapi_ipc_pubsub_subscriber_t
Subscriber handle for receiving from a topic.
Configuration for a subscriber.

Definition at line 77 of file sapi_ipc_pubsub.c.

◆ sapi_ipc_pubsub_receive()

sapi_status_t sapi_ipc_pubsub_receive ( sapi_ipc_pubsub_subscriber_t subscriber,
void * message_out,
size_t message_size,
sapi_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
SAPI_STATUS_OK on success (message received) SAPI_STATUS_TIMEOUT if no message within timeout SAPI_STATUS_INVALID_PARAM on invalid arguments

Example:

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

Definition at line 95 of file sapi_ipc_pubsub.c.

◆ sapi_ipc_pubsub_unsubscribe()

sapi_status_t sapi_ipc_pubsub_unsubscribe ( sapi_ipc_pubsub_subscriber_t subscriber)

Unsubscribe from a topic.

Parameters
subscriberSubscriber handle (not NULL)
Returns
SAPI_STATUS_OK on success

Definition at line 108 of file sapi_ipc_pubsub.c.