Changeset 196 for trunk/src


Ignore:
Timestamp:
Nov 20, 2008, 9:39:06 PM (16 years ago)
Author:
katerina
Message:

New option SetDropCache ([false]/true) to drop checksummed files from file cache.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sh_port2proc.c

    r195 r196  
    555555
    556556        buf = NULL;
    557         bufsize  = 1000;
     557        bufsize  = 8192;
    558558        bufsize0 = bufsize;
    559559        retry = 5;
  • trunk/src/sh_readconf.c

    r194 r196  
    892892#endif
    893893
     894  { N_("setdropcache"),   SH_SECTION_MISC,   SH_SECTION_NONE,
     895    sl_set_drop_cache },
     896
    894897  { N_("setiolimit"),   SH_SECTION_MISC,   SH_SECTION_NONE,
    895898    sh_unix_set_io_limit },
  • trunk/src/slib.c

    r192 r196  
    11#include "config_xor.h"
    22
     3#if defined(HAVE_POSIX_FADVISE) && defined(HAVE_MINCORE)
     4#define _XOPEN_SOURCE 600
     5#define _BSD_SOURCE
     6#endif
    37
    48#include <stdio.h>
     
    1721#include <fcntl.h>
    1822#include <signal.h>
     23
     24#if defined(HAVE_POSIX_FADVISE) && defined(HAVE_MINCORE)
     25#include <sys/mman.h>
     26#endif
    1927
    2028#if TIME_WITH_SYS_TIME
     
    15421550  int fd;               /* The file descriptor. */
    15431551  char * path;          /* The file path.       */
     1552  int flush;            /* Whether we want to flush the cache */
    15441553  sh_string * content;  /* The file content     */
    15451554} SL_OFILE;
     
    16661675  ofiles[fd]->fd      = fd;
    16671676  ofiles[fd]->content = NULL;
     1677  ofiles[fd]->flush   = SL_FALSE;
    16681678
    16691679  SL_IRETURN(ticket, _("sl_make_ticket"));
     
    19281938  ofiles[fd]->fd      = fd;
    19291939  ofiles[fd]->content = NULL;
     1940  ofiles[fd]->flush   = SL_FALSE;
    19301941
    19311942  SL_IRETURN(ticket, _("sl_open_file"));
     1943}
     1944
     1945int get_the_fd (SL_TICKET ticket)
     1946{
     1947  int fd;
     1948
     1949  if (SL_ISERROR(fd = sl_read_ticket(ticket)))
     1950    return (fd);
     1951
     1952  if (ofiles[fd] == NULL || fd != ofiles[fd]->fd || fd < 0)
     1953    return (SL_EINTERNAL);
     1954  return (fd);
    19321955}
    19331956
     
    19721995}
    19731996
     1997#if defined(HAVE_POSIX_FADVISE) && defined(HAVE_MINCORE) && defined(POSIX_FADV_DONTNEED)
     1998static int sl_check_mincore(int fd)
     1999{
     2000  /* Idea from Tobias Oetiker (http://insights.oetiker.ch/linux/fadvise.html)
     2001   */
     2002  struct stat fbuf;
     2003  int retval = -1;
     2004
     2005  if (0 == fstat(fd, &fbuf))
     2006    {
     2007      void *f_map;
     2008     
     2009      f_map = mmap((void *)0, fbuf.st_size, PROT_NONE, MAP_SHARED, fd, 0);
     2010      if (MAP_FAILED != f_map)
     2011        {
     2012          extern int sh_unix_pagesize(void);
     2013          size_t i;
     2014          size_t page_size    = sh_unix_pagesize();
     2015          size_t vec_size     = (fbuf.st_size+page_size-1)/page_size;
     2016          unsigned char * vec = calloc(1, vec_size);
     2017
     2018          if (vec)
     2019            {
     2020              mincore(f_map, fbuf.st_size, vec);
     2021              // imax = fbuf.st_size/page_size;
     2022              for (i = 0; i <= vec_size; ++i)
     2023                {
     2024                  if (vec[i]&1)
     2025                    {
     2026                      goto incore;
     2027                    }
     2028                }
     2029              retval = 0;
     2030            incore:
     2031              free(vec);
     2032            }
     2033          munmap(f_map, fbuf.st_size);
     2034        }
     2035    }
     2036  return retval;
     2037}
     2038#endif
     2039
     2040static int sl_drop_cache = SL_FALSE;
     2041
     2042int sl_set_drop_cache(const char * str)
     2043{
     2044  extern int sh_util_flagval(const char * c, int * fval);
     2045  return sh_util_flagval(str, &sl_drop_cache);
     2046}
     2047
    19742048SL_TICKET sl_open_fastread (const char * fname, int priv)
    19752049{
     
    19812055
    19822056  status = sl_open_file(fname, SL_OPEN_FOR_FASTREAD, priv);
     2057
     2058#if defined(HAVE_POSIX_FADVISE) && defined(HAVE_MINCORE) && defined(POSIX_FADV_DONTNEED)
     2059
     2060  if (SL_FALSE != sl_drop_cache && !SL_ISERROR(status))
     2061    {
     2062      int fd = get_the_fd(status);
     2063      if (fd >= 0)
     2064        {
     2065          if (0 == sl_check_mincore(fd))
     2066            ofiles[fd]->flush = SL_TRUE;
     2067        }
     2068    }
     2069
     2070#endif
     2071
    19832072  SL_IRETURN(status, _("sl_open_fastread"));
    19842073}
     
    20322121}
    20332122
    2034 
    2035 int get_the_fd (SL_TICKET ticket)
    2036 {
    2037   int fd;
    2038 
    2039   if (SL_ISERROR(fd = sl_read_ticket(ticket)))
    2040     return (fd);
    2041 
    2042   if (ofiles[fd] == NULL || fd != ofiles[fd]->fd || fd < 0)
    2043     return (SL_EINTERNAL);
    2044   return (fd);
    2045 }
    20462123
    20472124int sl_init_content (SL_TICKET ticket, size_t size)
     
    20832160  if (SL_ISERROR(fd = get_the_fd (ticket)))
    20842161    SL_IRETURN(fd, _("sl_close"));
     2162
     2163#if defined(HAVE_POSIX_FADVISE) && defined(HAVE_MINCORE) && defined(POSIX_FADV_DONTNEED)
     2164
     2165  if (ofiles[fd]->flush == SL_TRUE)
     2166    {
     2167      posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
     2168    }
     2169
     2170#endif
    20852171
    20862172  /* This may fail, but what to do then ?
Note: See TracChangeset for help on using the changeset viewer.