summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorheyuanjie87 <[email protected]>2025-02-09 15:55:30 +0800
committerGitHub <[email protected]>2025-02-09 15:55:30 +0800
commitd3d33ff9835c6230152b8f8b6ceb30dbc93666e1 (patch)
tree12e5284e70aba66eb66246428a1f1afd1ca961a8 /components
parentd83d71cc057a32927a8156616339b776fa72af3f (diff)
[dfs]mmap的文件在关闭后释放file指针 (#9917)
* [dfs]mmap的文件在关闭后释放file指针
Diffstat (limited to 'components')
-rw-r--r--components/dfs/dfs_v2/include/dfs.h3
-rw-r--r--components/dfs/dfs_v2/src/dfs.c41
-rw-r--r--components/dfs/dfs_v2/src/dfs_file_mmap.c1
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
{