Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
bu会水的鱼
scrcpy
提交
099cba07
S
scrcpy
项目概览
bu会水的鱼
/
scrcpy
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
scrcpy
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
099cba07
编写于
7月 04, 2021
作者:
R
Romain Vimont
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Rename queue to sc_queue
Add a scrcpy-specific prefix.
上级
af8a21ed
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
34 addition
and
34 deletion
+34
-34
app/src/recorder.c
app/src/recorder.c
+7
-7
app/src/recorder.h
app/src/recorder.h
+1
-1
app/src/util/queue.h
app/src/util/queue.h
+16
-16
app/tests/test_queue.c
app/tests/test_queue.c
+10
-10
未找到文件。
app/src/recorder.c
浏览文件 @
099cba07
...
...
@@ -57,9 +57,9 @@ record_packet_delete(struct record_packet *rec) {
static
void
recorder_queue_clear
(
struct
recorder_queue
*
queue
)
{
while
(
!
queue_is_empty
(
queue
))
{
while
(
!
sc_
queue_is_empty
(
queue
))
{
struct
record_packet
*
rec
;
queue_take
(
queue
,
next
,
&
rec
);
sc_
queue_take
(
queue
,
next
,
&
rec
);
record_packet_delete
(
rec
);
}
}
...
...
@@ -135,14 +135,14 @@ run_recorder(void *data) {
for
(;;)
{
sc_mutex_lock
(
&
recorder
->
mutex
);
while
(
!
recorder
->
stopped
&&
queue_is_empty
(
&
recorder
->
queue
))
{
while
(
!
recorder
->
stopped
&&
sc_
queue_is_empty
(
&
recorder
->
queue
))
{
sc_cond_wait
(
&
recorder
->
queue_cond
,
&
recorder
->
mutex
);
}
// if stopped is set, continue to process the remaining events (to
// finish the recording) before actually stopping
if
(
recorder
->
stopped
&&
queue_is_empty
(
&
recorder
->
queue
))
{
if
(
recorder
->
stopped
&&
sc_
queue_is_empty
(
&
recorder
->
queue
))
{
sc_mutex_unlock
(
&
recorder
->
mutex
);
struct
record_packet
*
last
=
recorder
->
previous
;
if
(
last
)
{
...
...
@@ -161,7 +161,7 @@ run_recorder(void *data) {
}
struct
record_packet
*
rec
;
queue_take
(
&
recorder
->
queue
,
next
,
&
rec
);
sc_
queue_take
(
&
recorder
->
queue
,
next
,
&
rec
);
sc_mutex_unlock
(
&
recorder
->
mutex
);
...
...
@@ -235,7 +235,7 @@ recorder_open(struct recorder *recorder, const AVCodec *input_codec) {
goto
error_mutex_destroy
;
}
queue_init
(
&
recorder
->
queue
);
sc_
queue_init
(
&
recorder
->
queue
);
recorder
->
stopped
=
false
;
recorder
->
failed
=
false
;
recorder
->
header_written
=
false
;
...
...
@@ -340,7 +340,7 @@ recorder_push(struct recorder *recorder, const AVPacket *packet) {
return
false
;
}
queue_push
(
&
recorder
->
queue
,
next
,
rec
);
sc_
queue_push
(
&
recorder
->
queue
,
next
,
rec
);
sc_cond_signal
(
&
recorder
->
queue_cond
);
sc_mutex_unlock
(
&
recorder
->
mutex
);
...
...
app/src/recorder.h
浏览文件 @
099cba07
...
...
@@ -17,7 +17,7 @@ struct record_packet {
struct
record_packet
*
next
;
};
struct
recorder_queue
QUEUE
(
struct
record_packet
);
struct
recorder_queue
SC_
QUEUE
(
struct
record_packet
);
struct
recorder
{
struct
sc_packet_sink
packet_sink
;
// packet sink trait
...
...
app/src/util/queue.h
浏览文件 @
099cba07
// generic intrusive FIFO queue
#ifndef QUEUE_H
#define QUEUE_H
#ifndef
SC_
QUEUE_H
#define
SC_
QUEUE_H
#include "common.h"
...
...
@@ -10,15 +10,15 @@
// To define a queue type of "struct foo":
// struct queue_foo QUEUE(struct foo);
#define QUEUE(TYPE) { \
#define
SC_
QUEUE(TYPE) { \
TYPE *first; \
TYPE *last; \
}
#define queue_init(PQ) \
#define
sc_
queue_init(PQ) \
(void) ((PQ)->first = (PQ)->last = NULL)
#define queue_is_empty(PQ) \
#define
sc_
queue_is_empty(PQ) \
!(PQ)->first
// NEXTFIELD is the field in the ITEM type used for intrusive linked-list
...
...
@@ -30,30 +30,30 @@
// };
//
// // define the type "struct my_queue"
// struct my_queue QUEUE(struct foo);
// struct my_queue
SC_
QUEUE(struct foo);
//
// struct my_queue queue;
// queue_init(&queue);
//
sc_
queue_init(&queue);
//
// struct foo v1 = { .value = 42 };
// struct foo v2 = { .value = 27 };
//
// queue_push(&queue, next, v1);
// queue_push(&queue, next, v2);
//
sc_
queue_push(&queue, next, v1);
//
sc_
queue_push(&queue, next, v2);
//
// struct foo *foo;
// queue_take(&queue, next, &foo);
//
sc_
queue_take(&queue, next, &foo);
// assert(foo->value == 42);
// queue_take(&queue, next, &foo);
//
sc_
queue_take(&queue, next, &foo);
// assert(foo->value == 27);
// assert(queue_is_empty(&queue));
// assert(
sc_
queue_is_empty(&queue));
//
// push a new item into the queue
#define queue_push(PQ, NEXTFIELD, ITEM) \
#define
sc_
queue_push(PQ, NEXTFIELD, ITEM) \
(void) ({ \
(ITEM)->NEXTFIELD = NULL; \
if (queue_is_empty(PQ)) { \
if (
sc_
queue_is_empty(PQ)) { \
(PQ)->first = (PQ)->last = (ITEM); \
} else { \
(PQ)->last->NEXTFIELD = (ITEM); \
...
...
@@ -65,9 +65,9 @@
// the result is stored in *(PITEM)
// (without typeof(), we could not store a local variable having the correct
// type so that we can "return" it)
#define queue_take(PQ, NEXTFIELD, PITEM) \
#define
sc_
queue_take(PQ, NEXTFIELD, PITEM) \
(void) ({ \
assert(!queue_is_empty(PQ)); \
assert(!
sc_
queue_is_empty(PQ)); \
*(PITEM) = (PQ)->first; \
(PQ)->first = (PQ)->first->NEXTFIELD; \
})
...
...
app/tests/test_queue.c
浏览文件 @
099cba07
...
...
@@ -10,28 +10,28 @@ struct foo {
};
static
void
test_queue
(
void
)
{
struct
my_queue
QUEUE
(
struct
foo
)
queue
;
queue_init
(
&
queue
);
struct
my_queue
SC_
QUEUE
(
struct
foo
)
queue
;
sc_
queue_init
(
&
queue
);
assert
(
queue_is_empty
(
&
queue
));
assert
(
sc_
queue_is_empty
(
&
queue
));
struct
foo
v1
=
{
.
value
=
42
};
struct
foo
v2
=
{
.
value
=
27
};
queue_push
(
&
queue
,
next
,
&
v1
);
queue_push
(
&
queue
,
next
,
&
v2
);
sc_
queue_push
(
&
queue
,
next
,
&
v1
);
sc_
queue_push
(
&
queue
,
next
,
&
v2
);
struct
foo
*
foo
;
assert
(
!
queue_is_empty
(
&
queue
));
queue_take
(
&
queue
,
next
,
&
foo
);
assert
(
!
sc_
queue_is_empty
(
&
queue
));
sc_
queue_take
(
&
queue
,
next
,
&
foo
);
assert
(
foo
->
value
==
42
);
assert
(
!
queue_is_empty
(
&
queue
));
queue_take
(
&
queue
,
next
,
&
foo
);
assert
(
!
sc_
queue_is_empty
(
&
queue
));
sc_
queue_take
(
&
queue
,
next
,
&
foo
);
assert
(
foo
->
value
==
27
);
assert
(
queue_is_empty
(
&
queue
));
assert
(
sc_
queue_is_empty
(
&
queue
));
}
int
main
(
int
argc
,
char
*
argv
[])
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录