From d3d33ff9835c6230152b8f8b6ceb30dbc93666e1 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 9 Feb 2025 15:55:30 +0800 Subject: [PATCH] =?UTF-8?q?[dfs]mmap=E7=9A=84=E6=96=87=E4=BB=B6=E5=9C=A8?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E5=90=8E=E9=87=8A=E6=94=BEfile=E6=8C=87?= =?UTF-8?q?=E9=92=88=20(#9917)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [dfs]mmap的文件在关闭后释放file指针 --- components/dfs/dfs_v2/include/dfs.h | 3 ++ components/dfs/dfs_v2/src/dfs.c | 41 ++++++++++++++++------- components/dfs/dfs_v2/src/dfs_file_mmap.c | 1 + 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/components/dfs/dfs_v2/include/dfs.h b/components/dfs/dfs_v2/include/dfs.h index 8b8c80188f..582ec428ac 100644 --- a/components/dfs/dfs_v2/include/dfs.h +++ b/components/dfs/dfs_v2/include/dfs.h @@ -141,6 +141,9 @@ struct dfs_fdtable *dfs_fdtable_get_global(void); int dfs_dup(int oldfd, int startfd); #endif /* DFS_USING_POSIX */ +struct dfs_file* dfs_file_create(void); +void dfs_file_destroy(struct dfs_file *file); + #ifdef __cplusplus } #endif diff --git a/components/dfs/dfs_v2/src/dfs.c b/components/dfs/dfs_v2/src/dfs.c index 527ba89627..7e6b2c14ad 100644 --- a/components/dfs/dfs_v2/src/dfs.c +++ b/components/dfs/dfs_v2/src/dfs.c @@ -190,6 +190,33 @@ int dfs_init(void) } INIT_PREV_EXPORT(dfs_init); +struct dfs_file* dfs_file_create(void) +{ + struct dfs_file *file; + + file = (struct dfs_file *)rt_calloc(1, sizeof(struct dfs_file)); + if (file) + { + file->magic = DFS_FD_MAGIC; + file->ref_count = 1; + rt_mutex_init(&file->pos_lock, "fpos", RT_IPC_FLAG_PRIO); + } + + return file; +} + +void dfs_file_destroy(struct dfs_file *file) +{ + rt_mutex_detach(&file->pos_lock); + + if (file->mmap_context) + { + rt_free(file->mmap_context); + } + + rt_free(file); +} + /** * @ingroup Fd * This function will allocate a file descriptor. @@ -217,13 +244,10 @@ int fdt_fd_new(struct dfs_fdtable *fdt) { struct dfs_file *file; - file = (struct dfs_file *)rt_calloc(1, sizeof(struct dfs_file)); + file = dfs_file_create(); if (file) { - file->magic = DFS_FD_MAGIC; - file->ref_count = 1; - rt_mutex_init(&file->pos_lock, "fpos", RT_IPC_FLAG_PRIO); fdt->fds[idx] = file; LOG_D("allocate a new fd @ %d", idx); @@ -255,14 +279,7 @@ void fdt_fd_release(struct dfs_fdtable *fdt, int fd) if (file && file->ref_count == 1) { - rt_mutex_detach(&file->pos_lock); - - if (file->mmap_context) - { - rt_free(file->mmap_context); - } - - rt_free(file); + dfs_file_destroy(file); } else { diff --git a/components/dfs/dfs_v2/src/dfs_file_mmap.c b/components/dfs/dfs_v2/src/dfs_file_mmap.c index b976a85a27..1555ae0687 100644 --- a/components/dfs/dfs_v2/src/dfs_file_mmap.c +++ b/components/dfs/dfs_v2/src/dfs_file_mmap.c @@ -152,6 +152,7 @@ static void on_varea_close(struct rt_varea *varea) if (rt_atomic_load(&(file->ref_count)) == 1) { dfs_file_close(file); + dfs_file_destroy(file); } else {