Loading ...
Sorry, an error occurred while loading the content.

patch 7.0.192

Expand Messages
  • Bram Moolenaar
    Patch 7.0.192 Problem: When swapfile is switched off in an empty file it is possible that not all blocks are loaded into memory, causing ml_get errors
    Message 1 of 1 , Feb 6, 2007
    • 0 Attachment
      Patch 7.0.192
      Problem: When 'swapfile' is switched off in an empty file it is possible
      that not all blocks are loaded into memory, causing ml_get errors
      later.
      Solution: Rename "dont_release" to "mf_dont_release" and also use it to
      avoid using the cached line and locked block.
      Files: src/globals.h, src/memfile.c, src/memline.c


      *** ../vim-7.0.191/src/globals.h Tue Jan 9 15:15:36 2007
      --- src/globals.h Wed Feb 7 03:29:52 2007
      ***************
      *** 554,559 ****
      --- 554,563 ----
      EXTERN buf_T *firstbuf INIT(= NULL); /* first buffer */
      EXTERN buf_T *lastbuf INIT(= NULL); /* last buffer */
      EXTERN buf_T *curbuf INIT(= NULL); /* currently active buffer */
      +
      + /* Flag that is set when switching off 'swapfile'. It means that all blocks
      + * are to be loaded into memory. Shouldn't be global... */
      + EXTERN int mf_dont_release INIT(= FALSE); /* don't release blocks */

      /*
      * List of files being edited (global argument list). curwin->w_alist points
      *** ../vim-7.0.191/src/memfile.c Tue Nov 7 18:02:19 2006
      --- src/memfile.c Wed Feb 7 03:22:11 2007
      ***************
      *** 76,82 ****
      #define MEMFILE_PAGE_SIZE 4096 /* default page size */

      static long_u total_mem_used = 0; /* total memory used for memfiles */
      - static int dont_release = FALSE; /* don't release blocks */

      static void mf_ins_hash __ARGS((memfile_T *, bhdr_T *));
      static void mf_rem_hash __ARGS((memfile_T *, bhdr_T *));
      --- 76,81 ----
      ***************
      *** 279,288 ****
      if (getlines)
      {
      /* get all blocks in memory by accessing all lines (clumsy!) */
      ! dont_release = TRUE;
      for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum)
      (void)ml_get_buf(buf, lnum, FALSE);
      ! dont_release = FALSE;
      /* TODO: should check if all blocks are really in core */
      }

      --- 278,287 ----
      if (getlines)
      {
      /* get all blocks in memory by accessing all lines (clumsy!) */
      ! mf_dont_release = TRUE;
      for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum)
      (void)ml_get_buf(buf, lnum, FALSE);
      ! mf_dont_release = FALSE;
      /* TODO: should check if all blocks are really in core */
      }

      ***************
      *** 830,836 ****
      buf_T *buf;

      /* don't release while in mf_close_file() */
      ! if (dont_release)
      return NULL;

      /*
      --- 829,835 ----
      buf_T *buf;

      /* don't release while in mf_close_file() */
      ! if (mf_dont_release)
      return NULL;

      /*
      *** ../vim-7.0.191/src/memline.c Tue Jan 9 15:15:36 2007
      --- src/memline.c Wed Feb 7 03:29:31 2007
      ***************
      *** 2074,2081 ****
      /*
      * See if it is the same line as requested last time.
      * Otherwise may need to flush last used line.
      */
      ! if (buf->b_ml.ml_line_lnum != lnum)
      {
      ml_flush_line(buf);

      --- 2074,2083 ----
      /*
      * See if it is the same line as requested last time.
      * Otherwise may need to flush last used line.
      + * Don't use the last used line when 'swapfile' is reset, need to load all
      + * blocks.
      */
      ! if (buf->b_ml.ml_line_lnum != lnum || mf_dont_release)
      {
      ml_flush_line(buf);

      ***************
      *** 3200,3212 ****
      * If not, flush and release the locked block.
      * Don't do this for ML_INSERT_SAME, because the stack need to be updated.
      * Don't do this for ML_FLUSH, because we want to flush the locked block.
      */
      if (buf->b_ml.ml_locked)
      {
      ! if (ML_SIMPLE(action) && buf->b_ml.ml_locked_low <= lnum
      ! && buf->b_ml.ml_locked_high >= lnum)
      {
      ! /* remember to update pointer blocks and stack later */
      if (action == ML_INSERT)
      {
      ++(buf->b_ml.ml_locked_lineadd);
      --- 3202,3217 ----
      * If not, flush and release the locked block.
      * Don't do this for ML_INSERT_SAME, because the stack need to be updated.
      * Don't do this for ML_FLUSH, because we want to flush the locked block.
      + * Don't do this when 'swapfile' is reset, we want to load all the blocks.
      */
      if (buf->b_ml.ml_locked)
      {
      ! if (ML_SIMPLE(action)
      ! && buf->b_ml.ml_locked_low <= lnum
      ! && buf->b_ml.ml_locked_high >= lnum
      ! && !mf_dont_release)
      {
      ! /* remember to update pointer blocks and stack later */
      if (action == ML_INSERT)
      {
      ++(buf->b_ml.ml_locked_lineadd);
      *** ../vim-7.0.191/src/version.c Sun Feb 4 02:59:04 2007
      --- src/version.c Wed Feb 7 03:40:28 2007
      ***************
      *** 668,669 ****
      --- 668,671 ----
      { /* Add new patch number below this line */
      + /**/
      + 192,
      /**/

      --
      From "know your smileys":
      %-) After staring at screen for 15 hours

      /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
      /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
      \\\ download, build and distribute -- http://www.A-A-P.org ///
      \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
    Your message has been successfully submitted and would be delivered to recipients shortly.