void rrdset_save_all(void) { info("Saving database..."); RRDSET *st; RRDDIM *rd; pthread_rwlock_wrlock(&rrdset_root_rwlock); for(st = rrdset_root; st ; st = st->next) { pthread_rwlock_wrlock(&st->rwlock); if(st->mapped == RRD_MEMORY_MODE_SAVE) { debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_filename); savememory(st->cache_filename, st, st->memsize); } for(rd = st->dimensions; rd ; rd = rd->next) { if(likely(rd->mapped == RRD_MEMORY_MODE_SAVE)) { debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_filename); savememory(rd->cache_filename, rd, rd->memsize); } } pthread_rwlock_unlock(&st->rwlock); } pthread_rwlock_unlock(&rrdset_root_rwlock); }
void rrdset_save_all(void) { debug(D_RRD_CALLS, "rrdset_save_all()"); // let it log a few error messages error_log_limit_reset(); RRDSET *st; RRDDIM *rd; pthread_rwlock_wrlock(&rrdset_root_rwlock); for(st = rrdset_root; st ; st = st->next) { pthread_rwlock_wrlock(&st->rwlock); if(st->mapped == RRD_MEMORY_MODE_SAVE) { debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_filename); savememory(st->cache_filename, st, st->memsize); } for(rd = st->dimensions; rd ; rd = rd->next) { if(likely(rd->mapped == RRD_MEMORY_MODE_SAVE)) { debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_filename); savememory(rd->cache_filename, rd, rd->memsize); } } pthread_rwlock_unlock(&st->rwlock); } pthread_rwlock_unlock(&rrdset_root_rwlock); }
void rrdset_free_all(void) { info("Freeing all memory..."); RRDSET *st; for(st = rrdset_root; st ;) { RRDSET *next = st->next; while(st->dimensions) rrddim_free(st, st->dimensions); rrdset_index_del(st); if(st->mapped == RRD_MEMORY_MODE_SAVE) { debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_filename); savememory(st->cache_filename, st, st->memsize); debug(D_RRD_CALLS, "Unmapping stats '%s'.", st->name); munmap(st, st->memsize); } else if(st->mapped == RRD_MEMORY_MODE_MAP) { debug(D_RRD_CALLS, "Unmapping stats '%s'.", st->name); munmap(st, st->memsize); } else free(st); st = next; } rrdset_root = NULL; info("Memory cleanup completed..."); }
void rrddim_free(RRDSET *st, RRDDIM *rd) { debug(D_RRD_CALLS, "rrddim_free() %s.%s", st->name, rd->name); RRDDIM *i, *last = NULL; for(i = st->dimensions; i && i != rd ; i = i->next) last = i; if(!i) { error("Request to free dimension %s.%s but it is not linked.", st->id, rd->name); return; } if(last) last->next = rd->next; else st->dimensions = rd->next; rd->next = NULL; rrddim_index_del(st, rd); // free(rd->annotations); if(rd->mapped == RRD_MEMORY_MODE_SAVE) { debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_filename); savememory(rd->cache_filename, rd, rd->memsize); debug(D_RRD_CALLS, "Unmapping dimension '%s'.", rd->name); munmap(rd, rd->memsize); } else if(rd->mapped == RRD_MEMORY_MODE_MAP) { debug(D_RRD_CALLS, "Unmapping dimension '%s'.", rd->name); munmap(rd, rd->memsize); } else { debug(D_RRD_CALLS, "Removing dimension '%s'.", rd->name); free(rd); } }
int main (void) { intro (); loadmemory (); do playgame (); while (playagain ()); if (memory[0] > 1) savememory (); printf ("\nPress ENTER to continue..."); getchar (); return 0; }