ConcurrencyKit ck_fifo_mpmc_dequeue и освобождение памяти - PullRequest
0 голосов
/ 31 мая 2019

Мне нужно использовать многопользовательскую очередь без блокировки для нескольких производителей, и я пытаюсь использовать код ConcurrencyKit fifo_mpmc. Мне удалось заставить код работать на основе примера из кода регрессии , за исключением того, что нет документации о том, как освободить память после удаления записи из очереди MPMC.

В частности, в следующем прототипе функции,

CK_CC_INLINE static bool
ck_fifo_mpmc_dequeue(struct ck_fifo_mpmc *fifo,
             void *value,
             struct ck_fifo_mpmc_entry **garbage)

что в точности соответствует garbage и как освободить память типа struct ck_fifo_mpmc_entry, выделенную во время постановки в очередь? Ниже приводится объявление типа enquque

CK_CC_INLINE static void
ck_fifo_mpmc_enqueue(struct ck_fifo_mpmc *fifo,
             struct ck_fifo_mpmc_entry *entry,
             void *value)

, где нужно выделить динамическую память для entry, и я предполагал, что garbage параметр dequeue просто вернет указатель на память в очереди. Но если я просто позвоню бесплатно на *garbage, код вылетает. Если я не освобождаюсь, есть утечка памяти.

В отличие от других частей CK, очередь MPMC, похоже, не имеет документации.

...