Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
bingbingbingbing
mono
提交
a686c258
M
mono
项目概览
bingbingbingbing
/
mono
与 Fork 源项目一致
从无法访问的项目Fork
通知
35
Star
0
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
mono
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
a686c258
编写于
10月 08, 2020
作者:
J
Jonathan Chambers
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add support for guard pages before and after allocations.
上级
ee93ab68
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
51 addition
and
1 deletion
+51
-1
mono/metadata/null-gc.c
mono/metadata/null-gc.c
+51
-1
未找到文件。
mono/metadata/null-gc.c
浏览文件 @
a686c258
...
...
@@ -104,8 +104,11 @@ static void gc_free_mempool (GCMemPool* mp)
int
res
=
VirtualFree
(
chunk
->
start_of_memory
,
chunk
->
length
,
MEM_DECOMMIT
);
g_assert
(
res
);
GCMemChunk
*
prev
=
chunk
;
chunk
=
chunk
->
next
;
g_free
(
prev
);
}
g_free
(
mp
);
}
void
...
...
@@ -300,9 +303,14 @@ mono_gc_free_fixed (void* addr)
g_assert
(
res
);
}
/* only one can be enabled at a time */
#define GUARD_PRELUDE 0
#define GUARD_POSTLUDE 0
static
void
*
gc_mempool_alloc
(
MonoDomain
*
domain
,
size_t
size
)
{
void
*
ret
=
NULL
;
mono_os_mutex_lock
(
&
nullgc_mutex
);
GCMemPool
*
mp
=
domain
->
gc_mp
;
if
(
!
mp
)
...
...
@@ -311,6 +319,47 @@ gc_mempool_alloc (MonoDomain* domain, size_t size)
// keep 16 byte alignment
size
=
ALIGN_TO
(
size
,
16
);
#if GUARD_PRELUDE
GCMemChunk
*
chunk
=
g_new0
(
GCMemChunk
,
1
);;
size_t
chunk_size
=
MAX
((
mp
->
page_size
),
ALIGN_TO
(
size
,
mp
->
page_size
));
chunk_size
+=
mp
->
page_size
;
chunk
->
start_of_memory
=
chunk
->
current_memory
=
(
char
*
)
VirtualAlloc
(
0
,
chunk_size
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_READWRITE
);
chunk
->
current_memory
+=
mp
->
page_size
;
DWORD
old
;
BOOL
res
=
VirtualProtect
(
chunk
->
start_of_memory
,
mp
->
page_size
,
PAGE_NOACCESS
,
&
old
);
g_assert
(
res
);
ret
=
chunk
->
current_memory
;
chunk
->
length
=
chunk_size
;
chunk
->
next
=
mp
->
chunks
;
mp
->
chunks
=
chunk
;
#elif GUARD_POSTLUDE
GCMemChunk
*
chunk
=
g_new0
(
GCMemChunk
,
1
);
size_t
chunk_size
=
MAX
((
mp
->
page_size
),
ALIGN_TO
(
size
,
mp
->
page_size
));
chunk_size
+=
mp
->
page_size
;
chunk
->
start_of_memory
=
chunk
->
current_memory
=
(
char
*
)
VirtualAlloc
(
0
,
chunk_size
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_READWRITE
);
/* offset to abut last page */
chunk
->
current_memory
+=
(
chunk_size
-
mp
->
page_size
-
size
);
DWORD
old
;
BOOL
res
=
VirtualProtect
(
chunk
->
start_of_memory
+
chunk_size
-
mp
->
page_size
,
mp
->
page_size
,
PAGE_NOACCESS
,
&
old
);
g_assert
(
res
);
ret
=
chunk
->
current_memory
;
chunk
->
length
=
chunk_size
;
chunk
->
next
=
mp
->
chunks
;
mp
->
chunks
=
chunk
;
#else
GCMemChunk
*
chunk
=
mp
->
chunks
;
if
(
!
chunk
||
((
chunk
->
current_memory
+
size
)
>
(
chunk
->
start_of_memory
+
chunk
->
length
)))
{
...
...
@@ -323,10 +372,11 @@ gc_mempool_alloc (MonoDomain* domain, size_t size)
mp
->
chunks
=
chunk
;
}
void
*
ret
=
chunk
->
current_memory
;
ret
=
chunk
->
current_memory
;
chunk
->
current_memory
+=
size
;
g_assert
(
chunk
->
current_memory
<=
(
chunk
->
start_of_memory
+
chunk
->
length
));
#endif
mono_os_mutex_unlock
(
&
nullgc_mutex
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录