To: vim-dev@vim.org Subject: patch 7.0.192 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ 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@Moolenaar.net -- 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 ///