Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
c80483d5
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c80483d5
编写于
7月 19, 2010
作者:
M
Michael Bebenita
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixed circular buffer resizing bug.
上级
00d1465d
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
79 addition
and
20 deletion
+79
-20
src/Makefile
src/Makefile
+0
-1
src/rt/circular_buffer.cpp
src/rt/circular_buffer.cpp
+20
-16
src/rt/circular_buffer.h
src/rt/circular_buffer.h
+10
-1
src/test/run-pass/task-comm-4.rs
src/test/run-pass/task-comm-4.rs
+24
-2
src/test/run-pass/task-comm-5.rs
src/test/run-pass/task-comm-5.rs
+25
-0
未找到文件。
src/Makefile
浏览文件 @
c80483d5
...
...
@@ -374,7 +374,6 @@ TEST_XFAILS_X86 := $(MUT_BOX_XFAILS) \
test
/run-pass/vec-alloc-append.rs
\
test
/run-pass/vec-slice.rs
\
test
/run-pass/task-comm-3.rs
\
test
/run-pass/task-comm-4.rs
\
test
/compile-fail/bad-recv.rs
\
test
/compile-fail/bad-send.rs
\
test
/compile-fail/infinite-tag-type-recursion.rs
\
...
...
src/rt/circular_buffer.cpp
浏览文件 @
c80483d5
...
...
@@ -7,7 +7,7 @@
circular_buffer
::
circular_buffer
(
rust_dom
*
dom
,
size_t
unit_sz
)
:
dom
(
dom
),
_buffer_sz
(
INITIAL_CIRCULAR_BUFFFER_SIZE_IN_UNITS
*
unit_sz
),
unit_sz
(
unit_sz
),
_
unit_sz
(
unit_sz
),
_next
(
0
),
_unread
(
0
),
_buffer
((
uint8_t
*
)
dom
->
calloc
(
_buffer_sz
))
{
...
...
@@ -27,7 +27,7 @@ circular_buffer::~circular_buffer() {
"~circular_buffer 0x%"
PRIxPTR
,
this
);
I
(
dom
,
_buffer
);
// I(dom, unread == 0);
// I(dom,
_
unread == 0);
dom
->
free
(
_buffer
);
}
...
...
@@ -38,8 +38,8 @@ void
circular_buffer
::
transfer
(
void
*
dst
)
{
I
(
dom
,
dst
);
uint8_t
*
ptr
=
(
uint8_t
*
)
dst
;
for
(
size_t
i
=
0
;
i
<
_unread
;
i
+=
unit_sz
)
{
memcpy
(
&
ptr
[
i
],
&
_buffer
[
_next
+
i
%
_buffer_sz
],
unit_sz
);
for
(
size_t
i
=
0
;
i
<
_unread
;
i
+=
_
unit_sz
)
{
memcpy
(
&
ptr
[
i
],
&
_buffer
[
(
_next
+
i
)
%
_buffer_sz
],
_
unit_sz
);
}
}
...
...
@@ -65,15 +65,15 @@ circular_buffer::enqueue(void *src) {
dom
->
log
(
rust_log
::
MEM
|
rust_log
::
COMM
,
"circular_buffer enqueue "
"unread: %d, buffer_sz: %d, unit_sz: %d"
,
_unread
,
_buffer_sz
,
unit_sz
);
_unread
,
_buffer_sz
,
_
unit_sz
);
I
(
dom
,
_unread
<
_buffer_sz
);
I
(
dom
,
_unread
+
unit_sz
<=
_buffer_sz
);
I
(
dom
,
_unread
+
_
unit_sz
<=
_buffer_sz
);
// Copy data
size_t
i
=
(
_next
+
_unread
)
%
_buffer_sz
;
memcpy
(
&
_buffer
[
i
],
src
,
unit_sz
);
_unread
+=
unit_sz
;
memcpy
(
&
_buffer
[
i
],
src
,
_
unit_sz
);
_unread
+=
_
unit_sz
;
dom
->
log
(
rust_log
::
MEM
|
rust_log
::
COMM
,
"circular_buffer pushed data at index: %d"
,
i
);
...
...
@@ -86,30 +86,34 @@ circular_buffer::enqueue(void *src) {
void
circular_buffer
::
dequeue
(
void
*
dst
)
{
I
(
dom
,
dst
);
I
(
dom
,
unit_sz
>
0
);
I
(
dom
,
_unread
>=
unit_sz
);
I
(
dom
,
_
unit_sz
>
0
);
I
(
dom
,
_unread
>=
_
unit_sz
);
I
(
dom
,
_unread
<=
_buffer_sz
);
I
(
dom
,
_buffer
);
size_t
i
=
_next
;
memcpy
(
dst
,
&
_buffer
[
i
],
unit_sz
);
memcpy
(
dst
,
&
_buffer
[
_next
],
_
unit_sz
);
dom
->
log
(
rust_log
::
MEM
|
rust_log
::
COMM
,
"shifted data from index %d"
,
i
);
_unread
-=
unit_sz
;
_next
+=
unit_sz
;
"shifted data from index %d"
,
_next
);
_unread
-=
_
unit_sz
;
_next
+=
_
unit_sz
;
I
(
dom
,
_next
<=
_buffer_sz
);
if
(
_next
==
_buffer_sz
)
{
_next
=
0
;
}
// Shrink if possible.
if
(
_buffer_sz
>=
INITIAL_CIRCULAR_BUFFFER_SIZE_IN_UNITS
*
unit_sz
&&
if
(
_buffer_sz
>=
INITIAL_CIRCULAR_BUFFFER_SIZE_IN_UNITS
*
_
unit_sz
&&
_unread
<=
_buffer_sz
/
4
)
{
dom
->
log
(
rust_log
::
MEM
|
rust_log
::
COMM
,
"circular_buffer is shrinking to %d bytes"
,
_buffer_sz
/
2
);
void
*
tmp
=
dom
->
malloc
(
_buffer_sz
/
2
);
transfer
(
tmp
);
_buffer_sz
>>=
1
;
dom
->
free
(
_buffer
);
_buffer
=
(
uint8_t
*
)
tmp
;
_next
=
0
;
}
}
bool
...
...
src/rt/circular_buffer.h
浏览文件 @
c80483d5
...
...
@@ -20,10 +20,19 @@ public:
bool
is_empty
();
private:
// Size of the buffer in bytes.
size_t
_buffer_sz
;
size_t
unit_sz
;
// Size of the data unit in bytes.
size_t
_unit_sz
;
// Byte offset within the buffer where to read the next unit of data.
size_t
_next
;
// Number of bytes that have not been read from the buffer.
size_t
_unread
;
// The buffer itself.
uint8_t
*
_buffer
;
};
...
...
src/test/run-pass/task-comm-4.rs
浏览文件 @
c80483d5
...
...
@@ -3,8 +3,30 @@
}
io
fn
test00
()
{
let
int
r
=
0
;
let
int
sum
=
0
;
let
port
[
int
]
p
=
port
();
let
chan
[
int
]
c
=
chan
(
p
);
c
<
|
42
;
let
int
r
<-
p
;
c
<
|
1
;
c
<
|
2
;
c
<
|
3
;
c
<
|
4
;
r
<-
p
;
sum
+=
r
;
log
(
r
);
r
<-
p
;
sum
+=
r
;
log
(
r
);
r
<-
p
;
sum
+=
r
;
log
(
r
);
r
<-
p
;
sum
+=
r
;
log
(
r
);
c
<
|
5
;
c
<
|
6
;
c
<
|
7
;
c
<
|
8
;
r
<-
p
;
sum
+=
r
;
log
(
r
);
r
<-
p
;
sum
+=
r
;
log
(
r
);
r
<-
p
;
sum
+=
r
;
log
(
r
);
r
<-
p
;
sum
+=
r
;
log
(
r
);
check
(
sum
==
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
);
}
\ No newline at end of file
src/test/run-pass/task-comm-5.rs
0 → 100644
浏览文件 @
c80483d5
io
fn
main
()
->
()
{
test00
();
}
io
fn
test00
()
{
let
int
r
=
0
;
let
int
sum
=
0
;
let
port
[
int
]
p
=
port
();
let
chan
[
int
]
c
=
chan
(
p
);
let
int
number_of_messages
=
1000
;
let
int
i
=
0
;
while
(
i
<
number_of_messages
)
{
c
<
|
i
;
i
+=
1
;
}
i
=
0
;
while
(
i
<
number_of_messages
)
{
r
<-
p
;
sum
+=
r
;
i
+=
1
;
}
check
(
sum
==
((
number_of_messages
*
(
number_of_messages
-
1
))
/
2
));
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录