# 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 著作権

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 属性

#### 4.2.1.1 entries

    PotrPayloadElem *entries;

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

#### 4.2.1.2 payload_pool

    uint8_t *payload_pool;

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

#### 4.2.1.3 depth

    size_t depth;

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

#### 4.2.1.4 head

    size_t head;

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

#### 4.2.1.5 tail

    size_t tail;

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

#### 4.2.1.6 count

    size_t count;

キュー内エントリ数。

#### 4.2.1.7 inflight

    size_t inflight;

sendto 実行中エントリ数。

#### 4.2.1.8 mutex

    PotrMutex mutex;

排他制御。

#### 4.2.1.9 not_empty

    PotrCondVar not_empty;

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

#### 4.2.1.10 not_full

    PotrCondVar not_full;

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

#### 4.2.1.11 drained

    PotrCondVar drained;

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