summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/imfs/imfs_initsupp.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-02-23 17:57:27 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-03-13 12:24:15 +0100
commit1bdff036acddbbc63aa849741abba6581549f7b6 (patch)
tree8cc1f06ac93045d8a7c35da41fd926c2d9e840f1 /cpukit/libfs/src/imfs/imfs_initsupp.c
parentIMFS: Use unprotected chain operations (diff)
downloadrtems-1bdff036acddbbc63aa849741abba6581549f7b6.tar.bz2
IMFS: Reference counting for nodes
The introduction of reference counting of nodes avoids the removal of open nodes and potential usage of freed memory.
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_initsupp.c')
-rw-r--r--cpukit/libfs/src/imfs/imfs_initsupp.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_initsupp.c b/cpukit/libfs/src/imfs/imfs_initsupp.c
index 61ad6a70f2..042995b878 100644
--- a/cpukit/libfs/src/imfs/imfs_initsupp.c
+++ b/cpukit/libfs/src/imfs/imfs_initsupp.c
@@ -106,3 +106,41 @@ int IMFS_initialize_support(
return 0;
}
+
+int IMFS_node_clone( rtems_filesystem_location_info_t *loc )
+{
+ IMFS_jnode_t *node = loc->node_access;
+
+ ++node->reference_count;
+
+ return 0;
+}
+
+void IMFS_node_destroy( IMFS_jnode_t *node )
+{
+ IMFS_assert( node->reference_count == 0 );
+
+ switch ( node->type ) {
+ case IMFS_MEMORY_FILE:
+ IMFS_memfile_remove( node );
+ break;
+ case IMFS_SYM_LINK:
+ free( node->info.sym_link.name );
+ break;
+ default:
+ break;
+ }
+
+ free( node );
+}
+
+void IMFS_node_free( const rtems_filesystem_location_info_t *loc )
+{
+ IMFS_jnode_t *node = loc->node_access;
+
+ if ( node->reference_count == 1 ) {
+ IMFS_node_destroy( node );
+ } else {
+ --node->reference_count;
+ }
+}