diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-09 13:19:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-03-09 13:19:22 +0000 |
commit | c21c3b0befeb46a51b6bf3758ffa30813bea0ff0 (patch) | |
tree | 9754ff1ca740f6346cf8483ec915d4054bc5da2d /fluent-bit/lib/librdkafka-2.1.0/src/tinycthread_extra.h | |
parent | Adding upstream version 1.43.2. (diff) | |
download | netdata-c21c3b0befeb46a51b6bf3758ffa30813bea0ff0.tar.xz netdata-c21c3b0befeb46a51b6bf3758ffa30813bea0ff0.zip |
Adding upstream version 1.44.3.upstream/1.44.3
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'fluent-bit/lib/librdkafka-2.1.0/src/tinycthread_extra.h')
-rw-r--r-- | fluent-bit/lib/librdkafka-2.1.0/src/tinycthread_extra.h | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/fluent-bit/lib/librdkafka-2.1.0/src/tinycthread_extra.h b/fluent-bit/lib/librdkafka-2.1.0/src/tinycthread_extra.h new file mode 100644 index 000000000..e5f673173 --- /dev/null +++ b/fluent-bit/lib/librdkafka-2.1.0/src/tinycthread_extra.h @@ -0,0 +1,208 @@ +/* + * librdkafka - Apache Kafka C library + * + * Copyright (c) 2018 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. + */ + + +/** + * @brief Extra methods added to tinychtread/c11threads + */ + + +#ifndef _TINYCTHREAD_EXTRA_H_ +#define _TINYCTHREAD_EXTRA_H_ + + +#ifndef _WIN32 +#include <pthread.h> /* needed for rwlock_t */ +#endif + + +/** + * @brief Set thread system name if platform supports it (pthreads) + * @return thrd_success or thrd_error + */ +int thrd_setname(const char *name); + +/** + * @brief Checks if passed thread is the current thread. + * @return non-zero if same thread, else 0. + */ +int thrd_is_current(thrd_t thr); + + +#ifdef _WIN32 +/** + * @brief Mark the current thread as waiting on cnd. + * + * @remark This is to be used when the thread uses its own + * WaitForMultipleEvents() call rather than cnd_timedwait(). + * + * @sa cnd_wait_exit() + */ +void cnd_wait_enter(cnd_t *cond); + +/** + * @brief Mark the current thread as no longer waiting on cnd. + */ +void cnd_wait_exit(cnd_t *cond); +#endif + + +/** + * @brief Same as cnd_timedwait() but takes a relative timeout in milliseconds. + */ +int cnd_timedwait_ms(cnd_t *cnd, mtx_t *mtx, int timeout_ms); + +/** + * @brief Same as cnd_timedwait_ms() but updates the remaining time. + */ +int cnd_timedwait_msp(cnd_t *cnd, mtx_t *mtx, int *timeout_msp); + +/** + * @brief Same as cnd_timedwait() but honours + * RD_POLL_INFINITE (uses cnd_wait()), + * and RD_POLL_NOWAIT (return thrd_timedout immediately). + * + * @remark Set up \p tspec with rd_timeout_init_timespec(). + */ +int cnd_timedwait_abs(cnd_t *cnd, mtx_t *mtx, const struct timespec *tspec); + + + +/** + * @brief Read-write locks + */ + +#if defined(_TTHREAD_WIN32_) +typedef struct rwlock_t { + SRWLOCK lock; + LONG rcnt; + LONG wcnt; +} rwlock_t; +#define rwlock_init(rwl) \ + do { \ + (rwl)->rcnt = (rwl)->wcnt = 0; \ + InitializeSRWLock(&(rwl)->lock); \ + } while (0) +#define rwlock_destroy(rwl) +#define rwlock_rdlock(rwl) \ + do { \ + if (0) \ + printf("Thr %i: at %i: RDLOCK %p %s (%i, %i)\n", \ + GetCurrentThreadId(), __LINE__, rwl, \ + __FUNCTION__, (rwl)->rcnt, (rwl)->wcnt); \ + assert((rwl)->rcnt >= 0 && (rwl)->wcnt >= 0); \ + AcquireSRWLockShared(&(rwl)->lock); \ + InterlockedIncrement(&(rwl)->rcnt); \ + } while (0) +#define rwlock_wrlock(rwl) \ + do { \ + if (0) \ + printf("Thr %i: at %i: WRLOCK %p %s (%i, %i)\n", \ + GetCurrentThreadId(), __LINE__, rwl, \ + __FUNCTION__, (rwl)->rcnt, (rwl)->wcnt); \ + assert((rwl)->rcnt >= 0 && (rwl)->wcnt >= 0); \ + AcquireSRWLockExclusive(&(rwl)->lock); \ + InterlockedIncrement(&(rwl)->wcnt); \ + } while (0) +#define rwlock_rdunlock(rwl) \ + do { \ + if (0) \ + printf("Thr %i: at %i: RDUNLOCK %p %s (%i, %i)\n", \ + GetCurrentThreadId(), __LINE__, rwl, \ + __FUNCTION__, (rwl)->rcnt, (rwl)->wcnt); \ + assert((rwl)->rcnt > 0 && (rwl)->wcnt >= 0); \ + ReleaseSRWLockShared(&(rwl)->lock); \ + InterlockedDecrement(&(rwl)->rcnt); \ + } while (0) +#define rwlock_wrunlock(rwl) \ + do { \ + if (0) \ + printf("Thr %i: at %i: RWUNLOCK %p %s (%i, %i)\n", \ + GetCurrentThreadId(), __LINE__, rwl, \ + __FUNCTION__, (rwl)->rcnt, (rwl)->wcnt); \ + assert((rwl)->rcnt >= 0 && (rwl)->wcnt > 0); \ + ReleaseSRWLockExclusive(&(rwl)->lock); \ + InterlockedDecrement(&(rwl)->wcnt); \ + } while (0) + +#define rwlock_rdlock_d(rwl) \ + do { \ + if (1) \ + printf("Thr %i: at %i: RDLOCK %p %s (%i, %i)\n", \ + GetCurrentThreadId(), __LINE__, rwl, \ + __FUNCTION__, (rwl)->rcnt, (rwl)->wcnt); \ + assert((rwl)->rcnt >= 0 && (rwl)->wcnt >= 0); \ + AcquireSRWLockShared(&(rwl)->lock); \ + InterlockedIncrement(&(rwl)->rcnt); \ + } while (0) +#define rwlock_wrlock_d(rwl) \ + do { \ + if (1) \ + printf("Thr %i: at %i: WRLOCK %p %s (%i, %i)\n", \ + GetCurrentThreadId(), __LINE__, rwl, \ + __FUNCTION__, (rwl)->rcnt, (rwl)->wcnt); \ + assert((rwl)->rcnt >= 0 && (rwl)->wcnt >= 0); \ + AcquireSRWLockExclusive(&(rwl)->lock); \ + InterlockedIncrement(&(rwl)->wcnt); \ + } while (0) +#define rwlock_rdunlock_d(rwl) \ + do { \ + if (1) \ + printf("Thr %i: at %i: RDUNLOCK %p %s (%i, %i)\n", \ + GetCurrentThreadId(), __LINE__, rwl, \ + __FUNCTION__, (rwl)->rcnt, (rwl)->wcnt); \ + assert((rwl)->rcnt > 0 && (rwl)->wcnt >= 0); \ + ReleaseSRWLockShared(&(rwl)->lock); \ + InterlockedDecrement(&(rwl)->rcnt); \ + } while (0) +#define rwlock_wrunlock_d(rwl) \ + do { \ + if (1) \ + printf("Thr %i: at %i: RWUNLOCK %p %s (%i, %i)\n", \ + GetCurrentThreadId(), __LINE__, rwl, \ + __FUNCTION__, (rwl)->rcnt, (rwl)->wcnt); \ + assert((rwl)->rcnt >= 0 && (rwl)->wcnt > 0); \ + ReleaseSRWLockExclusive(&(rwl)->lock); \ + InterlockedDecrement(&(rwl)->wcnt); \ + } while (0) + + +#else +typedef pthread_rwlock_t rwlock_t; + +int rwlock_init(rwlock_t *rwl); +int rwlock_destroy(rwlock_t *rwl); +int rwlock_rdlock(rwlock_t *rwl); +int rwlock_wrlock(rwlock_t *rwl); +int rwlock_rdunlock(rwlock_t *rwl); +int rwlock_wrunlock(rwlock_t *rwl); + +#endif + + +#endif /* _TINYCTHREAD_EXTRA_H_ */ |