static void sweep_nodes(struct node *n) { struct gfarm_hash_iterator i; struct gfarm_hash_entry *child; /* assert((n->flags & NODE_FLAG_IS_DIR) != 0); */ /* * We don't have to honor the PURGED flag here, * because the mark phase overrides the flag. */ for (gfarm_hash_iterator_begin(n->u.d.children, &i); (child = gfarm_hash_iterator_access(&i)) != NULL; gfarm_hash_iterator_next(&i)) { struct node *c = gfarm_hash_entry_data(child); if ((c->flags & NODE_FLAG_MARKED) == 0) { if (opendir_count > 0) { recursive_delayed_purge_nodes(c); } else { recursive_free_nodes(c); gfarm_hash_iterator_purge(&i); } } else { if ((c->flags & NODE_FLAG_IS_DIR) != 0) sweep_nodes(c); else if (opendir_count == 0 && c->u.d.children != NULL) recursive_free_children(c); c->flags &= ~NODE_FLAG_MARKED; } } }
void gfp_conn_hash_iterator_purge(struct gfarm_hash_iterator *iterator) { void *key = gfarm_hash_entry_key(gfarm_hash_iterator_access(iterator)); struct gfp_conn_hash_id *idp = key; struct gfp_conn_hash_id id = *idp; gfarm_hash_iterator_purge(iterator); free(id.hostname); free(id.username); }
gfarm_error_t gfs_stat_cache_purge(const char *path) { struct gfarm_hash_iterator it; struct gfarm_hash_entry *entry; struct stat_cache_data *data; if (stat_cache == NULL) /* there is nothing to purge */ return (GFARM_ERR_NO_ERROR); gfs_stat_cache_expire(); if (!gfarm_hash_iterator_lookup(stat_cache, path, strlen(path)+1, &it)) return (GFARM_ERR_NO_SUCH_FILE_OR_DIRECTORY); entry = gfarm_hash_iterator_access(&it); assert(entry != NULL); data = gfarm_hash_entry_data(entry); data->prev->next = data->next; data->next->prev = data->prev; gfs_stat_free(&data->st); gfarm_hash_iterator_purge(&it); --stat_cache_count; return (GFARM_ERR_NO_ERROR); }