mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-10-15 01:54:43 +00:00
* Remove restating comments in backend * Remove restating comments in frontend stories * Remove restating comments in pipeline * Remove restating comments in pipeline scripts * Restore location-clear comment in BreweryRepository * Remove stale/restating comments found in second pass * Restore mock curated-data branch comment in main.cc * Remove more restating/filler comments in backend * Document account-management endpoints, compose files, and env generator * Squashed commit of the following: commit a8a5b8abd9969859c695092fae6990d03b2135ed Author: Aaron Po <aaron.po97@gmail.com> Date: Sun Aug 23 23:53:56 2026 -0400 Add reverse geocoding for brewery street addresses (#245) * Add geocoding to seed application, remove postal codes from generator Update comments * Update pipeline class diagram for OpenAI generator * Update pipeline activity diagram for brewery coordinates and OpenAI backend * Add mailpit, production, db-only, and minimal environments to deployment diagram * Fix authentication flow diagram for Identity migration * Add account-management flows to authentication diagram * Fix database schema diagram note referencing removed AuthRepository
73 lines
1.9 KiB
C++
73 lines
1.9 KiB
C++
#ifndef BIERGARTEN_PIPELINE_INCLUDES_CONCURRENCY_BOUNDED_CHANNEL_H_
|
|
#define BIERGARTEN_PIPELINE_INCLUDES_CONCURRENCY_BOUNDED_CHANNEL_H_
|
|
|
|
#include <condition_variable>
|
|
#include <cstddef>
|
|
#include <mutex>
|
|
#include <optional>
|
|
#include <queue>
|
|
|
|
/**
|
|
* @file bounded_channel.h
|
|
* @brief Thread-safe, bounded multi-producer/multi-consumer synchronous
|
|
* channel.
|
|
*
|
|
* Intent: Enables asynchronous inter-thread communication with backpressure.
|
|
* Models a synchronous channel where producers/consumers block on capacity
|
|
* limits.
|
|
*/
|
|
|
|
/**
|
|
* @class BoundedChannel
|
|
* @brief MPMC channel with fixed capacity and blocking semantics.
|
|
*
|
|
* Producers block when buffer is full; consumers block when empty.
|
|
* Close() unblocks all waiters and signals channel exhaustion.
|
|
*/
|
|
template <typename T>
|
|
class BoundedChannel {
|
|
// Internal state — all access must be guarded by mutex_.
|
|
|
|
std::queue<T> queue_;
|
|
|
|
std::mutex mutex_;
|
|
|
|
std::condition_variable not_full_;
|
|
|
|
std::condition_variable not_empty_;
|
|
|
|
std::size_t capacity_;
|
|
|
|
bool closed_ = false;
|
|
|
|
public:
|
|
/**
|
|
* @brief Construct a bounded channel with the given capacity.
|
|
* @param capacity Maximum number of items the channel may hold.
|
|
*/
|
|
explicit BoundedChannel(std::size_t capacity) : capacity_(capacity) {}
|
|
|
|
/**
|
|
* @brief Send an item into the channel. Blocks when the channel is full.
|
|
* @param item Move-only item to enqueue.
|
|
*/
|
|
void Send(T item);
|
|
|
|
/**
|
|
* @brief Receive an item from the channel. Blocks when the channel is
|
|
* empty.
|
|
* @return std::optional<T> containing the item, or std::nullopt when the
|
|
* channel is closed and drained.
|
|
*/
|
|
std::optional<T> Receive();
|
|
|
|
/**
|
|
* @brief Close the channel and unblock all waiting threads. Idempotent.
|
|
*/
|
|
void Close();
|
|
};
|
|
|
|
#include "bounded_channel.tcc"
|
|
|
|
#endif // BIERGARTEN_PIPELINE_INCLUDES_CONCURRENCY_BOUNDED_CHANNEL_H_
|