void fatfs_node_cache_flush(fatfs_disk_t *disk) { fatfs_node_t *node, *next_node; node = node_list_get_head(&disk->live_nlist); while (NULL != node) { next_node = node_list_get_next(node); node_list_remove(&disk->live_nlist, node); if (!node_hash_remove(&disk->node_hash, node)) CYG_ASSERT(false, "Node not in hash"); node_pool_free(disk, node); node = next_node; } node = node_list_get_head(&disk->dead_nlist); while (NULL != node) { next_node = node_list_get_next(node); node_list_remove(&disk->dead_nlist, node); if (!node_hash_remove(&disk->node_hash, node)) CYG_ASSERT(false, "Node not in hash"); node_pool_free(disk, node); node = next_node; } SANITY_CHECK(); }
int node_detach(node_t* parent, node_t* child) { if (!parent || !child) return 0; if (node_list_remove(parent->children, child) == 0) { parent->count--; } return 0; }
int node_detach(node_t* parent, node_t* child) { if (!parent || !child) return -1; int node_index = node_list_remove(parent->children, child); if (node_index >= 0) { parent->count--; } return node_index; }
void fatfs_node_touch(fatfs_disk_t *disk, fatfs_node_t *node) { CYG_CHECK_DATA_PTRC(disk); CYG_CHECK_DATA_PTRC(node); CYG_TRACE2(TNC, "node='%s' refcnt=%d", node->dentry.filename, node->refcnt); if (node->refcnt == 0) { node_list_remove(&disk->dead_nlist, node); node_list_head_add(&disk->dead_nlist, node); } else { node_list_remove(&disk->live_nlist, node); node_list_head_add(&disk->live_nlist, node); } SANITY_CHECK(); }
void node_destroy(node_t* node) { if(!node) return; if (node->children && node->children->count > 0) { node_t* ch; while ((ch = node->children->begin)) { node_list_remove(node->children, ch); node_destroy(ch); } } node_list_destroy(node->children); node->children = NULL; free(node); }
void fatfs_node_free(fatfs_disk_t *disk, fatfs_node_t *node) { CYG_CHECK_DATA_PTRC(disk); CYG_CHECK_DATA_PTRC(node); CYG_TRACE2(TNC, "node='%s' refcnt=%d", node->dentry.filename, node->refcnt); CYG_ASSERTC(node->refcnt == 0); CYG_ASSERTC(node != disk->root); // Remove from dead list, from hash and free ptr node_list_remove(&disk->dead_nlist, node); if (!node_hash_remove(&disk->node_hash, node)) CYG_ASSERT(false, "node not in hash"); node_pool_free(disk, node); SANITY_CHECK(); }
void fatfs_node_ref(fatfs_disk_t *disk, fatfs_node_t *node) { CYG_CHECK_DATA_PTRC(disk); CYG_CHECK_DATA_PTRC(node); CYG_TRACE2(TNC, "node='%s' refcnt=%d", node->dentry.filename, node->refcnt); node->refcnt++; if (1 == node->refcnt) { // First reference - move node from dead to live list CYG_TRACE1(TNC, "node='%s' to live list", node->dentry.filename); node_list_remove(&disk->dead_nlist, node); node_list_head_add(&disk->live_nlist, node); } SANITY_CHECK(); }
fatfs_node_t* fatfs_node_alloc(fatfs_disk_t *disk, fatfs_dir_entry_t *dentry) { fatfs_node_t *node; CYG_CHECK_DATA_PTRC(disk); CYG_CHECK_DATA_PTRC(dentry); node = node_pool_alloc(disk); if (NULL == node) { CYG_TRACE2(TNC, "getting node from dead list (size=%d keep=%d)", node_list_get_size(&disk->dead_nlist), DLIST_KEEP_NUM); if (node_list_get_size(&disk->dead_nlist) <= DLIST_KEEP_NUM) return NULL; node = node_list_tail_get(&disk->dead_nlist); if (NULL == node) return NULL; CYG_TRACE1(TNC, "recycling node='%s'", node->dentry.filename); node_list_remove(&disk->dead_nlist, node); if (!node_hash_remove(&disk->node_hash, node)) CYG_ASSERT(false, "node not in hash"); } // Init new node node->dentry = *dentry; node->refcnt = 0; node_list_head_add(&disk->dead_nlist, node); if (!node_hash_add(&disk->node_hash, node)) CYG_ASSERT(false, "node already in hash"); SANITY_CHECK(); return node; }
void fatfs_node_unref(fatfs_disk_t *disk, fatfs_node_t *node) { CYG_CHECK_DATA_PTRC(disk); CYG_CHECK_DATA_PTRC(node); CYG_TRACE2(TNC, "node='%s' refcnt=%d", node->dentry.filename, node->refcnt); CYG_ASSERT(node->refcnt > 0, "node->refcnt <= 0"); node->refcnt--; if (0 == node->refcnt) { // No more references - move node from live to dead list CYG_TRACE1(TNC, "node='%s' to dead list", node->dentry.filename); node_list_remove(&disk->live_nlist, node); node_list_head_add(&disk->dead_nlist, node); } SANITY_CHECK(); }