blob: 92697824bdb37641dd1cf3119bd91bf29815e385 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
// SPDX-License-Identifier: GPL-3.0-or-later
/** @file circular_buffer.h
* @brief Header of circular_buffer.c
*/
#ifndef CIRCULAR_BUFFER_H_
#define CIRCULAR_BUFFER_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uv.h>
#include "defaults.h"
#include "query.h"
#include "file_info.h"
// Forward declaration to break circular dependency
struct File_info;
typedef enum {
CIRC_BUFF_ITEM_STATUS_UNPROCESSED = 0,
CIRC_BUFF_ITEM_STATUS_PARSED = 1,
CIRC_BUFF_ITEM_STATUS_STREAMED = 2,
CIRC_BUFF_ITEM_STATUS_DONE = 3 // == CIRC_BUFF_ITEM_STATUS_PARSED | CIRC_BUFF_ITEM_STATUS_STREAMED
} circ_buff_item_status_t;
typedef struct Circ_buff_item {
circ_buff_item_status_t status; /**< Denotes if item is unprocessed, in processing or processed **/
msec_t timestamp; /**< Epoch datetime of when data was collected **/
char *data; /**< Base of buffer to store both uncompressed and compressed logs **/
size_t text_size; /**< Size of uncompressed logs **/
char *text_compressed; /**< Pointer offset within *data that points to start of compressed logs **/
size_t text_compressed_size; /**< Size of compressed logs **/
size_t data_max_size; /**< Allocated size of *data **/
unsigned long num_lines; /**< Number of log records in item */
} Circ_buff_item_t;
typedef struct Circ_buff {
int num_of_items; /**< Number of preallocated items in the buffer **/
Circ_buff_item_t *items; /**< Array of all circular buffer items **/
Circ_buff_item_t *in; /**< Circular buffer item to write new data into **/
int head; /**< Position of next item insertion **/
int read; /**< Index between tail and head, used to read items out of Circ_buff **/
int tail; /**< Last valid item in Circ_buff **/
int parse; /**< Points to next item in buffer to be parsed **/
int full; /**< When head == tail, this indicates if buffer is full or empty **/
uv_rwlock_t buff_realloc_rwlock; /**< RW lock to lock buffer operations when reallocating or expanding buffer **/
unsigned int buff_realloc_cnt; /**< Counter of how any buffer reallocations have occurred **/
size_t total_cached_mem; /**< Total memory allocated for Circ_buff (excluding *in) **/
size_t total_cached_mem_max; /**< Maximum allowable size for total_cached_mem **/
int allow_dropped_logs; /**< Boolean to indicate whether logs are allowed to be dropped if buffer is full */
size_t text_size_total; /**< Total size of items[]->text_size **/
size_t text_compressed_size_total; /**< Total size of items[]->text_compressed_size **/
int compression_ratio; /**< text_size_total / text_compressed_size_total **/
} Circ_buff_t;
void circ_buff_search(logs_query_params_t *const p_query_params, struct File_info *const p_file_infos[]);
size_t circ_buff_prepare_write(Circ_buff_t *const buff, size_t const requested_text_space);
int circ_buff_insert(Circ_buff_t *const buff);
Circ_buff_item_t *circ_buff_read_item(Circ_buff_t *const buff);
void circ_buff_read_done(Circ_buff_t *const buff);
Circ_buff_t *circ_buff_init(const int num_of_items, const size_t max_size, const int allow_dropped_logs);
void circ_buff_destroy(Circ_buff_t *buff);
#endif // CIRCULAR_BUFFER_H_
|