Home Files
Adminer
Execute Command
PHP Eval
Symlink
File Upload
Owner :
www-data
PHP Version
5.6.40-0+deb8u12
Disk Space
40.86 GB
Server Addr
19-www4
Your IP
10.10.10.40
Edit File
File:
/** @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; }