void pfs_channel_free( pfs_size_t start ) { struct entry *e = head; do { if(e->start==start) { e->inuse=0; if( (e->prev->start < e->start) && !e->prev->inuse) { struct entry *f = e->prev; f->length += e->length; entry_delete(e); e = f; } if( (e->next->start>e->start) && !e->next->inuse) { struct entry *f = e->next; f->start = e->start; f->length += e->length; entry_delete(e); e = f; } return; } e = e->next; } while(e!=head); }
//deletes entry from current state and snapshots entry* purge(char key[MAX_KEY], entry *entryHead, snapshot *snapHead) { //remove entry from current state entry *unwantedEntry = get_entry(entryHead, key); if (unwantedEntry != NULL) { entryHead = entry_delete(entryHead, unwantedEntry); } //remove entry from each snapshot snapshot *currentSnap = snapHead; while (currentSnap != NULL) { unwantedEntry = get_entry(currentSnap->entries, key); if (unwantedEntry != NULL) { currentSnap->entries = entry_delete(currentSnap->entries, unwantedEntry); } currentSnap = currentSnap->next; } printf("ok\n"); return entryHead; }
//deletes an entry from the list which stores the given key entry* del(entry *entryHead, char key[MAX_KEY]) { entry *unwantedEntry = get_entry(entryHead, key); if (unwantedEntry == NULL) { printf("no such key\n"); return entryHead; } else { printf("ok\n"); return entry_delete(entryHead, unwantedEntry); } }