本文深入源码讲述了Coffee文件系统关闭文件cfs_close
函数。
当文件不使用时,需要关闭,这样可以释放文件占有的内部资源(如fd
),腾出缓存可他用(possibly commit any cached data to permanent storage)[1],源代码如下:
void cfs_close(int fd)
{
if (FD_VALID(fd))
{
coffee_fd_set[fd].flags = COFFEE_FD_FREE;
coffee_fd_set[fd].file->references--;
coffee_fd_set[fd].file = NULL;
}
}
#define FD_VALID(fd) ((fd)>= 0 && (fd)<COFFEE_FD_SET_SIZE && coffee_fd_set[(fd)].flags!=COFFEE_FD_FREE)
首先进行fd
参数验证,确保fd
有效。如果fd
不在[0, COFFEE_FD_SET_SIZE)
范围内,说明传递的fd
参数无效,如果该fd
对应的file_desc
的flags
是COFFEE_FD_FREE
,则说明该fd
本来就是空闲的,无需再释放。如果fd
有效,则将其对应的file_desc
的flags
设为COFFEE_FD_FREE
,以便下次cfs_open
函数可以找到可用的fd,而后将与该file_desc
关联文件file
的引用次数减1
,最后将file_desc
指向的file
设为空。
用宏FILE_UNREFERENCED
可以判断文件引用次数是否为0
,这个宏在load_file
函数被调用,FILE_UNREFERENCED
宏定义如下:
#define FILE_UNREFERENCED(file) ((file)->references == 0)
另,我觉得这个函数设计不够合理。cfs_close
应该要有返回值(fd
失效返回-1
,执行成功返回0
),增强程序的健壮性。
参考资料:
[1]