BrainBlast/_software_lib/nanomq-0.22.10/include/nng/supplemental/nanolib/ringbuffer.h

139 lines
3.9 KiB
C
Raw Normal View History

//
// Copyright 2023 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef RINGBUFFER_H
#define RINGBUFFER_H
#include <stdio.h>
#include <stdlib.h>
#include "nng/nng.h"
#include "nng/supplemental/util/platform.h"
#include "nng/supplemental/nanolib/cvector.h"
#define RBNAME_LEN 100
#define RINGBUFFER_MAX_SIZE 0xffffffff
#define RBRULELIST_MAX_SIZE 0xff
#define ENQUEUE_IN_HOOK 0x0001
#define ENQUEUE_OUT_HOOK 0x0010
#define DEQUEUE_IN_HOOK 0x0100
#define DEQUEUE_OUT_HOOK 0x1000
#define HOOK_MASK ((ENQUEUE_IN_HOOK) | (ENQUEUE_OUT_HOOK) | (DEQUEUE_IN_HOOK) | (DEQUEUE_OUT_HOOK))
typedef struct ringBuffer_s ringBuffer_t;
typedef struct ringBufferMsg_s ringBufferMsg_t;
typedef struct ringBufferRule_s ringBufferRule_t;
/* For RB_FULL_FILE */
typedef struct ringBufferFile_s ringBufferFile_t;
typedef struct ringBufferFileRange_s ringBufferFileRange_t;
struct ringBufferMsg_s {
uint64_t key;
void *data;
/* TTL of each message */
unsigned long long expiredAt;
};
enum fullOption {
RB_FULL_NONE,
RB_FULL_DROP,
RB_FULL_RETURN,
RB_FULL_FILE,
RB_FULL_MAX
};
struct ringBufferFileRange_s {
uint64_t startidx;
uint64_t endidx;
char *filename;
};
struct ringBufferFile_s {
uint64_t *keys;
nng_aio *aio;
ringBufferFileRange_t **ranges;
};
struct ringBuffer_s {
char name[RBNAME_LEN];
unsigned int head;
unsigned int tail;
unsigned int size;
unsigned int cap;
/* TTL of all messages in ringbuffer */
unsigned long long expiredAt;
unsigned int enqinRuleListLen;
unsigned int enqoutRuleListLen;
unsigned int deqinRuleListLen;
unsigned int deqoutRuleListLen;
ringBufferRule_t *enqinRuleList[RBRULELIST_MAX_SIZE];
ringBufferRule_t *enqoutRuleList[RBRULELIST_MAX_SIZE];
ringBufferRule_t *deqinRuleList[RBRULELIST_MAX_SIZE];
ringBufferRule_t *deqoutRuleList[RBRULELIST_MAX_SIZE];
enum fullOption fullOp;
/* FOR RB_FULL_FILE */
ringBufferFile_t **files;
nng_mtx *ring_lock;
ringBufferMsg_t *msgs;
};
struct ringBufferRule_s {
/*
* flag: ENQUEUE_IN_HOOK/ENQUEUE_OUT_HOOK/DEQUEUE_IN_HOOK/DEQUEUE_OUT_HOOK
* return: 0: success, -1: failed
*/
int (*match)(ringBuffer_t *rb, void *data, int flag);
/*
* return: 0: continue, -1: stop and return
*/
int (*target)(ringBuffer_t *rb, void *data, int flag);
};
int ringBuffer_add_rule(ringBuffer_t *rb,
int (*match)(ringBuffer_t *rb, void *data, int flag),
int (*target)(ringBuffer_t *rb, void *data, int flag),
int flag);
int ringBuffer_init(ringBuffer_t **rb,
unsigned int cap,
enum fullOption fullOp,
unsigned long long expiredAt);
int ringBuffer_enqueue(ringBuffer_t *rb,
uint64_t key,
void *data,
unsigned long long expiredAt,
nng_aio *aio);
int ringBuffer_dequeue(ringBuffer_t *rb, void **data);
int ringBuffer_release(ringBuffer_t *rb);
int ringBuffer_search_msg_by_key(ringBuffer_t *rb, uint64_t key, nng_msg **msg);
int ringBuffer_search_msgs_by_key(ringBuffer_t *rb, uint64_t key, uint32_t count, nng_msg ***list);
int ringBuffer_search_msgs_fuzz(ringBuffer_t *rb,
uint64_t start,
uint64_t end,
uint32_t *count,
nng_msg ***list);
int ringBuffer_get_and_clean_msgs(ringBuffer_t *rb,
unsigned int *count, nng_msg ***list);
int ringBuffer_set_fullOp(ringBuffer_t *rb, enum fullOption fullOp);
#ifdef SUPP_PARQUET
int ringBuffer_get_msgs_from_file(ringBuffer_t *rb, void ***msgs, int **msgLen);
int ringBuffer_get_msgs_from_file_by_keys(ringBuffer_t *rb, uint64_t *keys, uint32_t count,
void ***msgs, int **msgLen);
#endif
#endif