void mmc_cleanup( struct timeval* nowP ) { time_t now; Map** mm; Map* m; /* Get current time, if necessary. */ if ( nowP != (struct timeval*) 0 ) now = nowP->tv_sec; else now = time( (time_t*) 0 ); /* Really unmap any unreferenced entries older than the limit. */ for ( mm = &maps; *mm != (Map*) 0; ) { m = *mm; if ( m->refcount == 0 && now - m->reftime >= EXPIRE_AGE ) really_unmap( mm ); else mm = &(*mm)->next; } /* Really free excess blocks on the free list. */ while ( free_count > DESIRED_FREE_COUNT ) { m = free_maps; free_maps = m->next; --free_count; free( (void*) m ); } }
void mmc_destroy( void ) { Map* m; while ( maps != (Map*) 0 ) really_unmap( &maps ); while ( free_maps != (Map*) 0 ) { m = free_maps; free_maps = m->next; --free_count; free( (void*) m ); } }
void mmc_term( void ) { Map* m; while ( maps != (Map*) 0 ) really_unmap( &maps ); while ( free_maps != (Map*) 0 ) { m = free_maps; free_maps = m->next; --free_count; free( (void*) m ); --alloc_count; } }
static void panic( void ) { Map** mm; Map* m; syslog( LOG_ERR, "mmc panic - freeing all unreferenced maps" ); /* Really unmap all unreferenced entries. */ for ( mm = &maps; *mm != (Map*) 0; ) { m = *mm; if ( m->refcount == 0 ) really_unmap( mm ); else mm = &(*mm)->next; } }
void mmc_cleanup( struct timeval* nowP ) { time_t now; Map** mm; Map* m; /* Get the current time, if necessary. */ if ( nowP != (struct timeval*) 0 ) now = nowP->tv_sec; else now = time( (time_t*) 0 ); /* Really unmap any unreferenced entries older than the age limit. */ for ( mm = &maps; *mm != (Map*) 0; ) { m = *mm; if ( m->refcount == 0 && now - m->reftime >= expire_age ) really_unmap( mm ); else mm = &(*mm)->next; } /* Adjust the age limit if there are too many bytes mapped, or ** too many or too few files mapped. */ if ( mapped_bytes > DESIRED_MAX_MAPPED_BYTES ) expire_age = MAX( ( expire_age * 2 ) / 3, DEFAULT_EXPIRE_AGE / 10 ); else if ( map_count > DESIRED_MAX_MAPPED_FILES ) expire_age = MAX( ( expire_age * 2 ) / 3, DEFAULT_EXPIRE_AGE / 10 ); else if ( map_count < DESIRED_MAX_MAPPED_FILES / 2 ) expire_age = MIN( ( expire_age * 5 ) / 4, DEFAULT_EXPIRE_AGE * 3 ); /* Really free excess blocks on the free list. */ while ( free_count > DESIRED_FREE_COUNT ) { m = free_maps; free_maps = m->next; --free_count; free( (void*) m ); --alloc_count; } }