Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
kvdb
rocksdb
提交
174e2be5
R
rocksdb
项目概览
kvdb
/
rocksdb
12 个月 前同步成功
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rocksdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
174e2be5
编写于
9月 25, 2015
作者:
I
Igor Canadi
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #735 from jsteemann/fix-potential-leak-in-allocate
prevent potential memleaks in Arena::Allocate*()
上级
25fd743d
aa58958d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
16 addition
and
1 deletion
+16
-1
util/arena.cc
util/arena.cc
+16
-1
未找到文件。
util/arena.cc
浏览文件 @
174e2be5
...
...
@@ -84,10 +84,12 @@ char* Arena::AllocateFallback(size_t bytes, bool aligned) {
// We waste the remaining space in the current block.
size_t
size
;
char
*
block_head
=
nullptr
;
#ifdef MAP_HUGETLB
if
(
hugetlb_size_
)
{
size
=
hugetlb_size_
;
block_head
=
AllocateFromHugePage
(
size
);
}
#endif
if
(
!
block_head
)
{
size
=
kBlockSize
;
block_head
=
AllocateNewBlock
(
size
);
...
...
@@ -110,6 +112,11 @@ char* Arena::AllocateFromHugePage(size_t bytes) {
if
(
hugetlb_size_
==
0
)
{
return
nullptr
;
}
// already reserve space in huge_blocks_ before calling mmap().
// this way the insertion into the vector below will not throw and we
// won't leak the mapping in that case. if reserve() throws, we
// won't leak either
huge_blocks_
.
reserve
(
huge_blocks_
.
size
()
+
1
);
void
*
addr
=
mmap
(
nullptr
,
bytes
,
(
PROT_READ
|
PROT_WRITE
),
(
MAP_PRIVATE
|
MAP_ANONYMOUS
|
MAP_HUGETLB
),
0
,
0
);
...
...
@@ -117,7 +124,8 @@ char* Arena::AllocateFromHugePage(size_t bytes) {
if
(
addr
==
MAP_FAILED
)
{
return
nullptr
;
}
huge_blocks_
.
push_back
(
MmapInfo
(
addr
,
bytes
));
// the following shouldn't throw because of the above reserve()
huge_blocks_
.
emplace_back
(
MmapInfo
(
addr
,
bytes
));
blocks_memory_
+=
bytes
;
return
reinterpret_cast
<
char
*>
(
addr
);
#else
...
...
@@ -167,6 +175,12 @@ char* Arena::AllocateAligned(size_t bytes, size_t huge_page_size,
}
char
*
Arena
::
AllocateNewBlock
(
size_t
block_bytes
)
{
// already reserve space in blocks_ before allocating memory via new.
// this way the insertion into the vector below will not throw and we
// won't leak the allocated memory in that case. if reserve() throws,
// we won't leak either
blocks_
.
reserve
(
blocks_
.
size
()
+
1
);
char
*
block
=
new
char
[
block_bytes
];
#ifdef ROCKSDB_MALLOC_USABLE_SIZE
...
...
@@ -174,6 +188,7 @@ char* Arena::AllocateNewBlock(size_t block_bytes) {
#else
blocks_memory_
+=
block_bytes
;
#endif // ROCKSDB_MALLOC_USABLE_SIZE
// the following shouldn't throw because of the above reserve()
blocks_
.
push_back
(
block
);
return
block
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录