porter/libsrc/porter/infra/potrSendQueue.h

1 ファイル

1.1 porter/libsrc/porter/infra/potrSendQueue.h

非同期送信キューの型定義と操作関数。

ノンブロッキング送信 (potrSend の flags に POTR_SEND_BLOCKING なし) で使用される スレッドセーフな送信キューです。
ペイロードエレメントをリングバッファに積み、送信スレッドが順に sendto で送出します。
ブロッキング送信は potr_send_queue_wait_drained() で先行キューの sendto 完了を待ってから直接送信します。

1.1.1 作者

c-modernization-kit sample team

1.1.2 バージョン

1.0.0

1.1.3 日付

2026/03/08

1.1.4 インクルード元

potrSendQueue.h のインクルード元

1.1.5 インクルード先

potrSendQueue.h のインクルード先

1.1.6 著作権

Copyright (C) CompanyName, Ltd. 2026. All rights reserved.

2 関数

2.1 potr_send_queue_init

int potr_send_queue_init ( PotrSendQueue *q, size_t depth, uint16_t max_payload )

2.2 potr_send_queue_destroy

void potr_send_queue_destroy ( PotrSendQueue *q )

2.3 potr_send_queue_push

int potr_send_queue_push ( PotrSendQueue *q, PotrPeerId peer_id, uint16_t flags, const void *payload, uint16_t payload_len )

2.4 potr_send_queue_push_wait

int potr_send_queue_push_wait ( PotrSendQueue *q, PotrPeerId peer_id, uint16_t flags, const void *payload, uint16_t payload_len, volatile int *running )

2.5 potr_send_queue_pop

int potr_send_queue_pop ( PotrSendQueue *q, PotrPayloadElem *out, volatile int *running )

2.6 potr_send_queue_peek

int potr_send_queue_peek ( PotrSendQueue *q, PotrPayloadElem *out )

2.7 potr_send_queue_peek_timed

int potr_send_queue_peek_timed ( PotrSendQueue *q, PotrPayloadElem *out, uint32_t timeout_ms )

2.8 potr_send_queue_try_pop

int potr_send_queue_try_pop ( PotrSendQueue *q, PotrPayloadElem *out )

2.9 potr_send_queue_complete

void potr_send_queue_complete ( PotrSendQueue *q )

2.10 potr_send_queue_wait_drained

void potr_send_queue_wait_drained ( PotrSendQueue *q )

2.11 potr_send_queue_shutdown

void potr_send_queue_shutdown ( PotrSendQueue *q )

3

3.1 PotrMutex

typedef pthread_mutex_t PotrMutex;

3.2 PotrCondVar

typedef pthread_cond_t PotrCondVar;

4 クラス/構造体

4.1 PotrPayloadElem

struct PotrPayloadElem {
    PotrPeerId peer_id;
    uint16_t flags;
    uint16_t payload_len;
    uint8_t *payload;
}

送信キューの 1 エントリ。ペイロードエレメント 1 個分のデータを保持する。

外側パケットの構築 (seq_num 付与・window_send_push・sendto) は送信スレッドが行う。
本エントリはペイロードエレメントのデータのみを保持し、再送バッファには登録しない。
payload はキュー初期化時に確保したプールスロットを指す。
N:1 モードでは peer_id が送信先ピアを示す。1:1 モードでは 0。

4.1.1 属性

4.1.1.1 peer_id

PotrPeerId peer_id;

送信先ピア識別子 (N:1 モード用。1:1 モードでは 0)。

4.1.1.2 flags

uint16_t flags;

ペイロードエレメントフラグ (MORE_FRAG, COMPRESSED など)。

4.1.1.3 payload_len

uint16_t payload_len;

ペイロード長 (バイト)。

4.1.1.4 payload

uint8_t *payload;

ペイロードデータへのポインタ (プールスロット内を指す)。

4.2 PotrSendQueue

struct PotrSendQueue {
    PotrPayloadElem *entries;
    uint8_t *payload_pool;
    size_t depth;
    size_t head;
    size_t tail;
    size_t count;
    size_t inflight;
    PotrMutex mutex;
    PotrCondVar not_empty;
    PotrCondVar not_full;
    PotrCondVar drained;
}

非同期送信キュー。

リングバッファとミューテックス・条件変数により、 potrSend 呼び出し元スレッドと送信スレッドの間でスレッドセーフに ペイロードエレメント (メッセージのフラグメント) を受け渡します。

  • count: キュー内エントリ数

  • inflight: 送信スレッドが sendto 実行中のエントリ数

  • count + inflight <= depth が常に保証される (ペイロードプールスロット衝突を防止)

  • not_full 条件変数: count + inflight < depth になったことを通知 (push_wait が待機)

  • drained 条件変数: count == 0 かつ inflight == 0 を通知 (ブロッキング送信が待機)

4.2.1 コラボレーション図

PotrSendQueue のコラボレーション図

4.2.2 属性

4.2.2.1 entries

PotrPayloadElem *entries;

ペイロードエレメントバッファ (動的確保。depth 要素)。

4.2.2.2 payload_pool

uint8_t *payload_pool;

ペイロードプール (動的確保。depth × max_payload バイト)。

4.2.2.3 depth

size_t depth;

キュー容量 (エントリ数)。

size_t head;

読み出し位置 (送信スレッドが使用)。

4.2.2.5 tail

size_t tail;

書き込み位置 (potrSend 呼び出し元が使用)。

4.2.2.6 count

size_t count;

キュー内エントリ数。

4.2.2.7 inflight

size_t inflight;

sendto 実行中エントリ数。

4.2.2.8 mutex

PotrMutex mutex;

排他制御。

4.2.2.9 not_empty

PotrCondVar not_empty;

count > 0 になったことを通知する条件変数。

4.2.2.10 not_full

PotrCondVar not_full;

count + inflight < depth になったことを通知する条件変数。

4.2.2.11 drained

PotrCondVar drained;

count == 0 && inflight == 0 を通知する条件変数。