| To: vim-dev@vim.org |
| Subject: patch 7.0.192 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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; |
| |
| /* |
| |
| |
| |
| *** 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); |
| |
| |
| |
| *** 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 /// |