static inline Context* mark_new_context_as_most_recently_used( Context* context ) { node_Add( &trie->least_recently_used, &context->least_recently_used ); ++ trie->lru_context_count; /* Maybe recycle least recently used context: */ if (trie->lru_context_count >= trie->max_lru_contexts) { Node* list = (Node*)&trie->least_recently_used; Node* node = list->prev; Context* to_die = (Context*)( (u32)node - (u32)(&((Context*)0)->least_recently_used) ); assert( node != list ); /* Only kill leafs, because that avoids */ /* the problem of leaving dangling */ /* 'parent' pointers: */ while (to_die->kids > 0) { node = node->prev; assert( node != list ); to_die = (Context*)( (u08*)node - (u08*)(&((Context*)0)->least_recently_used) ); } assert( to_die->order >= 2); assert( to_die->parent->order == (to_die->order - 1) ); node_Cut( node ); context_delete( to_die ); } return context; }
/*---------------------------------------------------------------------- Offer to delete old sent-mail folders Args: sml -- The list of sent-mail folders fcc_cntxt -- context to delete list of folders in type -- label indicating type of folders being deleted ----*/ void delete_old_mail(struct sm_folder *sml, CONTEXT_S *fcc_cntxt, char *type) { char prompt[150]; struct sm_folder *sm; for(sm = sml; sm != NULL && sm->name != NULL; sm++){ if(sm->name[0] == '\0') /* can't happen */ continue; snprintf(prompt, sizeof(prompt), "To save disk space, delete old%.10s mail folder \"%.30s\" ", type, sm->name); if(want_to(prompt, 'n', 0, h_wt_delete_old, WT_FLUSH_IN) == 'y'){ if(!context_delete(fcc_cntxt, NULL, sm->name)){ q_status_message1(SM_ORDER, 3, 3, "Error deleting \"%s\".", sm->name); dprint((1, "Error context_deleting %s in %s\n", sm->name, (fcc_cntxt && fcc_cntxt->context) ? fcc_cntxt->context : "<null>")); } else{ int index; if((index = folder_index(sm->name, fcc_cntxt, FI_FOLDER)) >= 0) folder_delete(index, FOLDERS(fcc_cntxt)); } }else{ /* break;*/ /* skip out of the whole thing when he says no */ /* Decided to keep asking anyway */ } } }