Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Harfbuzz
提交
3305a2ca
T
Third Party Harfbuzz
项目概览
OpenHarmony
/
Third Party Harfbuzz
1 年多 前同步成功
通知
0
Star
18
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Harfbuzz
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
3305a2ca
编写于
4月 02, 2019
作者:
B
Behdad Esfahbod
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[serialize] Port to use object pool
Tested, but feels fragile :(.
上级
5efbc011
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
91 addition
and
55 deletion
+91
-55
src/hb-pool.hh
src/hb-pool.hh
+4
-1
src/hb-serialize.hh
src/hb-serialize.hh
+87
-54
未找到文件。
src/hb-pool.hh
浏览文件 @
3305a2ca
...
@@ -35,14 +35,17 @@ template <typename T, unsigned ChunkLen = 16>
...
@@ -35,14 +35,17 @@ template <typename T, unsigned ChunkLen = 16>
struct
hb_pool_t
struct
hb_pool_t
{
{
hb_pool_t
()
:
next
(
nullptr
)
{}
hb_pool_t
()
:
next
(
nullptr
)
{}
~
hb_pool_t
()
{
fini
();
}
~
hb_pool_t
()
void
fini
()
{
{
next
=
nullptr
;
next
=
nullptr
;
+
hb_iter
(
chunks
)
+
hb_iter
(
chunks
)
|
hb_apply
([]
(
chunk_t
*
_
)
{
::
free
(
_
);
})
|
hb_apply
([]
(
chunk_t
*
_
)
{
::
free
(
_
);
})
;
;
chunks
.
fini
();
}
}
T
*
alloc
()
T
*
alloc
()
...
...
src/hb-serialize.hh
浏览文件 @
3305a2ca
/*
/*
* Copyright © 2007,2008,2009,2010 Red Hat, Inc.
* Copyright © 2007,2008,2009,2010 Red Hat, Inc.
* Copyright © 2012,2018 Google, Inc.
* Copyright © 2012,2018 Google, Inc.
* Copyright © 2019 Facebook, Inc.
*
*
* This is part of HarfBuzz, a text shaping library.
* This is part of HarfBuzz, a text shaping library.
*
*
...
@@ -24,6 +25,7 @@
...
@@ -24,6 +25,7 @@
*
*
* Red Hat Author(s): Behdad Esfahbod
* Red Hat Author(s): Behdad Esfahbod
* Google Author(s): Behdad Esfahbod
* Google Author(s): Behdad Esfahbod
* Facebook Author(s): Behdad Esfahbod
*/
*/
#ifndef HB_SERIALIZE_HH
#ifndef HB_SERIALIZE_HH
...
@@ -32,6 +34,7 @@
...
@@ -32,6 +34,7 @@
#include "hb.hh"
#include "hb.hh"
#include "hb-blob.hh"
#include "hb-blob.hh"
#include "hb-map.hh"
#include "hb-map.hh"
#include "hb-pool.hh"
/*
/*
...
@@ -73,22 +76,34 @@ struct hb_serialize_context_t
...
@@ -73,22 +76,34 @@ struct hb_serialize_context_t
};
};
hb_vector_t
<
link_t
>
links
;
hb_vector_t
<
link_t
>
links
;
object_t
*
next
;
};
};
range_t
snapshot
()
{
range_t
s
=
{
head
,
tail
}
;
return
s
;
}
range_t
snapshot
()
{
range_t
s
=
{
head
,
tail
}
;
return
s
;
}
hb_serialize_context_t
(
void
*
start_
,
unsigned
int
size
)
hb_serialize_context_t
(
void
*
start_
,
unsigned
int
size
)
:
{
start
((
char
*
)
start_
),
this
->
start
=
(
char
*
)
start_
;
end
(
start
+
size
),
this
->
end
=
this
->
start
+
size
;
current
(
nullptr
)
reset
();
{
reset
();
}
}
~
hb_serialize_context_t
()
{
fini
();
}
~
hb_serialize_context_t
()
void
fini
()
{
{
current
.
fini_deep
();
++
hb_iter
(
packed
)
packed
.
fini_deep
();
|
hb_apply
([]
(
object_t
*
_
)
{
_
->
fini
();
})
packed_map
.
fini
();
;
packed
.
fini
();
this
->
packed_map
.
fini
();
while
(
current
)
{
auto
*
_
=
current
;
current
=
current
->
next
;
_
->
fini
();
}
object_pool
.
fini
();
}
}
bool
in_error
()
const
{
return
!
this
->
successful
;
}
bool
in_error
()
const
{
return
!
this
->
successful
;
}
...
@@ -101,10 +116,8 @@ struct hb_serialize_context_t
...
@@ -101,10 +116,8 @@ struct hb_serialize_context_t
this
->
tail
=
this
->
end
;
this
->
tail
=
this
->
end
;
this
->
debug_depth
=
0
;
this
->
debug_depth
=
0
;
this
->
current
.
reset
();
fini
();
this
->
packed
.
reset
();
this
->
packed
.
push
(
nullptr
);
this
->
packed
.
push
()
->
head
=
this
->
end
;
this
->
packed_map
.
reset
();
}
}
bool
propagate_error
(
bool
e
)
bool
propagate_error
(
bool
e
)
...
@@ -128,7 +141,7 @@ struct hb_serialize_context_t
...
@@ -128,7 +141,7 @@ struct hb_serialize_context_t
this
->
start
,
this
->
end
,
this
->
start
,
this
->
end
,
(
unsigned
long
)
(
this
->
end
-
this
->
start
));
(
unsigned
long
)
(
this
->
end
-
this
->
start
));
assert
(
!
current
.
length
);
assert
(
!
current
);
return
push
<
Type
>
();
return
push
<
Type
>
();
}
}
void
end_serialize
()
void
end_serialize
()
...
@@ -139,9 +152,10 @@ struct hb_serialize_context_t
...
@@ -139,9 +152,10 @@ struct hb_serialize_context_t
(
unsigned
)
(
this
->
head
-
this
->
start
),
(
unsigned
)
(
this
->
head
-
this
->
start
),
this
->
successful
?
"successful"
:
"UNSUCCESSFUL"
);
this
->
successful
?
"successful"
:
"UNSUCCESSFUL"
);
/* TODO Propagate errors. */
propagate_error
(
packed
,
packed_map
);
assert
(
current
.
length
==
1
);
if
(
unlikely
(
!
current
))
return
;
assert
(
!
current
->
next
);
/* Only "pack" if there exist other objects... Otherwise, don't bother.
/* Only "pack" if there exist other objects... Otherwise, don't bother.
* Saves a move. */
* Saves a move. */
...
@@ -150,55 +164,69 @@ struct hb_serialize_context_t
...
@@ -150,55 +164,69 @@ struct hb_serialize_context_t
pop_pack
();
pop_pack
();
link
();
resolve_links
();
}
}
template
<
typename
Type
=
void
>
template
<
typename
Type
=
void
>
Type
*
push
()
Type
*
push
()
{
{
object_t
obj
;
object_t
*
obj
=
object_pool
.
alloc
();
obj
.
head
=
head
;
if
(
unlikely
(
!
obj
))
obj
.
tail
=
tail
;
propagate_error
(
false
);
current
.
push
(
obj
);
else
{
obj
->
head
=
head
;
obj
->
tail
=
tail
;
obj
->
next
=
current
;
current
=
obj
;
}
return
start_embed
<
Type
>
();
return
start_embed
<
Type
>
();
}
}
void
pop_discard
()
void
pop_discard
()
{
{
revert
(
current
.
pop
());
object_t
*
obj
=
current
;
if
(
unlikely
(
!
obj
))
return
;
current
=
current
->
next
;
revert
(
*
obj
);
object_pool
.
free
(
obj
);
}
}
objidx_t
pop_pack
()
objidx_t
pop_pack
()
{
{
object_t
obj
=
current
.
pop
();
object_t
*
obj
=
current
;
obj
.
tail
=
head
;
if
(
unlikely
(
!
obj
))
return
0
;
unsigned
len
=
obj
.
tail
-
obj
.
head
;
current
=
current
->
next
;
obj
->
tail
=
head
;
obj
->
next
=
nullptr
;
unsigned
len
=
obj
->
tail
-
obj
->
head
;
if
(
!
len
)
if
(
!
len
)
{
assert
(
!
obj
->
links
.
length
);
return
0
;
return
0
;
}
objidx_t
objidx
=
packed_map
.
get
(
&
obj
);
objidx_t
objidx
=
packed_map
.
get
(
obj
);
if
(
objidx
)
if
(
objidx
)
{
{
obj
.
fini
();
obj
->
fini
();
return
objidx
;
return
objidx
;
}
}
tail
-=
len
;
tail
-=
len
;
memmove
(
tail
,
obj
.
head
,
len
);
memmove
(
tail
,
obj
->
head
,
len
);
head
=
obj
.
head
;
head
=
obj
->
head
;
obj
.
head
=
tail
;
obj
->
head
=
tail
;
obj
.
tail
=
tail
+
len
;
obj
->
tail
=
tail
+
len
;
object_t
*
key
=
packed
.
push
(
hb_move
(
obj
)
);
packed
.
push
(
obj
);
/* TODO Handle error. */
if
(
unlikely
(
packed
.
in_error
()))
if
(
unlikely
(
packed
.
in_error
()))
return
0
;
return
0
;
objidx
=
packed
.
length
-
1
;
objidx
=
packed
.
length
-
1
;
if
(
0
)
// XXX Ouch. Our hashmap becomes invalid if packed resizes!
packed_map
.
set
(
obj
,
objidx
);
packed_map
.
set
(
key
,
objidx
);
return
objidx
;
return
objidx
;
}
}
...
@@ -215,12 +243,15 @@ struct hb_serialize_context_t
...
@@ -215,12 +243,15 @@ struct hb_serialize_context_t
void
discard_stale_objects
()
void
discard_stale_objects
()
{
{
while
(
packed
.
length
>
1
&&
while
(
packed
.
length
>
1
&&
packed
.
tail
()
.
head
<
tail
)
packed
.
tail
()
->
head
<
tail
)
{
{
packed_map
.
del
(
&
packed
.
tail
());
packed_map
.
del
(
packed
.
tail
());
assert
(
!
packed
.
tail
()
->
next
);
packed
.
tail
()
->
fini
();
packed
.
pop
();
packed
.
pop
();
}
}
assert
(
packed
.
tail
().
head
==
tail
);
if
(
packed
.
length
>
1
)
assert
(
packed
.
tail
()
->
head
==
tail
);
}
}
template
<
typename
T
>
template
<
typename
T
>
...
@@ -231,34 +262,33 @@ struct hb_serialize_context_t
...
@@ -231,34 +262,33 @@ struct hb_serialize_context_t
if
(
!
objidx
)
if
(
!
objidx
)
return
;
return
;
assert
(
current
.
length
);
assert
(
current
);
assert
(
current
.
tail
().
head
<=
(
const
char
*
)
&
ofs
);
assert
(
current
->
head
<=
(
const
char
*
)
&
ofs
);
if
(
!
base
)
if
(
!
base
)
base
=
current
.
tail
().
head
;
base
=
current
->
head
;
else
else
assert
(
current
.
tail
().
head
<=
(
const
char
*
)
base
);
assert
(
current
->
head
<=
(
const
char
*
)
base
);
/* FUCK. Check ofs lies within current object? */
auto
&
link
=
*
current
->
links
.
push
();
auto
&
link
=
*
current
.
tail
().
links
.
push
();
link
.
is_wide
=
sizeof
(
T
)
==
4
;
link
.
is_wide
=
sizeof
(
T
)
==
4
;
link
.
position
=
(
const
char
*
)
&
ofs
-
(
const
char
*
)
base
;
link
.
position
=
(
const
char
*
)
&
ofs
-
(
const
char
*
)
base
;
link
.
bias
=
(
const
char
*
)
base
-
current
.
tail
().
head
;
link
.
bias
=
(
const
char
*
)
base
-
current
->
head
;
link
.
objidx
=
objidx
;
link
.
objidx
=
objidx
;
}
}
void
link
()
void
resolve_links
()
{
{
assert
(
!
current
.
length
);
assert
(
!
current
);
for
(
auto
obj_it
=
packed
.
iter
(
);
obj_it
;
++
obj_it
)
for
(
auto
obj_it
=
++
hb_iter
(
packed
);
obj_it
;
++
obj_it
)
{
{
const
object_t
&
parent
=
*
obj_it
;
const
object_t
&
parent
=
*
*
obj_it
;
for
(
auto
link_it
=
parent
.
links
.
iter
();
link_it
;
++
link_it
)
for
(
auto
link_it
=
parent
.
links
.
iter
();
link_it
;
++
link_it
)
{
{
const
object_t
::
link_t
&
link
=
*
link_it
;
const
object_t
::
link_t
&
link
=
*
link_it
;
const
object_t
&
child
=
packed
[
link
.
objidx
];
const
object_t
&
child
=
*
packed
[
link
.
objidx
];
unsigned
offset
=
(
child
.
head
-
parent
.
head
)
-
link
.
bias
;
unsigned
offset
=
(
child
.
head
-
parent
.
head
)
-
link
.
bias
;
if
(
link
.
is_wide
)
if
(
link
.
is_wide
)
...
@@ -277,7 +307,7 @@ struct hb_serialize_context_t
...
@@ -277,7 +307,7 @@ struct hb_serialize_context_t
}
}
}
}
unsigned
int
length
()
const
{
return
this
->
head
-
current
.
tail
().
head
;
}
unsigned
int
length
()
const
{
return
this
->
head
-
current
->
head
;
}
void
align
(
unsigned
int
alignment
)
void
align
(
unsigned
int
alignment
)
{
{
...
@@ -380,11 +410,14 @@ struct hb_serialize_context_t
...
@@ -380,11 +410,14 @@ struct hb_serialize_context_t
private:
private:
/* Object memory pool. */
hb_pool_t
<
object_t
>
object_pool
;
/* Stack of currently under construction objects. */
/* Stack of currently under construction objects. */
hb_vector_t
<
object_t
>
current
;
object_t
*
current
;
/* Stack of packed objects. Object 0 is always nil object. */
/* Stack of packed objects. Object 0 is always nil object. */
hb_vector_t
<
object_t
>
packed
;
hb_vector_t
<
object_t
*
>
packed
;
/* Map view of packed objects. */
/* Map view of packed objects. */
hb_hashmap_t
<
const
object_t
*
,
objidx_t
,
nullptr
,
0
>
packed_map
;
hb_hashmap_t
<
const
object_t
*
,
objidx_t
,
nullptr
,
0
>
packed_map
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录