IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 28958


Ignore:
Timestamp:
Aug 18, 2010, 7:38:20 PM (16 years ago)
Author:
bills
Message:

Cache the images table in memory to save on I/O

Location:
trunk/Ohana/src/opihi
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/dvo/ImageSelection.c

    r28955 r28958  
    3838/* free loaded images */
    3939void FreeImageSelection () {
    40   if (image != NULL) free (image);
     40  if (image != NULL) FreeImages(image);
    4141  if (subset != NULL) free (subset);
    4242  image = NULL;
  • trunk/Ohana/src/opihi/dvo/LoadImages.c

    r27435 r28958  
    11# include "dvoshell.h"
     2
     3// XXX: Maybe make this a command line option
     4int dvoUseImageCache = 1;
     5
     6static char *lastFilename = NULL;
     7static time_t lastModified = 0;
     8static Image *imageCache = NULL;
     9static off_t cacheNimage = 0;
     10
     11static time_t getLastModified(char *filename);
    212
    313Image *LoadImages (off_t *Nimage) {
     
    1222  catdir = GetCATDIR ();
    1323  sprintf (filename, "%s/Images.dat", catdir);
     24
     25  if (lastFilename) {
     26    if (dvoUseImageCache && !strcmp(lastFilename, filename)) {
     27      // Make sure the file hasn't changed since we loaded it
     28      if (getLastModified(filename) == lastModified) {
     29        *Nimage = cacheNimage;
     30        return  imageCache;
     31      }
     32    }
     33    free(lastFilename);
     34    lastFilename = NULL;
     35    free(imageCache);
     36    imageCache = NULL;
     37    cacheNimage = 0;
     38    lastModified = 0;
     39  }
     40
    1441
    1542  gfits_db_init (&db);
     
    3865
    3966  image = gfits_table_get_Image (&db.ftable, Nimage, &db.swapped);
     67  if (dvoUseImageCache && image) {
     68    cacheNimage = *Nimage;
     69    imageCache = image;
     70    lastFilename = strdup(filename);
     71    lastModified = getLastModified(filename);
     72  }
     73
    4074  return (image);
    4175}
     76
     77static time_t getLastModified(char *filename) {
     78  struct stat statbuf;
     79  if (!stat(filename, &statbuf)) {
     80    return statbuf.st_mtime;
     81  } else {
     82    return 0;
     83  }
     84}
     85
     86void FreeImages(Image *images) {
     87  if (!dvoUseImageCache && (images != NULL)) {
     88    free(images);
     89  } else {
     90    // defer free until next LoadImages with a different or modified Images.dat
     91  }
     92}
     93
  • trunk/Ohana/src/opihi/dvo/gimages.c

    r28872 r28958  
    247247  set_int_variable ("IMAGEphotcode:n", Nfound);
    248248
    249   free (image);
     249  FreeImages (image);
    250250  free (subset);
    251251
  • trunk/Ohana/src/opihi/dvo/images.c

    r27530 r28958  
    319319  free (Xvec.elements.Flt);
    320320  free (Yvec.elements.Flt);
    321   free (image);
     321  FreeImages (image);
    322322  return (TRUE);
    323323
  • trunk/Ohana/src/opihi/dvo/imdense.c

    r27435 r28958  
    7070  free (Xvec.elements.Flt);
    7171  free (Yvec.elements.Flt);
    72   free (image);
     72  FreeImages (image);
    7373  return (TRUE);
    7474
  • trunk/Ohana/src/opihi/dvo/imextract.c

    r27587 r28958  
    137137
    138138  // free (subset);
    139   free (image);
     139  FreeImages (image);
    140140
    141141  if (vec) free (vec);
  • trunk/Ohana/src/opihi/include/dvoshell.h

    r28955 r28958  
    302302int           InitPhotcodes         PROTO((void));
    303303Image        *LoadImages            PROTO((off_t *Nimage));
     304void          FreeImages            PROTO((Image *images));
    304305Image        *MatchImage            PROTO((unsigned int time, short int source, unsigned int imageID));
    305306Coords       *MatchMosaic           PROTO((unsigned int time, short int source));
Note: See TracChangeset for help on using the changeset viewer.