/
usr
/
src
/
file_protector-1.1-1507
/
transport
/
File Upload :
llllll
Current File: //usr/src/file_protector-1.1-1507/transport/ring.h
/** @file @brief 'ring' or 'circular' buffer @details Copyright (c) 2021 Acronis International GmbH @author Mikhail Krivtsov (mikhail.krivtsov@acronis.com) @since $Id: $ */ #pragma once #include <linux/types.h> // bool, [u]int(8|16|32|64)_t, pid_t, size_t typedef struct { void *buffer; size_t item_size; unsigned capacity; unsigned count; unsigned count_max; unsigned producer_index; unsigned consumer_index; } ring_t; static inline void ring_init(ring_t *ring, void *buffer, size_t buffer_size, size_t item_size) { ring->buffer = buffer; ring->item_size = item_size; ring->capacity = buffer_size / item_size; ring->count = 0; ring->count_max = 0; ring->producer_index = 0; ring->consumer_index = 0; } static inline void *ring_buffer(ring_t *ring) { return ring->buffer; } static inline unsigned ring_capacity(ring_t *ring) { return ring->capacity; } static inline void ring_producer_index_move(ring_t *ring, unsigned items) { ring->producer_index = (ring->producer_index + items) % ring->capacity; ring->count += items; if (ring->count_max < ring->count) { ring->count_max = ring->count; } } static inline void ring_producer_index_move_one(ring_t *ring) { ring_producer_index_move(ring, 1); } static inline void *ring_producer_ptr(ring_t *ring) { return (void *) (ring->producer_index * ring->item_size + (char *)ring->buffer); } static inline void ring_consumer_index_move(ring_t *ring, unsigned items) { ring->consumer_index = (ring->consumer_index + items) % ring->capacity; ring->count -= items; } static inline void ring_consumer_index_move_one(ring_t *ring) { ring_consumer_index_move(ring, 1); } static inline void *ring_consumer_ptr(ring_t *ring) { return (void *) (ring->consumer_index * ring->item_size + (char *)ring->buffer); } static inline unsigned ring_items_count(ring_t *ring) { return ring->count; } static inline unsigned ring_items_count_max(ring_t *ring) { return ring->count_max; } static inline bool ring_is_empty(ring_t *ring) { return !ring_items_count(ring); } static inline bool ring_is_full(ring_t *ring) { return ring_items_count(ring) >= ring->capacity; }
Copyright ©2k19 -
Hexid
|
Tex7ure