Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
8188aa0d
Commit
8188aa0d
authored
3 years ago
by
ziyue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
非必要不调用fopen
parent
3f6f2673
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
58 行增加
和
32 行删除
+58
-32
src/Http/HttpBody.cpp
+58
-32
没有找到文件。
src/Http/HttpBody.cpp
查看文件 @
8188aa0d
...
...
@@ -58,10 +58,20 @@ Buffer::Ptr HttpStringBody::readData(size_t size) {
//////////////////////////////////////////////////////////////////
#ifdef ENABLE_MMAP
static
std
::
shared_ptr
<
char
>
getSharedMmap
(
const
string
&
file_path
,
const
std
::
shared_ptr
<
FILE
>
&
fp
,
uint64_t
max_size
)
{
static
mutex
s_mtx
;
static
unordered_map
<
string
/*file_path*/
,
std
::
pair
<
char
*/
*
ptr
*/
,
weak_ptr
<
char
>
/*mmap*/
>
>
s_shared_mmap
;
static
mutex
s_mtx
;
static
unordered_map
<
string
/*file_path*/
,
std
::
pair
<
char
*/
*
ptr
*/
,
weak_ptr
<
char
>
/*mmap*/
>
>
s_shared_mmap
;
//删除mmap记录
static
void
delSharedMmap
(
const
string
&
file_path
,
char
*
ptr
)
{
lock_guard
<
mutex
>
lck
(
s_mtx
);
auto
it
=
s_shared_mmap
.
find
(
file_path
);
if
(
it
!=
s_shared_mmap
.
end
()
&&
it
->
second
.
first
==
ptr
)
{
s_shared_mmap
.
erase
(
it
);
}
}
static
std
::
shared_ptr
<
char
>
getSharedMmap
(
const
string
&
file_path
,
int64_t
&
file_size
)
{
{
lock_guard
<
mutex
>
lck
(
s_mtx
);
auto
it
=
s_shared_mmap
.
find
(
file_path
);
...
...
@@ -74,33 +84,44 @@ static std::shared_ptr<char> getSharedMmap(const string &file_path, const std::s
}
}
//打开文件
std
::
shared_ptr
<
FILE
>
fp
(
fopen
(
file_path
.
data
(),
"rb"
),
[](
FILE
*
fp
)
{
if
(
fp
)
{
fclose
(
fp
);
}
});
if
(
!
fp
)
{
//文件不存在
file_size
=
-
1
;
return
nullptr
;
}
//获取文件大小
file_size
=
File
::
fileSize
(
fp
.
get
());
int
fd
=
fileno
(
fp
.
get
());
if
(
fd
<
0
)
{
WarnL
<<
"fileno failed:"
<<
get_uv_errmsg
(
false
);
return
nullptr
;
}
auto
ptr
=
(
char
*
)
mmap
(
NULL
,
max
_size
,
PROT_READ
,
MAP_SHARED
,
fd
,
0
);
auto
ptr
=
(
char
*
)
mmap
(
NULL
,
file
_size
,
PROT_READ
,
MAP_SHARED
,
fd
,
0
);
if
(
ptr
==
MAP_FAILED
)
{
WarnL
<<
"mmap "
<<
file_path
<<
" failed:"
<<
get_uv_errmsg
(
false
);
return
nullptr
;
}
std
::
shared_ptr
<
char
>
ret
(
ptr
,
[
max_size
,
fp
,
file_path
](
char
*
ptr
)
{
munmap
(
ptr
,
max_size
);
//删除mmap记录
lock_guard
<
mutex
>
lck
(
s_mtx
);
auto
it
=
s_shared_mmap
.
find
(
file_path
);
if
(
it
!=
s_shared_mmap
.
end
()
&&
it
->
second
.
first
==
ptr
)
{
s_shared_mmap
.
erase
(
it
);
}
std
::
shared_ptr
<
char
>
ret
(
ptr
,
[
file_size
,
fp
,
file_path
](
char
*
ptr
)
{
munmap
(
ptr
,
file_size
);
delSharedMmap
(
file_path
,
ptr
);
});
if
(
file_size
<
10
*
1024
*
1024
&&
file_path
.
rfind
(
".ts"
)
!=
string
::
npos
)
{
//如果是小ts文件,那么尝试先加载到内存
auto
buf
=
BufferRaw
::
create
();
buf
->
assign
(
ret
.
get
(),
file_size
);
ret
.
reset
(
buf
->
data
(),
[
buf
,
file_path
](
char
*
ptr
)
{
delSharedMmap
(
file_path
,
ptr
);
});
}
{
if
(
max_size
<
10
*
1024
*
1024
&&
file_path
.
rfind
(
".ts"
)
!=
string
::
npos
)
{
//如果是小ts文件,那么尝试先加载到内存
auto
buf
=
BufferRaw
::
create
();
buf
->
assign
(
ret
.
get
(),
max_size
);
ret
.
reset
(
buf
->
data
(),
[
buf
](
char
*
ptr
)
{});
}
lock_guard
<
mutex
>
lck
(
s_mtx
);
s_shared_mmap
[
file_path
]
=
std
::
make_pair
(
ret
.
get
(),
ret
);
}
...
...
@@ -109,22 +130,24 @@ static std::shared_ptr<char> getSharedMmap(const string &file_path, const std::s
#endif
HttpFileBody
::
HttpFileBody
(
const
string
&
file_path
,
bool
use_mmap
)
{
_fp
.
reset
(
fopen
(
file_path
.
data
(),
"rb"
),
[](
FILE
*
fp
)
{
if
(
fp
)
{
fclose
(
fp
);
}
});
if
(
!
_fp
)
{
//文件不存在
_read_to
=
-
1
;
return
;
}
_read_to
=
File
::
fileSize
(
_fp
.
get
());
#ifdef ENABLE_MMAP
if
(
use_mmap
&&
_read_to
)
{
_map_addr
=
getSharedMmap
(
file_path
,
_
fp
,
_
read_to
);
if
(
use_mmap
)
{
_map_addr
=
getSharedMmap
(
file_path
,
_read_to
);
}
#endif
if
(
!
_map_addr
)
{
_fp
.
reset
(
fopen
(
file_path
.
data
(),
"rb"
),
[](
FILE
*
fp
)
{
if
(
fp
)
{
fclose
(
fp
);
}
});
if
(
!
_fp
)
{
//文件不存在
_read_to
=
-
1
;
return
;
}
_read_to
=
File
::
fileSize
(
_fp
.
get
());
}
}
void
HttpFileBody
::
setRange
(
uint64_t
offset
,
uint64_t
max_size
)
{
...
...
@@ -138,6 +161,9 @@ void HttpFileBody::setRange(uint64_t offset, uint64_t max_size) {
int
HttpFileBody
::
sendFile
(
int
fd
)
{
#if defined(__linux__) || defined(__linux)
if
(
!
_fp
)
{
return
-
1
;
}
static
onceToken
s_token
([]()
{
signal
(
SIGPIPE
,
SIG_IGN
);
});
off_t
off
=
_file_offset
;
return
sendfile
(
fd
,
fileno
(
_fp
.
get
()),
&
off
,
_read_to
-
_file_offset
);
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论