Changeset 592:9a867553c136

Show
Ignore:
Timestamp:
06/08/08 05:28:19 (7 months ago)
Author:
Edward Nys <fleurda@…>
Children:
593:27aeec049e81, 605:00f5bffa54dd
Branch:
default
Message:

added nx_fs_defrag_best_overall functionality

Location:
nxos
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • nxos/base/lib/fs/fs.c

    r590 r592  
    1414#include "base/assert.h" 
    1515#include "base/util.h" 
     16#include "base/display.h" 
    1617#include "base/drivers/_efc.h" 
    1718 
     
    732733} 
    733734 
     735static fs_err_t nx_fs_find_next_hole(U32 start, U32 *origin) { 
     736  U32 i; 
     737 
     738    i = start; 
     739    while (i < FS_PAGE_END) { 
     740      if (nx_fs_page_has_magic(i)) { 
     741        volatile U32 *metadata = &(FLASH_BASE_PTR[i*EFC_PAGE_WORDS]); 
     742        i += nx_fs_get_file_page_count(nx_fs_get_file_size_from_metadata(metadata)); 
     743      } else { 
     744        *origin = i; 
     745        return FS_ERR_NO_ERROR; 
     746      } 
     747  } 
     748  return FS_ERR_FILE_NOT_FOUND; 
     749} 
     750 
    734751/* Defrag functions. */ 
    735752 
     
    758775 
    759776fs_err_t nx_fs_defrag_best_overall(void) { 
    760   return FS_ERR_NO_ERROR; 
    761 } 
    762  
     777  U32 hole_start = 0, next_hole=0, freeblock_size=0, next_origin=0; 
     778  U32 files, used, free_pages, wasted; 
     779  U32 mean_space_per_file = 0; 
     780  U32 size = 0; 
     781  U32 current_location = FS_PAGE_START; 
     782  /* Get the number of files and freepages. */ 
     783  nx_fs_get_occupation(&files, &used, &free_pages, &wasted); 
     784  /* Nothing to do here, move on */ 
     785  if (files==0){ 
     786    return FS_ERR_NO_ERROR; 
     787  } 
     788 
     789  mean_space_per_file = free_pages / files; 
     790  if (mean_space_per_file < 1) { 
     791    /*Fallback to simple defrag*/ 
     792    nx_fs_defrag_simple(); 
     793  } else { 
     794    while (current_location < FS_PAGE_END) { 
     795      if (nx_fs_page_has_magic(current_location)) { 
     796        /* calculate free space after file */ 
     797        volatile U32 *metadata = &(FLASH_BASE_PTR[current_location*EFC_PAGE_WORDS]); 
     798        hole_start = current_location + nx_fs_get_file_page_count(nx_fs_get_file_size_from_metadata(metadata)); 
     799        nx_fs_find_next_origin(hole_start, &next_origin); 
     800        freeblock_size = next_origin - hole_start; 
     801 
     802        /* frag operations*/ 
     803        if (freeblock_size > mean_space_per_file) { 
     804          size = nx_fs_get_file_size_from_metadata(metadata); 
     805          nx_fs_move_region(current_location , hole_start + mean_space_per_file, nx_fs_get_file_page_count(size)); 
     806        } else if (freeblock_size < mean_space_per_file) { 
     807          nx_fs_find_next_hole(next_origin, & next_hole); 
     808          /* TODO: fix overlapping on move */ 
     809          nx_fs_move_region(next_origin, hole_start + mean_space_per_file, next_hole -1); 
     810        } 
     811      } 
     812    } 
     813  } 
     814  return FS_ERR_NO_ERROR; 
     815} 
     816 
  • nxos/systems/tag-route/main.c

    r591 r592  
    8989  nx_fs_defrag_best_overall(); 
    9090  nx_display_string("Done.\n"); 
     91 
     92        while (nx_avr_get_button() != BUTTON_CANCEL); 
    9193} 
    9294 
     
    127129  menu.active_mark = GUI_DEFAULT_TEXT_MARK; 
    128130 
    129   while ((res = nx_gui_text_menu(menu)) != 3) { 
     131  while ((res = nx_gui_text_menu(menu)) != 4) { 
    130132    switch (res) { 
    131133      case 0: