Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
e12b2d04
T
TDengine
项目概览
taosdata
/
TDengine
12 个月 前同步成功
通知
1180
Star
22014
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e12b2d04
编写于
11月 16, 2021
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
more
上级
094ce843
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
57 addition
and
80 deletion
+57
-80
source/dnode/vnode/impl/src/vnodeBufferPool.c
source/dnode/vnode/impl/src/vnodeBufferPool.c
+57
-80
未找到文件。
source/dnode/vnode/impl/src/vnodeBufferPool.c
浏览文件 @
e12b2d04
...
...
@@ -16,15 +16,23 @@
#include "vnodeDef.h"
/* ------------------------ STRUCTURES ------------------------ */
#define VNODE_BUF_POOL_SHARDS 3
struct
SVBufPool
{
SList
free
;
SList
incycle
;
SListNode
*
inuse
;
};
typedef
enum
{
E_V_HEAP_ALLOCATOR
=
0
,
E_V_ARENA_ALLOCATOR
}
EVMemAllocatorT
;
typedef
enum
{
// Heap allocator
E_V_HEAP_ALLOCATOR
=
0
,
// Arena allocator
E_V_ARENA_ALLOCATOR
}
EVMemAllocatorT
;
typedef
struct
{
/* TODO */
}
SVHeapAllocator
;
typedef
struct
SVArenaNode
{
...
...
@@ -35,14 +43,16 @@ typedef struct SVArenaNode {
}
SVArenaNode
;
typedef
struct
{
uint64_t
ssize
;
// step size
uint64_t
lsize
;
// limit size
SVArenaNode
*
inuse
;
SVArenaNode
node
;
}
SVArenaAllocator
;
typedef
struct
{
T_REF_DECLARE
()
uint64_t
capacity
;
EVMemAllocatorT
type
;
T_REF_DECLARE
()
union
{
SVHeapAllocator
vha
;
SVArenaAllocator
vaa
;
...
...
@@ -51,10 +61,6 @@ typedef struct {
static
SListNode
*
vBufPoolNewNode
(
uint64_t
capacity
,
EVMemAllocatorT
type
);
static
void
vBufPoolFreeNode
(
SListNode
*
pNode
);
static
int
vArenaAllocatorInit
(
SVArenaAllocator
*
pvaa
);
static
void
vArenaAllocatorClear
(
SVArenaAllocator
*
pvaa
);
static
int
vHeapAllocatorInit
(
SVHeapAllocator
*
pvha
);
static
void
vHeapAllocatorClear
(
SVHeapAllocator
*
pvha
);
int
vnodeOpenBufPool
(
SVnode
*
pVnode
)
{
uint64_t
capacity
;
...
...
@@ -68,12 +74,12 @@ int vnodeOpenBufPool(SVnode *pVnode) {
tdListInit
(
&
(
pVnode
->
pBufPool
->
free
),
0
);
tdListInit
(
&
(
pVnode
->
pBufPool
->
incycle
),
0
);
capacity
=
pVnode
->
options
.
wsize
/
3
;
capacity
=
pVnode
->
options
.
wsize
/
VNODE_BUF_POOL_SHARDS
;
if
(
pVnode
->
options
.
isHeapAllocator
)
{
type
=
E_V_HEAP_ALLOCATOR
;
}
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
for
(
int
i
=
0
;
i
<
VNODE_BUF_POOL_SHARDS
;
i
++
)
{
SListNode
*
pNode
=
vBufPoolNewNode
(
capacity
,
type
);
if
(
pNode
==
NULL
)
{
vnodeCloseBufPool
(
pVnode
);
...
...
@@ -83,8 +89,6 @@ int vnodeOpenBufPool(SVnode *pVnode) {
tdListAppendNode
(
&
(
pVnode
->
pBufPool
->
free
),
pNode
);
}
pVnode
->
pBufPool
->
inuse
=
tdListPopHead
(
&
(
pVnode
->
pBufPool
->
free
));
return
0
;
}
...
...
@@ -102,67 +106,49 @@ void vnodeCloseBufPool(SVnode *pVnode) {
}
// Free inuse node
vBufPoolFreeNode
(
pVnode
->
pBufPool
->
inuse
);
if
(
pVnode
->
pBufPool
->
inuse
)
{
vBufPoolFreeNode
(
pVnode
->
pBufPool
->
inuse
);
}
free
(
pVnode
->
pBufPool
);
pVnode
->
pBufPool
=
NULL
;
}
}
SMemAllocator
*
vnodeCreateMemAllocator
(
SVnode
*
pVnode
)
{
SMemAllocator
*
pma
;
pma
=
(
SMemAllocator
*
)
calloc
(
1
,
sizeof
(
*
pma
));
if
(
pma
==
NULL
)
{
/* TODO */
return
NULL
;
}
pma
->
impl
=
pVnode
;
if
(
pVnode
->
options
.
isHeapAllocator
)
{
/* TODO */
pma
->
malloc
=
NULL
;
pma
->
calloc
=
NULL
;
pma
->
realloc
=
NULL
;
pma
->
free
=
NULL
;
pma
->
usage
=
NULL
;
}
else
{
/* TODO */
pma
->
malloc
=
NULL
;
pma
->
calloc
=
NULL
;
pma
->
realloc
=
NULL
;
pma
->
free
=
NULL
;
pma
->
usage
=
NULL
;
}
return
pma
;
}
void
vnodeDestroyMemAllocator
(
SMemAllocator
*
pma
)
{
tfree
(
pma
);
}
void
vnodeRefMemAllocator
(
SMemAllocator
*
pma
)
{
SVnode
*
pVnode
=
(
SVnode
*
)
pma
->
impl
;
SVMemAllocator
*
pvma
=
(
SVMemAllocator
*
)(
pVnode
->
pBufPool
->
inuse
->
data
);
T_REF_INC
(
pvma
);
/* ------------------------ STATIC METHODS ------------------------ */
static
void
vArenaAllocatorInit
(
SVArenaAllocator
*
pvaa
,
uint64_t
capacity
,
uint64_t
ssize
,
uint64_t
lsize
)
{
/* TODO */
pvaa
->
ssize
=
ssize
;
pvaa
->
lsize
=
lsize
;
pvaa
->
inuse
=
&
pvaa
->
node
;
pvaa
->
node
.
prev
=
NULL
;
pvaa
->
node
.
size
=
capacity
;
pvaa
->
node
.
ptr
=
pvaa
->
node
.
data
;
}
void
vnodeUnrefMemAllocator
(
SMemAllocator
*
pma
)
{
SVnode
*
pVnode
=
(
SVnode
*
)
pma
->
impl
;
SVMemAllocator
*
pvma
=
(
SVMemAllocator
*
)(
pVnode
->
pBufPool
->
inuse
->
data
);
if
(
T_REF_DEC
(
pvma
)
==
0
)
{
/* TODO */
static
void
vArenaAllocatorClear
(
SVArenaAllocator
*
pvaa
)
{
/* TODO */
while
(
pvaa
->
inuse
!=
&
(
pvaa
->
node
))
{
SVArenaNode
*
pANode
=
pvaa
->
inuse
;
pvaa
->
inuse
=
pANode
->
prev
;
free
(
pANode
);
}
}
/* ------------------------ STATIC METHODS ------------------------ */
static
SListNode
*
vBufPoolNewNode
(
uint64_t
capacity
,
EVMemAllocatorT
type
)
{
SListNode
*
pNode
;
SVMemAllocator
*
pvma
;
uint64_t
msize
;
uint64_t
ssize
=
0
;
// TODO
uint64_t
lsize
=
0
;
// TODO
pNode
=
(
SListNode
*
)
calloc
(
1
,
sizeof
(
*
pNode
)
+
sizeof
(
SVMemAllocator
));
msize
=
sizeof
(
SListNode
)
+
sizeof
(
SVMemAllocator
);
if
(
type
==
E_V_ARENA_ALLOCATOR
)
{
msize
+=
capacity
;
}
pNode
=
(
SListNode
*
)
calloc
(
1
,
msize
);
if
(
pNode
==
NULL
)
{
// TODO: handle error
return
NULL
;
}
...
...
@@ -171,11 +157,11 @@ static SListNode *vBufPoolNewNode(uint64_t capacity, EVMemAllocatorT type) {
pvma
->
type
=
type
;
switch
(
type
)
{
case
E_V_HEAP_ALLOCATOR
:
vHeapAllocatorInit
(
&
(
pvma
->
vha
));
break
;
case
E_V_ARENA_ALLOCATOR
:
vArenaAllocatorInit
(
&
(
pvma
->
vaa
));
vArenaAllocatorInit
(
&
(
pvma
->
vaa
),
capacity
,
ssize
,
lsize
);
break
;
case
E_V_HEAP_ALLOCATOR
:
// vHeapAllocatorInit(&(pvma->vha));
break
;
default:
ASSERT
(
0
);
...
...
@@ -185,27 +171,18 @@ static SListNode *vBufPoolNewNode(uint64_t capacity, EVMemAllocatorT type) {
}
static
void
vBufPoolFreeNode
(
SListNode
*
pNode
)
{
if
(
pNode
)
{
free
(
pNode
);
}
}
// --------------- For arena allocator
static
int
vArenaAllocatorInit
(
SVArenaAllocator
*
pvaa
)
{
// TODO
return
0
;
}
SVMemAllocator
*
pvma
=
(
SVMemAllocator
*
)(
pNode
->
data
);
static
void
vArenaAllocatorClear
(
SVArenaAllocator
*
pvaa
)
{
// TODO
}
// --------------- For heap allocator
static
int
vHeapAllocatorInit
(
SVHeapAllocator
*
pvha
)
{
// TODO
return
0
;
}
switch
(
pvma
->
type
)
{
case
E_V_ARENA_ALLOCATOR
:
vArenaAllocatorClear
(
&
(
pvma
->
vaa
));
break
;
case
E_V_HEAP_ALLOCATOR
:
// vHeapAllocatorClear(&(pvma->vha));
break
;
default:
break
;
}
static
void
vHeapAllocatorClear
(
SVHeapAllocator
*
pvha
)
{
// TODO
free
(
pNode
);
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录