This is an automated email from the ASF dual-hosted git repository.
wasphin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brpc.git
The following commit(s) were added to refs/heads/master by this push:
new 11f8192b Refactor NULL with nullptr in brpc/rdma (#3459)
11f8192b is described below
commit 11f8192bdf3fdde9acb182e09dca0a457664af95
Author: Bright Chen <[email protected]>
AuthorDate: Tue Aug 18 13:55:37 2026 +0800
Refactor NULL with nullptr in brpc/rdma (#3459)
---
src/brpc/rdma/block_pool.cpp | 92 ++++++++++-----------
src/brpc/rdma/block_pool.h | 6 +-
src/brpc/rdma/rdma_endpoint.cpp | 142 ++++++++++++++++----------------
src/brpc/rdma/rdma_endpoint.h | 16 ++--
src/brpc/rdma/rdma_handshake.cpp | 4 +-
src/brpc/rdma/rdma_handshake.h | 2 +-
src/brpc/rdma/rdma_handshake_server.cpp | 4 +-
src/brpc/rdma/rdma_helper.cpp | 113 +++++++++++--------------
8 files changed, 179 insertions(+), 200 deletions(-)
diff --git a/src/brpc/rdma/block_pool.cpp b/src/brpc/rdma/block_pool.cpp
index d8dbb8ab..3a332a91 100644
--- a/src/brpc/rdma/block_pool.cpp
+++ b/src/brpc/rdma/block_pool.cpp
@@ -44,7 +44,7 @@ DEFINE_bool(rdma_memory_pool_user_specified_memory, false,
DEFINE_string(rdma_recv_block_type, "default", "Default size type for recv WR:
"
"default(8KB - 32B)/large(64KB - 32B)/huge(2MB - 32B)");
-static RegisterCallback g_cb = NULL;
+static RegisterCallback g_cb = nullptr;
// Number of bytes in 1MB
static const size_t BYTES_IN_MB = 1048576;
@@ -82,13 +82,13 @@ static const int32_t RDMA_MEMORY_POOL_MAX_BUCKETS = 16;
static size_t g_buckets = 1;
static bool g_dump_enable = false;
-static butil::Mutex* g_dump_mutex = NULL;
+static butil::Mutex* g_dump_mutex = nullptr;
// Only for default block size
-static __thread IdleNode* tls_idle_list = NULL;
+static __thread IdleNode* tls_idle_list = nullptr;
static __thread size_t tls_idle_num = 0;
static __thread bool tls_inited = false;
-static butil::Mutex* g_tls_info_mutex = NULL;
+static butil::Mutex* g_tls_info_mutex = nullptr;
static size_t g_tls_info_cnt = 0;
static size_t* g_tls_info[1024];
@@ -102,14 +102,14 @@ struct GlobalInfo {
std::vector<IdleNode*> expansion_list[BLOCK_SIZE_COUNT];
std::vector<size_t> expansion_size[BLOCK_SIZE_COUNT];
};
-static GlobalInfo* g_info = NULL;
+static GlobalInfo* g_info = nullptr;
static inline Region* GetRegion(const void* buf) {
if (!buf) {
errno = EINVAL;
- return NULL;
+ return nullptr;
}
- Region* r = NULL;
+ Region* r = nullptr;
uintptr_t addr = (uintptr_t)buf;
for (int i = 0; i < FLAGS_rdma_memory_pool_max_regions; ++i) {
if (g_regions[i].start == 0) {
@@ -140,13 +140,13 @@ static void* ExtendBlockPoolImpl(void* region_base,
size_t region_size, int bloc
if (g_region_num == FLAGS_rdma_memory_pool_max_regions) {
LOG_EVERY_SECOND(ERROR) << "Memory pool reaches max regions";
errno = ENOMEM;
- return NULL;
+ return nullptr;
}
uint32_t id = g_cb(region_base, region_size);
if (id == 0) {
errno = EINVAL;
- return NULL;
+ return nullptr;
}
IdleNode* node[g_buckets];
@@ -158,7 +158,7 @@ static void* ExtendBlockPoolImpl(void* region_base, size_t
region_size, int bloc
butil::return_object<IdleNode>(node[j]);
}
errno = ENOMEM;
- return NULL;
+ return nullptr;
}
}
@@ -187,14 +187,14 @@ static void* ExtendBlockPoolImpl(void* region_base,
size_t region_size, int bloc
static void* ExtendBlockPool(size_t region_size, int block_type) {
if (region_size < 1 || block_type < 0) {
errno = EINVAL;
- return NULL;
+ return nullptr;
}
if (FLAGS_rdma_memory_pool_user_specified_memory) {
LOG_EVERY_SECOND(ERROR) << "Fail to extend new region, "
"rdma_memory_pool_user_specified_memory is "
"true, ExtendBlockPool is disabled";
- return NULL;
+ return nullptr;
}
// Regularize region size
@@ -203,10 +203,10 @@ static void* ExtendBlockPool(size_t region_size, int
block_type) {
LOG(INFO) << "Start extend rdma memory " << region_size / BYTES_IN_MB <<
"MB";
- void* region_base = NULL;
+ void* region_base = nullptr;
if (posix_memalign(®ion_base, 4096, region_size) != 0) {
PLOG_EVERY_SECOND(ERROR) << "Memory not enough";
- return NULL;
+ return nullptr;
}
return ExtendBlockPoolImpl(region_base, region_size, block_type);
@@ -219,12 +219,12 @@ void* ExtendBlockPoolByUser(void* region_base, size_t
region_size, int block_typ
if (!FLAGS_rdma_memory_pool_user_specified_memory) {
LOG_EVERY_SECOND(ERROR) << "User extend memory is disabled";
- return NULL;
+ return nullptr;
}
if (reinterpret_cast<uintptr_t>(region_base) % 4096 != 0) {
LOG_EVERY_SECOND(ERROR) << "region_base must be 4096 aligned";
errno = EINVAL;
- return NULL;
+ return nullptr;
}
region_size =
@@ -284,17 +284,14 @@ bool InitBlockPool(RegisterCallback cb) {
return false;
}
g_buckets = FLAGS_rdma_memory_pool_buckets;
- g_info = new (std::nothrow) GlobalInfo;
- if (!g_info) {
- return false;
- }
+ g_info = new GlobalInfo;
for (int i = 0; i < BLOCK_SIZE_COUNT; ++i) {
- g_info->idle_list[i].resize(g_buckets, NULL);
+ g_info->idle_list[i].resize(g_buckets, nullptr);
if (g_info->idle_list[i].size() != g_buckets) {
return false;
}
- g_info->lock[i].resize(g_buckets, NULL);
+ g_info->lock[i].resize(g_buckets, nullptr);
if (g_info->lock[i].size() != g_buckets) {
return false;
}
@@ -304,12 +301,9 @@ bool InitBlockPool(RegisterCallback cb) {
}
g_info->region_num[i] = 0;
for (size_t j = 0; j < g_buckets; ++j) {
- g_info->lock[i][j] = new (std::nothrow) butil::Mutex;
- if (!g_info->lock[i][j]) {
- return false;
- }
+ g_info->lock[i][j] = new butil::Mutex;
}
- g_info->expansion_list[i].resize(g_buckets, NULL);
+ g_info->expansion_list[i].resize(g_buckets, nullptr);
if (g_info->expansion_list[i].size() != g_buckets) {
return false;
}
@@ -327,18 +321,18 @@ bool InitBlockPool(RegisterCallback cb) {
}
if (ExtendBlockPool(FLAGS_rdma_memory_pool_initial_size_mb,
- GetRdmaBlockType()) != NULL) {
+ GetRdmaBlockType()) != nullptr) {
return true;
}
return false;
}
static void MoveExpansionList2EmptyIdleList(int block_type, size_t index) {
- CHECK(NULL == g_info->idle_list[block_type][index]);
+ CHECK(nullptr == g_info->idle_list[block_type][index]);
g_info->idle_list[block_type][index] =
g_info->expansion_list[block_type][index];
g_info->idle_size[block_type][index] +=
g_info->expansion_size[block_type][index];
- g_info->expansion_list[block_type][index] = NULL;
+ g_info->expansion_list[block_type][index] = nullptr;
g_info->expansion_size[block_type][index] = 0;
}
@@ -354,8 +348,8 @@ static void* AllocBlockFrom(int block_type) {
}
};
- void* ptr = NULL;
- if (0 == block_type && NULL != tls_idle_list) {
+ void* ptr = nullptr;
+ if (0 == block_type && nullptr != tls_idle_list) {
CHECK(tls_idle_num > 0);
IdleNode* n = tls_idle_list;
tls_idle_list = n->next;
@@ -368,14 +362,14 @@ static void* AllocBlockFrom(int block_type) {
size_t index = butil::fast_rand() % g_buckets;
BAIDU_SCOPED_LOCK(*g_info->lock[block_type][index]);
IdleNode* node = g_info->idle_list[block_type][index];
- if (NULL == node) {
+ if (nullptr == node) {
BAIDU_SCOPED_LOCK(g_info->extend_lock);
node = g_info->idle_list[block_type][index];
- if (NULL == node && NULL != g_info->expansion_list[block_type][index])
{
+ if (nullptr == node && nullptr !=
g_info->expansion_list[block_type][index]) {
MoveExpansionList2EmptyIdleList(block_type, index);
node = g_info->idle_list[block_type][index];
}
- if (NULL == node) {
+ if (nullptr == node) {
// There is no block left, extend a new region.
if (!ExtendBlockPool(FLAGS_rdma_memory_pool_increase_size_mb,
block_type)) {
LOG_EVERY_SECOND(ERROR) << "Fail to extend new region. "
@@ -384,13 +378,13 @@ static void* AllocBlockFrom(int block_type) {
<< "rdma_memory_pool_initial_size_mb, "
<< "rdma_memory_pool_increase_size_mb,
"
<< "rdma_memory_pool_max_regions.";
- return NULL;
+ return nullptr;
}
MoveExpansionList2EmptyIdleList(block_type, index);
node = g_info->idle_list[block_type][index];
}
}
- CHECK(NULL != node);
+ CHECK(nullptr != node);
ptr = node->start;
if (node->len > g_block_size[block_type]) {
@@ -406,7 +400,7 @@ static void* AllocBlockFrom(int block_type) {
if (block_type == 0) {
node = g_info->idle_list[0][index];
tls_idle_list = node;
- IdleNode* last_node = NULL;
+ IdleNode* last_node = nullptr;
while (node) {
if (tls_idle_num > (uint32_t)FLAGS_rdma_memory_pool_tls_cache_num
/ 2
|| node->len > g_block_size[0]) {
@@ -417,12 +411,12 @@ static void* AllocBlockFrom(int block_type) {
node = node->next;
}
if (tls_idle_num == 0) {
- tls_idle_list = NULL;
+ tls_idle_list = nullptr;
} else {
g_info->idle_list[0][index] = node;
}
if (last_node) {
- last_node->next = NULL;
+ last_node->next = nullptr;
}
}
@@ -432,14 +426,14 @@ static void* AllocBlockFrom(int block_type) {
void* AllocBlock(size_t size) {
if (size == 0 || size > g_block_size[BLOCK_SIZE_COUNT - 1]) {
errno = EINVAL;
- return NULL;
+ return nullptr;
}
for (int i = 0; i < BLOCK_SIZE_COUNT; ++i) {
if (size <= g_block_size[i]) {
return AllocBlockFrom(i);;
}
}
- return NULL;
+ return nullptr;
}
void RecycleAll() {
@@ -515,7 +509,7 @@ int DeallocBlock(void* buf) {
// Recycle half the cached blocks in tls for default block size
int num = FLAGS_rdma_memory_pool_tls_cache_num / 2;
IdleNode* new_head = tls_idle_list;
- IdleNode* recycle_tail = NULL;
+ IdleNode* recycle_tail = nullptr;
for (int i = 0; i < num; ++i) {
recycle_tail = new_head;
len += recycle_tail->len;
@@ -614,18 +608,18 @@ void DestroyBlockPool() {
butil::return_object<IdleNode>(node);
node = tmp;
}
- g_info->idle_list[i][j] = NULL;
+ g_info->idle_list[i][j] = nullptr;
// Release the per-bucket mutexes allocated in InitBlockPool.
delete g_info->lock[i][j];
- g_info->lock[i][j] = NULL;
+ g_info->lock[i][j] = nullptr;
}
}
delete g_info;
- g_info = NULL;
+ g_info = nullptr;
delete g_dump_mutex;
- g_dump_mutex = NULL;
+ g_dump_mutex = nullptr;
delete g_tls_info_mutex;
- g_tls_info_mutex = NULL;
+ g_tls_info_mutex = nullptr;
for (int i = 0; i < g_region_num; ++i) {
if (g_regions[i].start == 0) {
break;
@@ -634,7 +628,7 @@ void DestroyBlockPool() {
g_regions[i].start = 0;
}
g_region_num = 0;
- g_cb = NULL;
+ g_cb = nullptr;
}
// Just for UT
diff --git a/src/brpc/rdma/block_pool.h b/src/brpc/rdma/block_pool.h
index c9589fb0..b0b8ffc1 100644
--- a/src/brpc/rdma/block_pool.h
+++ b/src/brpc/rdma/block_pool.h
@@ -72,7 +72,7 @@ typedef uint32_t (*RegisterCallback)(void*, size_t);
// The argument is a callback called when the pool is enlarged with a new
// region. It should be the memory registration in brpc. However,
// in block_pool, we just abstract it into a function to get region id.
-// Return the first region's address, NULL if failed and errno is set.
+// Return the first region's address, nullptr if failed and errno is set.
bool InitBlockPool(RegisterCallback cb);
// In scenarios where users need to manually specify memory regions (e.g.,
using
@@ -83,10 +83,10 @@ bool InitBlockPool(RegisterCallback cb);
void* ExtendBlockPoolByUser(void* region_base, size_t region_size, int
block_type);
// Allocate a buf with length at least @a size (require: size>0)
-// Return the address allocated, NULL if failed and errno is set.
+// Return the address allocated, nullptr if failed and errno is set.
void* AllocBlock(size_t size);
-// Deallocate the buf (require: buf!=NULL)
+// Deallocate the buf (require: buf!=nullptr)
// Return 0 if success, -1 if failed and errno is set.
// If the given buf is not in any region, the errno is ERANGE.
int DeallocBlock(void* buf);
diff --git a/src/brpc/rdma/rdma_endpoint.cpp b/src/brpc/rdma/rdma_endpoint.cpp
index e2ce2e0c..fd70fb5c 100644
--- a/src/brpc/rdma/rdma_endpoint.cpp
+++ b/src/brpc/rdma/rdma_endpoint.cpp
@@ -88,23 +88,23 @@ extern const uint16_t MIN_QP_SIZE = 16;
static const uint16_t MAX_QP_SIZE = 4096;
extern const uint16_t MIN_BLOCK_SIZE = 1024;
-static butil::Mutex* g_rdma_resource_mutex = NULL;
-static RdmaResource* g_rdma_resource_list = NULL;
+static butil::Mutex* g_rdma_resource_mutex = nullptr;
+static RdmaResource* g_rdma_resource_list = nullptr;
RdmaResource::~RdmaResource() {
- if (NULL != qp) {
+ if (nullptr != qp) {
IbvDestroyQp(qp);
}
- if (NULL != polling_cq) {
+ if (nullptr != polling_cq) {
IbvDestroyCq(polling_cq);
}
- if (NULL != send_cq) {
+ if (nullptr != send_cq) {
IbvDestroyCq(send_cq);
}
- if (NULL != recv_cq) {
+ if (nullptr != recv_cq) {
IbvDestroyCq(recv_cq);
}
- if (NULL != comp_channel) {
+ if (nullptr != comp_channel) {
IbvDestroyCompChannel(comp_channel);
}
}
@@ -113,7 +113,7 @@ RdmaEndpoint::RdmaEndpoint(Socket* s)
: _socket(s)
, _state(UNINIT)
, _handshake_version(0)
- , _resource(NULL)
+ , _resource(nullptr)
, _send_cq_events(0)
, _recv_cq_events(0)
, _cq_sid(INVALID_SOCKET_ID)
@@ -160,7 +160,7 @@ void RdmaEndpoint::Reset() {
_state.store(UNINIT, butil::memory_order_relaxed);
_handshake_version = 0;
_outgoing_ece.reset();
- _resource = NULL;
+ _resource = nullptr;
_send_cq_events = 0;
_recv_cq_events = 0;
_cq_sid = INVALID_SOCKET_ID;
@@ -187,7 +187,7 @@ void RdmaConnect::StartConnect(const Socket* socket,
void (*done)(int err, void* data),
void* data) {
auto* rdma_transport =
static_cast<RdmaTransport*>(socket->_transport.get());
- CHECK(rdma_transport->_rdma_ep != NULL);
+ CHECK(rdma_transport->_rdma_ep != nullptr);
SocketUniquePtr s;
if (Socket::Address(socket->id(), &s) != 0) {
return;
@@ -223,7 +223,7 @@ void RdmaConnect::Run() {
void RdmaEndpoint::OnNewDataFromTcp(Socket* m) {
auto* rdma_transport = static_cast<RdmaTransport*>(m->_transport.get());
RdmaEndpoint* ep = rdma_transport->GetRdmaEp();
- CHECK(ep != NULL);
+ CHECK(ep != nullptr);
int progress = Socket::PROGRESS_INIT;
while (true) {
@@ -313,7 +313,7 @@ static int ReadFromFdLoop(butil::atomic<int>* read_butex,
}
int RdmaEndpoint::ReadFromFd(void* data, size_t len) {
- CHECK(data != NULL);
+ CHECK(data != nullptr);
const int fd = _socket->fd();
return ReadFromFdLoop(_read_butex, len,
[data, fd](size_t offset, size_t remaining) {
@@ -322,7 +322,7 @@ int RdmaEndpoint::ReadFromFd(void* data, size_t len) {
}
int RdmaEndpoint::ReadFromFd(butil::IOPortal* data, size_t len) {
- CHECK(data != NULL);
+ CHECK(data != nullptr);
const int fd = _socket->fd();
return ReadFromFdLoop(_read_butex, len,
[data, fd](size_t /*offset*/, size_t remaining) {
@@ -366,7 +366,7 @@ static int WriteToFdLoop(size_t len, WriteOnce&&
write_once, WaitWritable&& wait
}
int RdmaEndpoint::WriteToFd(void* data, size_t len) {
- CHECK(data != NULL);
+ CHECK(data != nullptr);
Socket* s = _socket;
const int fd = s->fd();
return WriteToFdLoop(len,
@@ -379,7 +379,7 @@ int RdmaEndpoint::WriteToFd(void* data, size_t len) {
}
int RdmaEndpoint::WriteToFd(butil::IOBuf* data) {
- CHECK(data != NULL);
+ CHECK(data != nullptr);
Socket* s = _socket;
const int fd = s->fd();
return WriteToFdLoop(data->size(),
@@ -428,7 +428,7 @@ void* RdmaEndpoint::ProcessHandshakeAtClient(void* arg) {
<< "Start handshake on " << s->description();
std::unique_ptr<RdmaHandshake> handshake = CreateClientHandshake(ep);
- CHECK(handshake != NULL);
+ CHECK(handshake != nullptr);
ep->_handshake_version = handshake->ProtocolVersion();
// First initialize CQ and QP resources.
@@ -439,7 +439,7 @@ void* RdmaEndpoint::ProcessHandshakeAtClient(void* arg) {
errno = 0;
rdma_transport->_rdma_state = RdmaTransport::RDMA_OFF;
ep->_state.store(FALLBACK_TCP, butil::memory_order_release);
- return NULL;
+ return nullptr;
}
// Send hello message to server
@@ -451,7 +451,7 @@ void* RdmaEndpoint::ProcessHandshakeAtClient(void* arg) {
s->SetFailed(saved_errno, "Fail to complete rdma handshake from %s:
%s",
s->description().c_str(), berror(saved_errno));
ep->_state.store(FAILED, butil::memory_order_relaxed);
- return NULL;
+ return nullptr;
}
// Receive and parse remote hello.
@@ -465,7 +465,7 @@ void* RdmaEndpoint::ProcessHandshakeAtClient(void* arg) {
s->SetFailed(saved_errno, "Fail to complete rdma handshake from %s:
%s",
s->description().c_str(), berror(saved_errno));
ep->_state.store(FAILED, butil::memory_order_relaxed);
- return NULL;
+ return nullptr;
}
if (r != RemoteHelloResult::NEGOTIATED) {
@@ -496,7 +496,7 @@ void* RdmaEndpoint::ProcessHandshakeAtClient(void* arg) {
s->SetFailed(saved_errno, "Fail to complete rdma handshake from %s:
%s",
s->description().c_str(), berror(saved_errno));
ep->_state.store(FAILED, butil::memory_order_relaxed);
- return NULL;
+ return nullptr;
}
if (rdma_transport->_rdma_state == RdmaTransport::RDMA_ON) {
@@ -512,7 +512,7 @@ void* RdmaEndpoint::ProcessHandshakeAtClient(void* arg) {
errno = 0;
- return NULL;
+ return nullptr;
}
// Server-side handshake entry: the state machine.
@@ -533,9 +533,9 @@ void* RdmaEndpoint::ProcessHandshakeAtClient(void* arg) {
ParseResult RdmaEndpoint::ExecuteServerHandshake(butil::IOBuf* source, Socket*
s) {
RdmaTransport* rdma_transport =
static_cast<RdmaTransport*>(s->_transport.get());
RdmaEndpoint* ep = rdma_transport->_rdma_ep;
- CHECK(ep != NULL);
+ CHECK(ep != nullptr);
- if (s->parsing_context() == NULL) {
+ if (s->parsing_context() == nullptr) {
// Phase 1: read the client hello, negotiate, reply server hello.
if (source->size() < HELLO_MAGIC_LEN) {
return MakeParseError(PARSE_ERROR_NOT_ENOUGH_DATA);
@@ -547,7 +547,7 @@ ParseResult
RdmaEndpoint::ExecuteServerHandshake(butil::IOBuf* source, Socket* s
// magic is NOT consumed; ReceiveAndParseRemoteHello() reads it again
// from `source`).
std::unique_ptr<RdmaHandshake> hs = CreateServerHandshakeByMagic(ep,
source, magic);
- if (hs == NULL) {
+ if (hs == nullptr) {
return MakeParseError(PARSE_ERROR_TRY_OTHERS);
}
ep->_handshake_version = hs->ProtocolVersion();
@@ -611,7 +611,7 @@ ParseResult
RdmaEndpoint::ExecuteServerHandshake(butil::IOBuf* source, Socket* s
LOG(WARNING) << "Too many bytes in handshake ACK, drop connection: "
<< s->description();
ep->_state.store(FAILED, butil::memory_order_relaxed);
- s->reset_parsing_context(NULL);
+ s->reset_parsing_context(nullptr);
return MakeParseError(PARSE_ERROR_ABSOLUTELY_WRONG);
}
@@ -624,7 +624,7 @@ ParseResult
RdmaEndpoint::ExecuteServerHandshake(butil::IOBuf* source, Socket* s
<< "Server handshake ends (use tcp) on " << s->description();
rdma_transport->_rdma_state = RdmaTransport::RDMA_OFF;
ep->_state.store(FALLBACK_TCP, butil::memory_order_release);
- s->reset_parsing_context(NULL);
+ s->reset_parsing_context(nullptr);
return MakeParseError(PARSE_ERROR_TRY_OTHERS);
}
@@ -632,7 +632,7 @@ ParseResult
RdmaEndpoint::ExecuteServerHandshake(butil::IOBuf* source, Socket* s
LOG(WARNING) << "Client wants RDMA in ACK but server fell back: "
<< s->description();
ep->_state.store(FAILED, butil::memory_order_relaxed);
- s->reset_parsing_context(NULL);
+ s->reset_parsing_context(nullptr);
return MakeParseError(PARSE_ERROR_ABSOLUTELY_WRONG);
}
@@ -641,7 +641,7 @@ ParseResult
RdmaEndpoint::ExecuteServerHandshake(butil::IOBuf* source, Socket* s
<< ") on " << s->description();
rdma_transport->_rdma_state = RdmaTransport::RDMA_ON;
ep->_state.store(ESTABLISHED, butil::memory_order_relaxed);
- s->reset_parsing_context(NULL);
+ s->reset_parsing_context(nullptr);
return MakeParseError(PARSE_ERROR_TRY_OTHERS);
}
@@ -718,7 +718,7 @@ ssize_t RdmaEndpoint::CutFromIOBufList(butil::IOBuf** from,
size_t ndata) {
return -1;
}
- CHECK(from != NULL);
+ CHECK(from != nullptr);
CHECK(ndata > 0);
size_t total_len = 0;
@@ -817,7 +817,7 @@ ssize_t RdmaEndpoint::CutFromIOBufList(butil::IOBuf** from,
size_t ndata) {
_sq_unsignaled = 0;
}
- ibv_send_wr* bad = NULL;
+ ibv_send_wr* bad = nullptr;
int err = ibv_post_send(_resource->qp, &wr, &bad);
if (err != 0) {
// We use other way to guarantee the Send Queue is not full.
@@ -867,7 +867,7 @@ int RdmaEndpoint::SendImm(uint32_t imm) {
wr.send_flags |= IBV_SEND_SOLICITED | IBV_SEND_SIGNALED;
wr.wr_id = 0;
- ibv_send_wr* bad = NULL;
+ ibv_send_wr* bad = nullptr;
int err = ibv_post_send(_resource->qp, &wr, &bad);
if (err != 0) {
std::ostringstream oss;
@@ -970,7 +970,7 @@ int RdmaEndpoint::DoPostRecv(void* block, size_t
block_size) {
wr.num_sge = 1;
wr.sg_list = &sge;
- ibv_recv_wr* bad = NULL;
+ ibv_recv_wr* bad = nullptr;
int err = ibv_post_recv(_resource->qp, &wr, &bad);
if (err != 0) {
LOG(WARNING) << "Fail to ibv_post_recv: " << berror(err);
@@ -1025,52 +1025,52 @@ static RdmaResource* AllocateQpCq(uint16_t sq_size,
uint16_t rq_size) {
std::unique_ptr<RdmaResource> resource(new RdmaResource);
if (!FLAGS_rdma_use_polling) {
resource->comp_channel = IbvCreateCompChannel(GetRdmaContext());
- if (NULL == resource->comp_channel) {
+ if (nullptr == resource->comp_channel) {
PLOG(WARNING) << "Fail to create comp channel for CQ";
- return NULL;
+ return nullptr;
}
if (butil::make_close_on_exec(resource->comp_channel->fd) < 0) {
PLOG(WARNING) << "Fail to set comp channel close-on-exec";
- return NULL;
+ return nullptr;
}
if (butil::make_non_blocking(resource->comp_channel->fd) < 0) {
PLOG(WARNING) << "Fail to set comp channel nonblocking";
- return NULL;
+ return nullptr;
}
resource->send_cq = IbvCreateCq(GetRdmaContext(),
FLAGS_rdma_prepared_qp_size,
- NULL, resource->comp_channel,
GetRdmaCompVector());
- if (NULL == resource->send_cq) {
+ nullptr, resource->comp_channel,
GetRdmaCompVector());
+ if (nullptr == resource->send_cq) {
PLOG(WARNING) << "Fail to create send CQ";
- return NULL;
+ return nullptr;
}
resource->recv_cq = IbvCreateCq(GetRdmaContext(),
FLAGS_rdma_prepared_qp_size,
- NULL, resource->comp_channel,
GetRdmaCompVector());
- if (NULL == resource->recv_cq) {
+ nullptr, resource->comp_channel,
GetRdmaCompVector());
+ if (nullptr == resource->recv_cq) {
PLOG(WARNING) << "Fail to create recv CQ";
- return NULL;
+ return nullptr;
}
resource->qp = AllocateQp(resource->send_cq, resource->recv_cq,
sq_size, rq_size);
- if (NULL == resource->qp) {
+ if (nullptr == resource->qp) {
PLOG(WARNING) << "Fail to create QP";
- return NULL;
+ return nullptr;
}
} else {
resource->polling_cq =
- IbvCreateCq(GetRdmaContext(), 2 * FLAGS_rdma_prepared_qp_size,
NULL, NULL, 0);
- if (NULL == resource->polling_cq) {
+ IbvCreateCq(GetRdmaContext(), 2 * FLAGS_rdma_prepared_qp_size,
nullptr, nullptr, 0);
+ if (nullptr == resource->polling_cq) {
PLOG(WARNING) << "Fail to create polling CQ";
- return NULL;
+ return nullptr;
}
resource->qp = AllocateQp(resource->polling_cq,
resource->polling_cq,
sq_size, rq_size);
- if (NULL == resource->qp) {
+ if (nullptr == resource->qp) {
PLOG(WARNING) << "Fail to create QP";
- return NULL;
+ return nullptr;
}
}
@@ -1101,7 +1101,7 @@ int RdmaEndpoint::DoAllocateResources() {
return 0;
}
- CHECK(_resource == NULL);
+ CHECK(_resource == nullptr);
if (_sq_size <= FLAGS_rdma_prepared_qp_size &&
_rq_size <= FLAGS_rdma_prepared_qp_size) {
@@ -1114,7 +1114,7 @@ int RdmaEndpoint::DoAllocateResources() {
if (!_resource) {
_resource = AllocateQpCq(_sq_size, _rq_size);
} else {
- _resource->next = NULL;
+ _resource->next = nullptr;
}
if (!_resource) {
return -1;
@@ -1156,7 +1156,7 @@ int RdmaEndpoint::DoAllocateResources() {
if (_rbuf.size() != _rq_size) {
return -1;
}
- _rbuf_data.resize(_rq_size, NULL);
+ _rbuf_data.resize(_rq_size, nullptr);
if (_rbuf_data.size() != _rq_size) {
return -1;
}
@@ -1196,7 +1196,7 @@ int RdmaEndpoint::BringUpQp(const ParsedHello& remote,
bool is_server) {
// Client: `remote->ece' is the server's reduced ECE;
// just set it here.
bool use_ece = true;
- if (IbvSetEce != NULL && remote.ece.has_value()) {
+ if (IbvSetEce != nullptr && remote.ece.has_value()) {
ibv_ece ece = *remote.ece;
int err = IbvSetEce(_resource->qp, &ece);
if (err != 0) {
@@ -1262,7 +1262,7 @@ int RdmaEndpoint::BringUpQp(const ParsedHello& remote,
bool is_server) {
// On the server side, now that the QP reached RTS, query the
reduced/negotiated
// ECE (the subset of enhancements supported by both peers) so it can be
returned
// to the client in the server hello.
- if (is_server && use_ece && IbvQueryEce != NULL && remote.ece.has_value())
{
+ if (is_server && use_ece && IbvQueryEce != nullptr &&
remote.ece.has_value()) {
ibv_ece ece;
int qerr = IbvQueryEce(_resource->qp, &ece);
if (qerr == 0) {
@@ -1277,7 +1277,7 @@ int RdmaEndpoint::BringUpQp(const ParsedHello& remote,
bool is_server) {
}
static void DeallocateCq(ibv_cq* cq) {
- if (NULL == cq) {
+ if (nullptr == cq) {
return;
}
@@ -1286,7 +1286,7 @@ static void DeallocateCq(ibv_cq* cq) {
}
static int DrainCq(ibv_cq* cq) {
- if (NULL == cq) {
+ if (nullptr == cq) {
return 0;
}
@@ -1318,27 +1318,27 @@ void RdmaEndpoint::DeallocateResources() {
}
}
- if (NULL != _resource->send_cq) {
+ if (nullptr != _resource->send_cq) {
IbvAckCqEvents(_resource->send_cq, _send_cq_events);
}
- if (NULL != _resource->recv_cq) {
+ if (nullptr != _resource->recv_cq) {
IbvAckCqEvents(_resource->recv_cq, _recv_cq_events);
}
bool remove_consumer = true;
_reclaim:
if (!move_to_rdma_resource_list) {
- if (NULL != _resource->qp) {
+ if (nullptr != _resource->qp) {
int err = IbvDestroyQp(_resource->qp);
LOG_IF(WARNING, 0 != err) << "Fail to destroy QP: " << berror(err);
- _resource->qp = NULL;
+ _resource->qp = nullptr;
}
DeallocateCq(_resource->polling_cq);
DeallocateCq(_resource->send_cq);
DeallocateCq(_resource->recv_cq);
- if (NULL != _resource->comp_channel) {
+ if (nullptr != _resource->comp_channel) {
// Destroy send_comp_channel will destroy this fd,
// so that we should remove it from epoll fd first
int fd = _resource->comp_channel->fd;
@@ -1349,12 +1349,12 @@ _reclaim:
}
- _resource->polling_cq = NULL;
- _resource->send_cq = NULL;
- _resource->recv_cq = NULL;
- _resource->comp_channel = NULL;
+ _resource->polling_cq = nullptr;
+ _resource->send_cq = nullptr;
+ _resource->recv_cq = nullptr;
+ _resource->comp_channel = nullptr;
delete _resource;
- _resource = NULL;
+ _resource = nullptr;
}
if (INVALID_SOCKET_ID != _cq_sid) {
@@ -1363,7 +1363,7 @@ _reclaim:
if (remove_consumer) {
s->_io_event.RemoveConsumer(s->_fd);
}
- s->_user = NULL; // Do not release user (this RdmaEndpoint).
+ s->_user = nullptr; // Do not release user (this RdmaEndpoint).
s->_fd = -1; // Already remove fd from epoll fd.
s->SetFailed();
}
@@ -1393,7 +1393,7 @@ _reclaim:
_resource->next = g_rdma_resource_list;
g_rdma_resource_list = _resource;
}
- _resource = NULL;
+ _resource = nullptr;
}
// Detach everything from this endpoint so that the function is
@@ -1407,8 +1407,8 @@ _reclaim:
static const int MAX_CQ_EVENTS = 128;
int RdmaEndpoint::GetAndAckEvents(SocketUniquePtr& s) {
- void* context = NULL;
- ibv_cq* cq = NULL;
+ void* context = nullptr;
+ ibv_cq* cq = nullptr;
while (true) {
if (IbvGetCqEvent(_resource->comp_channel, &cq, &context) != 0) {
if (errno != EAGAIN) {
@@ -1773,7 +1773,7 @@ void RdmaEndpoint::PollingModeRelease(bthread_tag_t tag) {
auto& running = group.running;
running.store(false, std::memory_order_relaxed);
for (int i = 0; i < FLAGS_rdma_poller_num; ++i) {
- bthread_join(pollers[i].tid, NULL);
+ bthread_join(pollers[i].tid, nullptr);
}
}
diff --git a/src/brpc/rdma/rdma_endpoint.h b/src/brpc/rdma/rdma_endpoint.h
index 03bec814..388e31d7 100644
--- a/src/brpc/rdma/rdma_endpoint.h
+++ b/src/brpc/rdma/rdma_endpoint.h
@@ -74,19 +74,19 @@ public:
private:
void Run();
- void (*_done)(int, void*){NULL};
- void* _data{NULL};
+ void (*_done)(int, void*){nullptr};
+ void* _data{nullptr};
};
struct RdmaResource {
- RdmaResource* next{NULL};
- ibv_qp* qp{NULL};
+ RdmaResource* next{nullptr};
+ ibv_qp* qp{nullptr};
// For polling mode.
- ibv_cq* polling_cq{NULL};
+ ibv_cq* polling_cq{nullptr};
// For event mode.
- ibv_cq* send_cq{NULL};
- ibv_cq* recv_cq{NULL};
- ibv_comp_channel* comp_channel{NULL};
+ ibv_cq* send_cq{nullptr};
+ ibv_cq* recv_cq{nullptr};
+ ibv_comp_channel* comp_channel{nullptr};
RdmaResource() = default;
~RdmaResource();
DISALLOW_COPY_AND_ASSIGN(RdmaResource);
diff --git a/src/brpc/rdma/rdma_handshake.cpp b/src/brpc/rdma/rdma_handshake.cpp
index 180c2b3f..17c67155 100644
--- a/src/brpc/rdma/rdma_handshake.cpp
+++ b/src/brpc/rdma/rdma_handshake.cpp
@@ -388,7 +388,7 @@ int RdmaHandshakeClientV3::SendLocalHello() {
// Query local ECE capabilities so they can be advertised in the client
// hello. v3-only. Best-effort: any failure or missing API just means we
// won't advertise ECE (the peer then degrades to no-ECE establishment).
- if (FLAGS_rdma_ece && IbvQueryEce != NULL &&
+ if (FLAGS_rdma_ece && IbvQueryEce != nullptr &&
_ep->_resource && _ep->_resource->qp) {
ibv_ece ece;
if (IbvQueryEce(_ep->_resource->qp, &ece) == 0) {
@@ -505,7 +505,7 @@ std::unique_ptr<RdmaHandshake> CreateServerHandshakeByMagic(
return std::unique_ptr<RdmaHandshake>(
new RdmaHandshakeServerV3(ep, source));
}
- return NULL;
+ return nullptr;
}
} // namespace rdma
diff --git a/src/brpc/rdma/rdma_handshake.h b/src/brpc/rdma/rdma_handshake.h
index 6238d424..2d10220a 100644
--- a/src/brpc/rdma/rdma_handshake.h
+++ b/src/brpc/rdma/rdma_handshake.h
@@ -171,7 +171,7 @@ public:
std::unique_ptr<RdmaHandshake> CreateClientHandshake(RdmaEndpoint* ep);
// Pick the server-side handshake based on the 4B magic already read.
-// Returns NULL if `magic` is not a recognized RDMA magic
+// Returns nullptr if `magic` is not a recognized RDMA magic
// (the caller should then fallback to TCP).
// "RDMA" -> RdmaHandshakeServerV2
// "RDM3" -> RdmaHandshakeServerV3
diff --git a/src/brpc/rdma/rdma_handshake_server.cpp
b/src/brpc/rdma/rdma_handshake_server.cpp
index 4072a11c..6dfb0c91 100644
--- a/src/brpc/rdma/rdma_handshake_server.cpp
+++ b/src/brpc/rdma/rdma_handshake_server.cpp
@@ -154,7 +154,7 @@ static int SendUnnegotiableHello(Socket* socket, int
version) {
// Fallback handshake for connections that are NOT in RDMA mode.
static ParseResult FallbackServerHandshake(butil::IOBuf* source, Socket*
socket) {
- if (socket->parsing_context() == NULL) {
+ if (socket->parsing_context() == nullptr) {
if (source->size() < HELLO_MAGIC_LEN) {
return MakeParseError(PARSE_ERROR_NOT_ENOUGH_DATA);
}
@@ -194,7 +194,7 @@ static ParseResult FallbackServerHandshake(butil::IOBuf*
source, Socket* socket)
CHECK_EQ(source->pop_front(HELLO_ACK_LEN), HELLO_ACK_LEN);
// Handshake done (downgraded to TCP); drop the context and let
// InputMessenger parse the following real RPC.
- socket->reset_parsing_context(NULL);
+ socket->reset_parsing_context(nullptr);
return MakeParseError(PARSE_ERROR_TRY_OTHERS);
}
diff --git a/src/brpc/rdma/rdma_helper.cpp b/src/brpc/rdma/rdma_helper.cpp
index b0e13ad7..38bd58ca 100644
--- a/src/brpc/rdma/rdma_helper.cpp
+++ b/src/brpc/rdma/rdma_helper.cpp
@@ -43,37 +43,37 @@ extern void (*blockmem_deallocate)(void*);
namespace brpc {
namespace rdma {
-void* g_handle_ibverbs = NULL;
+void* g_handle_ibverbs = nullptr;
bool g_skip_rdma_init = false;
-ibv_device** (*IbvGetDeviceList)(int*) = NULL;
-void (*IbvFreeDeviceList)(ibv_device**) = NULL;
-ibv_context* (*IbvOpenDevice)(ibv_device*) = NULL;
-int (*IbvCloseDevice)(ibv_context*) = NULL;
-const char* (*IbvGetDeviceName)(ibv_device*) = NULL;
-int (*IbvForkInit)(void) = NULL;
-int (*IbvQueryDevice)(ibv_context*, ibv_device_attr*) = NULL;
-int (*IbvQueryPort)(ibv_context*, uint8_t, ibv_port_attr*) = NULL;
-int (*IbvQueryGid)(ibv_context*, uint8_t, int, ibv_gid*) = NULL;
-ibv_pd* (*IbvAllocPd)(ibv_context*) = NULL;
-int (*IbvDeallocPd)(ibv_pd*) = NULL;
-ibv_cq* (*IbvCreateCq)(ibv_context*, int, void*, ibv_comp_channel*, int) =
NULL;
-int (*IbvDestroyCq)(ibv_cq*) = NULL;
-ibv_qp* (*IbvCreateQp)(ibv_pd*, ibv_qp_init_attr*) = NULL;
-int (*IbvModifyQp)(ibv_qp*, ibv_qp_attr*, ibv_qp_attr_mask) = NULL;
-int (*IbvQueryQp)(ibv_qp*, ibv_qp_attr*, ibv_qp_attr_mask, ibv_qp_init_attr*)
= NULL;
-int (*IbvDestroyQp)(ibv_qp*) = NULL;
-ibv_comp_channel* (*IbvCreateCompChannel)(ibv_context*) = NULL;
-int (*IbvDestroyCompChannel)(ibv_comp_channel*) = NULL;
-ibv_mr* (*IbvRegMr)(ibv_pd*, void*, size_t, int) = NULL;
-int (*IbvDeregMr)(ibv_mr*) = NULL;
-int (*IbvGetCqEvent)(ibv_comp_channel*, ibv_cq**, void**) = NULL;
-void (*IbvAckCqEvents)(ibv_cq*, unsigned int) = NULL;
-int (*IbvGetAsyncEvent)(ibv_context*, ibv_async_event*) = NULL;
-void (*IbvAckAsyncEvent)(ibv_async_event*) = NULL;
-const char* (*IbvEventTypeStr)(ibv_event_type) = NULL;
-int (*IbvQueryEce)(ibv_qp*, ibv_ece*) = NULL;
-int (*IbvSetEce)(ibv_qp*, ibv_ece*) = NULL;
+ibv_device** (*IbvGetDeviceList)(int*) = nullptr;
+void (*IbvFreeDeviceList)(ibv_device**) = nullptr;
+ibv_context* (*IbvOpenDevice)(ibv_device*) = nullptr;
+int (*IbvCloseDevice)(ibv_context*) = nullptr;
+const char* (*IbvGetDeviceName)(ibv_device*) = nullptr;
+int (*IbvForkInit)(void) = nullptr;
+int (*IbvQueryDevice)(ibv_context*, ibv_device_attr*) = nullptr;
+int (*IbvQueryPort)(ibv_context*, uint8_t, ibv_port_attr*) = nullptr;
+int (*IbvQueryGid)(ibv_context*, uint8_t, int, ibv_gid*) = nullptr;
+ibv_pd* (*IbvAllocPd)(ibv_context*) = nullptr;
+int (*IbvDeallocPd)(ibv_pd*) = nullptr;
+ibv_cq* (*IbvCreateCq)(ibv_context*, int, void*, ibv_comp_channel*, int) =
nullptr;
+int (*IbvDestroyCq)(ibv_cq*) = nullptr;
+ibv_qp* (*IbvCreateQp)(ibv_pd*, ibv_qp_init_attr*) = nullptr;
+int (*IbvModifyQp)(ibv_qp*, ibv_qp_attr*, ibv_qp_attr_mask) = nullptr;
+int (*IbvQueryQp)(ibv_qp*, ibv_qp_attr*, ibv_qp_attr_mask, ibv_qp_init_attr*)
= nullptr;
+int (*IbvDestroyQp)(ibv_qp*) = nullptr;
+ibv_comp_channel* (*IbvCreateCompChannel)(ibv_context*) = nullptr;
+int (*IbvDestroyCompChannel)(ibv_comp_channel*) = nullptr;
+ibv_mr* (*IbvRegMr)(ibv_pd*, void*, size_t, int) = nullptr;
+int (*IbvDeregMr)(ibv_mr*) = nullptr;
+int (*IbvGetCqEvent)(ibv_comp_channel*, ibv_cq**, void**) = nullptr;
+void (*IbvAckCqEvents)(ibv_cq*, unsigned int) = nullptr;
+int (*IbvGetAsyncEvent)(ibv_context*, ibv_async_event*) = nullptr;
+void (*IbvAckAsyncEvent)(ibv_async_event*) = nullptr;
+const char* (*IbvEventTypeStr)(ibv_event_type) = nullptr;
+int (*IbvQueryEce)(ibv_qp*, ibv_ece*) = nullptr;
+int (*IbvSetEce)(ibv_qp*, ibv_ece*) = nullptr;
// NOTE:
// ibv_post_send, ibv_post_recv, ibv_poll_cq, ibv_req_notify_cq are all inline
function
@@ -97,18 +97,18 @@ DEFINE_int32(rdma_port, 1, "The port number to use. For
RoCE, it is always 1.");
DEFINE_int32(rdma_gid_index, -1, "The GID index to use. -1 means using the
last one.");
// static const size_t SYSFS_SIZE = 4096;
-static ibv_device** g_devices = NULL;
-static ibv_context* g_context = NULL;
+static ibv_device** g_devices = nullptr;
+static ibv_context* g_context = nullptr;
static SocketId g_async_socket;
-static ibv_pd* g_pd = NULL;
-static std::vector<ibv_mr*>* g_mrs = NULL; // mr registered by brpc
+static ibv_pd* g_pd = nullptr;
+static std::vector<ibv_mr*>* g_mrs = nullptr; // mr registered by brpc
static butil::FlatMap<void*, ibv_mr*>* g_user_mrs; // mr registered by user
-static butil::Mutex* g_user_mrs_lock = NULL;
+static butil::Mutex* g_user_mrs_lock = nullptr;
// Store the original IOBuf memalloc and memdealloc functions
-static void* (*g_mem_alloc)(size_t) = NULL;
-static void (*g_mem_dealloc)(void*) = NULL;
+static void* (*g_mem_alloc)(size_t) = nullptr;
+static void (*g_mem_dealloc)(void*) = nullptr;
namespace {
struct IbvDeviceDeleter {
@@ -141,32 +141,32 @@ static void GlobalRelease() {
}
g_user_mrs->clear();
delete g_user_mrs;
- g_user_mrs = NULL;
+ g_user_mrs = nullptr;
}
delete g_user_mrs_lock;
- g_user_mrs_lock = NULL;
+ g_user_mrs_lock = nullptr;
if (g_mrs) {
for (size_t i = 0; i < g_mrs->size(); ++i) {
IbvDeregMr((*g_mrs)[i]);
}
delete g_mrs;
- g_mrs = NULL;
+ g_mrs = nullptr;
}
if (g_pd) {
IbvDeallocPd(g_pd);
- g_pd = NULL;
+ g_pd = nullptr;
}
if (g_context) {
IbvCloseDevice(g_context);
- g_context = NULL;
+ g_context = nullptr;
}
if (g_devices) {
IbvFreeDeviceList(g_devices);
- g_devices = NULL;
+ g_devices = nullptr;
}
}
@@ -194,7 +194,7 @@ uint32_t RdmaRegisterMemory(void* buf, size_t size) {
static void* BlockAllocate(size_t len) {
if (len == 0) {
errno = EINVAL;
- return NULL;
+ return nullptr;
}
void* ptr = AllocBlock(len);
if (!ptr) {
@@ -349,11 +349,11 @@ static void OnRdmaAsyncEvent(Socket* m) {
// Soft-load an OPTIONAL symbol: if the symbol is missing (e.g. the
// installed libibverbs predates rdma-core v35 which introduced the ECE
-// APIs), leave the function pointer NULL and continue instead of failing
+// APIs), leave the function pointer nullptr and continue instead of failing
// the whole RDMA initialization. Callers MUST null-check before use.
#define LoadSymbolOptional(handle, func, symbol) \
*(void**)(&func) = dlsym(handle, symbol); \
- LOG_IF(WARNING, func == NULL) \
+ LOG_IF(WARNING, func == nullptr) \
<< "Optional symbol not found (feature disabled): " << symbol;
static int ReadRdmaDynamicLib() {
@@ -530,28 +530,13 @@ static void GlobalRdmaInitializeOrDieImpl() {
ExitWithError();
}
- g_user_mrs_lock = new (std::nothrow) butil::Mutex;
- if (!g_user_mrs_lock) {
- PLOG(WARNING) << "Fail to construct g_user_mrs_lock";
- ExitWithError();
- }
-
- g_user_mrs = new (std::nothrow) butil::FlatMap<void*, ibv_mr*>();
- if (!g_user_mrs) {
- PLOG(WARNING) << "Fail to construct g_user_mrs";
- ExitWithError();
- }
-
+ g_user_mrs_lock = new butil::Mutex;
+ g_user_mrs = new butil::FlatMap<void*, ibv_mr*>();
if (g_user_mrs->init(65536) < 0) {
PLOG(WARNING) << "Fail to initialize g_user_mrs";
ExitWithError();
}
-
- g_mrs = new (std::nothrow) std::vector<ibv_mr*>;
- if (!g_mrs) {
- PLOG(ERROR) << "Fail to allocate a RDMA MR list";
- ExitWithError();
- }
+ g_mrs = new std::vector<ibv_mr*>;
ibv_device_attr attr;
if (IbvQueryDevice(g_context, &attr) != 0) {
@@ -637,7 +622,7 @@ uint32_t RegisterMemoryForRdma(void* buf, size_t len) {
}
void DeregisterMemoryForRdma(void* buf) {
- ibv_mr* mr = NULL;
+ ibv_mr* mr = nullptr;
{
BAIDU_SCOPED_LOCK(*g_user_mrs_lock);
ibv_mr** mr_ptr = g_user_mrs->seek(buf);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]