29 #define POTR_MUTEX_INIT(m) pthread_mutex_init((m), NULL)
30 #define POTR_MUTEX_LOCK(m) pthread_mutex_lock(m)
31 #define POTR_MUTEX_UNLOCK(m) pthread_mutex_unlock(m)
32 #define POTR_MUTEX_DESTROY(m) pthread_mutex_destroy(m)
33 #define POTR_COND_INIT(c) pthread_cond_init((c), NULL)
34 #define POTR_COND_WAIT(c, m) pthread_cond_wait((c), (m))
35 #define POTR_COND_SIGNAL(c) pthread_cond_signal(c)
36 #define POTR_COND_BROADCAST(c) pthread_cond_broadcast(c)
37 #define POTR_COND_DESTROY(c) pthread_cond_destroy(c)
39 #define POTR_MUTEX_INIT(m) InitializeCriticalSection(m)
40 #define POTR_MUTEX_LOCK(m) EnterCriticalSection(m)
41 #define POTR_MUTEX_UNLOCK(m) LeaveCriticalSection(m)
42 #define POTR_MUTEX_DESTROY(m) DeleteCriticalSection(m)
43 #define POTR_COND_INIT(c) InitializeConditionVariable(c)
44 #define POTR_COND_WAIT(c, m) SleepConditionVariableCS((c), (m), INFINITE)
45 #define POTR_COND_SIGNAL(c) WakeConditionVariable(c)
46 #define POTR_COND_BROADCAST(c) WakeAllConditionVariable(c)
47 #define POTR_COND_DESTROY(c) ((void)0)
55 memset(q, 0,
sizeof(*q));
58 q->
payload_pool = (uint8_t *)malloc(depth * (
size_t)max_payload);
71 for (i = 0; i < depth; i++)
102 const void *payload, uint16_t payload_len)
128 const void *payload, uint16_t payload_len,
163 while (q->
count == 0)
210 struct timespec abs_ts;
211 clock_gettime(CLOCK_REALTIME, &abs_ts);
212 abs_ts.tv_sec += (time_t)(timeout_ms / 1000U);
213 abs_ts.tv_nsec += (long)((timeout_ms % 1000U) * 1000000UL);
214 if (abs_ts.tv_nsec >= 1000000000L)
217 abs_ts.tv_nsec -= 1000000000L;
221 SleepConditionVariableCS(&q->
not_empty, &q->
mutex, (DWORD)timeout_ms);
#define POTR_PEER_NA
ピア ID 未割当を示す予約値。 1:1 モードのコールバックで渡される (ピアの概念がない)。 potrSend() に N:1 モードで指定した場合はエラーを返す。
#define POTR_SUCCESS
成功の戻り値を表す定数。
#define POTR_ERROR
失敗の戻り値を表す定数。
uint32_t PotrPeerId
ピア識別子。
#define POTR_COND_DESTROY(c)
#define POTR_MUTEX_UNLOCK(m)
int potr_send_queue_init(PotrSendQueue *q, size_t depth, uint16_t max_payload)
#define POTR_MUTEX_LOCK(m)
int potr_send_queue_push(PotrSendQueue *q, PotrPeerId peer_id, uint16_t flags, const void *payload, uint16_t payload_len)
void potr_send_queue_complete(PotrSendQueue *q)
int potr_send_queue_pop(PotrSendQueue *q, PotrPayloadElem *out, volatile int *running)
int potr_send_queue_peek_timed(PotrSendQueue *q, PotrPayloadElem *out, uint32_t timeout_ms)
#define POTR_COND_SIGNAL(c)
#define POTR_COND_INIT(c)
#define POTR_MUTEX_INIT(m)
int potr_send_queue_peek(PotrSendQueue *q, PotrPayloadElem *out)
void potr_send_queue_shutdown(PotrSendQueue *q)
int potr_send_queue_try_pop(PotrSendQueue *q, PotrPayloadElem *out)
#define POTR_COND_WAIT(c, m)
void potr_send_queue_destroy(PotrSendQueue *q)
#define POTR_COND_BROADCAST(c)
int potr_send_queue_push_wait(PotrSendQueue *q, PotrPeerId peer_id, uint16_t flags, const void *payload, uint16_t payload_len, volatile int *running)
#define POTR_MUTEX_DESTROY(m)
void potr_send_queue_wait_drained(PotrSendQueue *q)
送信キューの 1 エントリ。ペイロードエレメント 1 個分のデータを保持する。
uint16_t payload_len
ペイロード長 (バイト)。
uint16_t flags
ペイロードエレメントフラグ (MORE_FRAG, COMPRESSED など)。
uint8_t * payload
ペイロードデータへのポインタ (プールスロット内を指す)。
PotrPeerId peer_id
送信先ピア識別子 (N:1 モード用。1:1 モードでは 0)。
size_t depth
キュー容量 (エントリ数)。
size_t inflight
sendto 実行中エントリ数。
PotrCondVar not_empty
count > 0 になったことを通知する条件変数。
PotrCondVar drained
count == 0 && inflight == 0 を通知する条件変数。
size_t head
読み出し位置 (送信スレッドが使用)。
size_t tail
書き込み位置 (potrSend 呼び出し元が使用)。
PotrCondVar not_full
count + inflight < depth になったことを通知する条件変数。
uint8_t * payload_pool
ペイロードプール (動的確保。depth × max_payload バイト)。
PotrPayloadElem * entries
ペイロードエレメントバッファ (動的確保。depth 要素)。
static volatile sig_atomic_t running