# 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 を通知 (ブロッキング送信が待機)

# 1 属性

## 1.1 entries

    PotrPayloadElem *entries;

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

## 1.2 payload_pool

    uint8_t *payload_pool;

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

## 1.3 depth

    size_t depth;

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

## 1.4 head

    size_t head;

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

## 1.5 tail

    size_t tail;

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

## 1.6 count

    size_t count;

キュー内エントリ数。

## 1.7 inflight

    size_t inflight;

sendto 実行中エントリ数。

## 1.8 mutex

    PotrMutex mutex;

排他制御。

## 1.9 not_empty

    PotrCondVar not_empty;

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

## 1.10 not_full

    PotrCondVar not_full;

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

## 1.11 drained

    PotrCondVar drained;

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