Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1311122
  • 博文数量: 124
  • 博客积分: 4078
  • 博客等级: 中校
  • 技术积分: 3936
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-21 11:28
个人简介

新博客:http://sparkandshine.net/

文章分类

全部博文(124)

分类: 嵌入式

2011-12-14 16:39:43

摘要:

    本文深入源码讲述了Coffee文件系统关闭文件cfs_close函数。


    当文件不使用时,需要关闭,这样可以释放文件占有的内部资源(如fd),腾出缓存可他用(possibly commit any cached data to permanent storage)[1],源代码如下:

  1. void cfs_close(int fd)
  2. {
  3.   if (FD_VALID(fd))
  4.   {
  5.     coffee_fd_set[fd].flags = COFFEE_FD_FREE;
  6.     coffee_fd_set[fd].file->references--;
  7.     coffee_fd_set[fd].file = NULL;
  8.   }
  9. }

  10. #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宏定义如下:

  1. #define FILE_UNREFERENCED(file) ((file)->references == 0)

    另,我觉得这个函数设计不够合理。cfs_close应该要有返回值(fd失效返回-1,执行成功返回0),增强程序的健壮性。


更多Contiki学习笔记可通过博文《Contiki学习笔记:目录》索引访问。


参考资料:

[1]

阅读(1817) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~