diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-02-23 17:57:27 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-03-13 12:24:15 +0100 |
commit | 1bdff036acddbbc63aa849741abba6581549f7b6 (patch) | |
tree | 8cc1f06ac93045d8a7c35da41fd926c2d9e840f1 /cpukit/libfs/src/imfs/imfs_initsupp.c | |
parent | IMFS: Use unprotected chain operations (diff) | |
download | rtems-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 '')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_initsupp.c | 38 |
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; + } +} |