curl-cpp
static c++17 wrapper for curl with -fno-exceptions support
shared_mutex.cc
1 // For pthread_rwlockattr_setkind_np
2 #define _XOPEN_SOURCE 500
3 #define _POSIX_C_SOURCE 200809L
4 
5 #include "shared_mutex.hpp"
6 #include <cerrno>
7 #include <err.h>
8 
9 #define CHECK(expr)
10  if ((expr) != 0)
11  err(1, "In %s" # expr " failed", __PRETTY_FUNCTION__)
12 
13 namespace curl::utils {
15 {
16  pthread_rwlockattr_t attr;
17 
18  CHECK(pthread_rwlockattr_init(&attr));
19  pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
20 
21  CHECK(pthread_rwlock_init(&rwlock, &attr));
22 
23  pthread_rwlockattr_destroy(&attr);
24 }
25 shared_mutex::~shared_mutex()
26 {
27  pthread_rwlock_destroy(&rwlock);
28 }
29 
30 void shared_mutex::lock() noexcept
31 {
32  pthread_rwlock_wrlock(&rwlock);
33 }
34 void shared_mutex::lock_shared() noexcept
35 {
36  int ret;
37  do {
38  ret = pthread_rwlock_rdlock(&rwlock);
39  } while (ret != 0 && errno == EAGAIN);
40 }
41 
42 void shared_mutex::unlock() noexcept
43 {
44  pthread_rwlock_unlock(&rwlock);
45 }
46 } /* namespace curl::utils */
curl::utils::shared_mutex::lock_shared
void lock_shared() noexcept
Definition: shared_mutex.cc:34
curl::utils::shared_mutex::lock
void lock() noexcept
Definition: shared_mutex.cc:30
curl::utils::shared_mutex
Definition: shared_mutex.hpp:18
curl::utils::shared_mutex::unlock
void unlock() noexcept
Definition: shared_mutex.cc:42
curl::utils::shared_mutex::shared_mutex
shared_mutex() noexcept
Definition: shared_mutex.cc:14
CHECK
#define CHECK(expr)
Definition: shared_mutex.cc:9