diff options
| author | heyuanjie87 <[email protected]> | 2025-02-09 15:55:30 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-02-09 15:55:30 +0800 |
| commit | d3d33ff9835c6230152b8f8b6ceb30dbc93666e1 (patch) | |
| tree | 12e5284e70aba66eb66246428a1f1afd1ca961a8 /components | |
| parent | d83d71cc057a32927a8156616339b776fa72af3f (diff) | |
[dfs]mmap的文件在关闭后释放file指针 (#9917)
* [dfs]mmap的文件在关闭后释放file指针
Diffstat (limited to 'components')
| -rw-r--r-- | components/dfs/dfs_v2/include/dfs.h | 3 | ||||
| -rw-r--r-- | components/dfs/dfs_v2/src/dfs.c | 41 | ||||
| -rw-r--r-- | 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 { |
