diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 02:57:58 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 02:57:58 +0000 |
commit | be1c7e50e1e8809ea56f2c9d472eccd8ffd73a97 (patch) | |
tree | 9754ff1ca740f6346cf8483ec915d4054bc5da2d /fluent-bit/lib/librdkafka-2.1.0/src/rd.h | |
parent | Initial commit. (diff) | |
download | netdata-be1c7e50e1e8809ea56f2c9d472eccd8ffd73a97.tar.xz netdata-be1c7e50e1e8809ea56f2c9d472eccd8ffd73a97.zip |
Adding upstream version 1.44.3.upstream/1.44.3upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'fluent-bit/lib/librdkafka-2.1.0/src/rd.h')
-rw-r--r-- | fluent-bit/lib/librdkafka-2.1.0/src/rd.h | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/fluent-bit/lib/librdkafka-2.1.0/src/rd.h b/fluent-bit/lib/librdkafka-2.1.0/src/rd.h new file mode 100644 index 00000000..670605de --- /dev/null +++ b/fluent-bit/lib/librdkafka-2.1.0/src/rd.h @@ -0,0 +1,436 @@ +/* + * librd - Rapid Development C library + * + * Copyright (c) 2012, Magnus Edenhill + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + + +#ifndef _RD_H_ +#define _RD_H_ + +#ifndef _WIN32 +#ifndef _GNU_SOURCE +#define _GNU_SOURCE /* for strndup() */ +#endif + +#if defined(__APPLE__) && !defined(_DARWIN_C_SOURCE) +#define _DARWIN_C_SOURCE /* for strlcpy, pthread_setname_np, etc */ +#endif + +#define __need_IOV_MAX +#ifndef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 200809L /* for timespec on solaris */ +#endif +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <time.h> +#include <assert.h> +#include <limits.h> + +#include "tinycthread.h" +#include "rdsysqueue.h" + +#ifdef _WIN32 +/* Visual Studio */ +#include "win32_config.h" +#else +/* POSIX / UNIX based systems */ +#include "../config.h" /* mklove output */ +#endif + +#ifdef _WIN32 +/* Win32/Visual Studio */ +#include "rdwin32.h" + +#else +/* POSIX / UNIX based systems */ +#include "rdposix.h" +#endif + +#include "rdtypes.h" + +#if WITH_SYSLOG +#include <syslog.h> +#else +#define LOG_EMERG 0 +#define LOG_ALERT 1 +#define LOG_CRIT 2 +#define LOG_ERR 3 +#define LOG_WARNING 4 +#define LOG_NOTICE 5 +#define LOG_INFO 6 +#define LOG_DEBUG 7 +#endif + + +/* Debug assert, only enabled with --enable-devel */ +#if ENABLE_DEVEL == 1 +#define rd_dassert(cond) rd_assert(cond) +#else +#define rd_dassert(cond) \ + do { \ + } while (0) +#endif + +#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +/** Function attribute to indicate that a sentinel NULL is required at the + * end of the va-arg input list. */ +#define RD_SENTINEL __attribute__((__sentinel__)) +#else +#define RD_SENTINEL +#endif + + +/** Assert if reached */ +#define RD_NOTREACHED() rd_assert(!*"/* NOTREACHED */ violated") + +/** Assert if reached */ +#define RD_BUG(...) \ + do { \ + fprintf(stderr, \ + "INTERNAL ERROR: librdkafka %s:%d: ", __FUNCTION__, \ + __LINE__); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, "\n"); \ + rd_assert(!*"INTERNAL ERROR IN LIBRDKAFKA"); \ + } while (0) + + + +/** + * Allocator wrappers. + * We serve under the premise that if a (small) memory + * allocation fails all hope is lost and the application + * will fail anyway, so no need to handle it handsomely. + */ +static RD_INLINE RD_UNUSED void *rd_calloc(size_t num, size_t sz) { + void *p = calloc(num, sz); + rd_assert(p); + return p; +} + +static RD_INLINE RD_UNUSED void *rd_malloc(size_t sz) { + void *p = malloc(sz); + rd_assert(p); + return p; +} + +static RD_INLINE RD_UNUSED void *rd_realloc(void *ptr, size_t sz) { + void *p = realloc(ptr, sz); + rd_assert(p); + return p; +} + +static RD_INLINE RD_UNUSED void rd_free(void *ptr) { + free(ptr); +} + +static RD_INLINE RD_UNUSED char *rd_strdup(const char *s) { +#ifndef _WIN32 + char *n = strdup(s); +#else + char *n = _strdup(s); +#endif + rd_assert(n); + return n; +} + +static RD_INLINE RD_UNUSED char *rd_strndup(const char *s, size_t len) { +#if HAVE_STRNDUP + char *n = strndup(s, len); + rd_assert(n); +#else + char *n = (char *)rd_malloc(len + 1); + rd_assert(n); + memcpy(n, s, len); + n[len] = '\0'; +#endif + return n; +} + + + +/* + * Portability + */ + +#ifdef strndupa +#define rd_strndupa(DESTPTR, PTR, LEN) (*(DESTPTR) = strndupa(PTR, LEN)) +#else +#define rd_strndupa(DESTPTR, PTR, LEN) \ + do { \ + const char *_src = (PTR); \ + size_t _srclen = (LEN); \ + char *_dst = rd_alloca(_srclen + 1); \ + memcpy(_dst, _src, _srclen); \ + _dst[_srclen] = '\0'; \ + *(DESTPTR) = _dst; \ + } while (0) +#endif + +#ifdef strdupa +#define rd_strdupa(DESTPTR, PTR) (*(DESTPTR) = strdupa(PTR)) +#else +#define rd_strdupa(DESTPTR, PTR) \ + do { \ + const char *_src1 = (PTR); \ + size_t _srclen1 = strlen(_src1); \ + rd_strndupa(DESTPTR, _src1, _srclen1); \ + } while (0) +#endif + +#ifndef IOV_MAX +#ifdef __APPLE__ +/* Some versions of MacOSX dont have IOV_MAX */ +#define IOV_MAX 1024 +#elif defined(_WIN32) || defined(__GNU__) +/* There is no IOV_MAX on MSVC or GNU but it is used internally in librdkafka */ +#define IOV_MAX 1024 +#else +#error "IOV_MAX not defined" +#endif +#endif + + +/* Round/align X upwards to STRIDE, which must be power of 2. */ +#define RD_ROUNDUP(X, STRIDE) (((X) + ((STRIDE)-1)) & ~(STRIDE - 1)) + +#define RD_ARRAY_SIZE(A) (sizeof((A)) / sizeof(*(A))) +#define RD_ARRAYSIZE(A) RD_ARRAY_SIZE(A) +#define RD_SIZEOF(TYPE, MEMBER) sizeof(((TYPE *)NULL)->MEMBER) +#define RD_OFFSETOF(TYPE, MEMBER) ((size_t) & (((TYPE *)NULL)->MEMBER)) + +/** + * Returns the 'I'th array element from static sized array 'A' + * or NULL if 'I' is out of range. + * var-args is an optional prefix to provide the correct return type. + */ +#define RD_ARRAY_ELEM(A, I, ...) \ + ((unsigned int)(I) < RD_ARRAY_SIZE(A) ? __VA_ARGS__(A)[(I)] : NULL) + + +#define RD_STRINGIFY(X) #X + + + +#define RD_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define RD_MAX(a, b) ((a) > (b) ? (a) : (b)) + + +/** + * Cap an integer (of any type) to reside within the defined limit. + */ +#define RD_INT_CAP(val, low, hi) \ + ((val) < (low) ? low : ((val) > (hi) ? (hi) : (val))) + + + +/** + * Allocate 'size' bytes, copy 'src', return pointer to new memory. + * + * Use rd_free() to free the returned pointer. + */ +static RD_INLINE RD_UNUSED void *rd_memdup(const void *src, size_t size) { + void *dst = rd_malloc(size); + memcpy(dst, src, size); + return dst; +} + +/** + * @brief Memset &OBJ to 0, does automatic sizeof(OBJ). + */ +#define RD_MEMZERO(OBJ) memset(&(OBJ), 0, sizeof(OBJ)) + + +/** + * Generic refcnt interface + */ + +#if !HAVE_ATOMICS_32 +#define RD_REFCNT_USE_LOCKS 1 +#endif + +#ifdef RD_REFCNT_USE_LOCKS +typedef struct rd_refcnt_t { + mtx_t lock; + int v; +} rd_refcnt_t; +#else +typedef rd_atomic32_t rd_refcnt_t; +#endif + +#ifdef RD_REFCNT_USE_LOCKS +static RD_INLINE RD_UNUSED int rd_refcnt_init(rd_refcnt_t *R, int v) { + int r; + mtx_init(&R->lock, mtx_plain); + mtx_lock(&R->lock); + r = R->v = v; + mtx_unlock(&R->lock); + return r; +} +#else +#define rd_refcnt_init(R, v) rd_atomic32_init(R, v) +#endif + +#ifdef RD_REFCNT_USE_LOCKS +static RD_INLINE RD_UNUSED void rd_refcnt_destroy(rd_refcnt_t *R) { + mtx_lock(&R->lock); + rd_assert(R->v == 0); + mtx_unlock(&R->lock); + + mtx_destroy(&R->lock); +} +#else +#define rd_refcnt_destroy(R) \ + do { \ + } while (0) +#endif + + +#ifdef RD_REFCNT_USE_LOCKS +static RD_INLINE RD_UNUSED int rd_refcnt_set(rd_refcnt_t *R, int v) { + int r; + mtx_lock(&R->lock); + r = R->v = v; + mtx_unlock(&R->lock); + return r; +} +#else +#define rd_refcnt_set(R, v) rd_atomic32_set(R, v) +#endif + + +#ifdef RD_REFCNT_USE_LOCKS +static RD_INLINE RD_UNUSED int rd_refcnt_add0(rd_refcnt_t *R) { + int r; + mtx_lock(&R->lock); + r = ++(R->v); + mtx_unlock(&R->lock); + return r; +} +#else +#define rd_refcnt_add0(R) rd_atomic32_add(R, 1) +#endif + +static RD_INLINE RD_UNUSED int rd_refcnt_sub0(rd_refcnt_t *R) { + int r; +#ifdef RD_REFCNT_USE_LOCKS + mtx_lock(&R->lock); + r = --(R->v); + mtx_unlock(&R->lock); +#else + r = rd_atomic32_sub(R, 1); +#endif + if (r < 0) + rd_assert(!*"refcnt sub-zero"); + return r; +} + +#ifdef RD_REFCNT_USE_LOCKS +static RD_INLINE RD_UNUSED int rd_refcnt_get(rd_refcnt_t *R) { + int r; + mtx_lock(&R->lock); + r = R->v; + mtx_unlock(&R->lock); + return r; +} +#else +#define rd_refcnt_get(R) rd_atomic32_get(R) +#endif + +/** + * A wrapper for decreasing refcount and calling a destroy function + * when refcnt reaches 0. + */ +#define rd_refcnt_destroywrapper(REFCNT, DESTROY_CALL) \ + do { \ + if (rd_refcnt_sub(REFCNT) > 0) \ + break; \ + DESTROY_CALL; \ + } while (0) + + +#define rd_refcnt_destroywrapper2(REFCNT, WHAT, DESTROY_CALL) \ + do { \ + if (rd_refcnt_sub2(REFCNT, WHAT) > 0) \ + break; \ + DESTROY_CALL; \ + } while (0) + +#if ENABLE_REFCNT_DEBUG +#define rd_refcnt_add_fl(FUNC, LINE, R) \ + (fprintf(stderr, "REFCNT DEBUG: %-35s %d +1: %16p: %s:%d\n", #R, \ + rd_refcnt_get(R), (R), (FUNC), (LINE)), \ + rd_refcnt_add0(R)) + +#define rd_refcnt_add(R) rd_refcnt_add_fl(__FUNCTION__, __LINE__, (R)) + +#define rd_refcnt_add2(R, WHAT) \ + do { \ + fprintf(stderr, \ + "REFCNT DEBUG: %-35s %d +1: %16p: %16s: %s:%d\n", #R, \ + rd_refcnt_get(R), (R), WHAT, __FUNCTION__, __LINE__), \ + rd_refcnt_add0(R); \ + } while (0) + +#define rd_refcnt_sub2(R, WHAT) \ + (fprintf(stderr, "REFCNT DEBUG: %-35s %d -1: %16p: %16s: %s:%d\n", #R, \ + rd_refcnt_get(R), (R), WHAT, __FUNCTION__, __LINE__), \ + rd_refcnt_sub0(R)) + +#define rd_refcnt_sub(R) \ + (fprintf(stderr, "REFCNT DEBUG: %-35s %d -1: %16p: %s:%d\n", #R, \ + rd_refcnt_get(R), (R), __FUNCTION__, __LINE__), \ + rd_refcnt_sub0(R)) + +#else +#define rd_refcnt_add_fl(FUNC, LINE, R) rd_refcnt_add0(R) +#define rd_refcnt_add(R) rd_refcnt_add0(R) +#define rd_refcnt_sub(R) rd_refcnt_sub0(R) +#endif + + + +#define RD_IF_FREE(PTR, FUNC) \ + do { \ + if ((PTR)) \ + FUNC(PTR); \ + } while (0) + + +/** + * @brief Utility types to hold memory,size tuple. + */ + +typedef struct rd_chariov_s { + char *ptr; + size_t size; +} rd_chariov_t; + +#endif /* _RD_H_ */ |