xref: /vim-8.2.3635/src/memfile.c (revision ed37d9b3)
1 /* vi:set ts=8 sts=4 sw=4 noet:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *
5  * Do ":help uganda"  in Vim to read copying and usage conditions.
6  * Do ":help credits" in Vim to see a list of people who contributed.
7  * See README.txt for an overview of the Vim source code.
8  */
9 
10 /*
11  * memfile.c: Contains the functions for handling blocks of memory which can
12  * be stored in a file. This is the implementation of a sort of virtual memory.
13  *
14  * A memfile consists of a sequence of blocks. The blocks numbered from 0
15  * upwards have been assigned a place in the actual file. The block number
16  * is equal to the page number in the file. The
17  * blocks with negative numbers are currently in memory only. They can be
18  * assigned a place in the file when too much memory is being used. At that
19  * moment they get a new, positive, number. A list is used for translation of
20  * negative to positive numbers.
21  *
22  * The size of a block is a multiple of a page size, normally the page size of
23  * the device the file is on. Most blocks are 1 page long. A Block of multiple
24  * pages is used for a line that does not fit in a single page.
25  *
26  * Each block can be in memory and/or in a file. The block stays in memory
27  * as long as it is locked. If it is no longer locked it can be swapped out to
28  * the file. It is only written to the file if it has been changed.
29  *
30  * Under normal operation the file is created when opening the memory file and
31  * deleted when closing the memory file. Only with recovery an existing memory
32  * file is opened.
33  */
34 
35 #include "vim.h"
36 
37 /*
38  * Some systems have the page size in statfs.f_bsize, some in stat.st_blksize
39  */
40 #ifdef HAVE_ST_BLKSIZE
41 # define STATFS stat
42 # define F_BSIZE st_blksize
43 # define fstatfs(fd, buf, len, nul) mch_fstat((fd), (buf))
44 #else
45 # ifdef HAVE_SYS_STATFS_H
46 #  include <sys/statfs.h>
47 #  define STATFS statfs
48 #  define F_BSIZE f_bsize
49 #  ifdef __MINT__		// do we still need this?
50 #   define fstatfs(fd, buf, len, nul) mch_fstat((fd), (buf))
51 #  endif
52 # endif
53 #endif
54 
55 /*
56  * for Amiga Dos 2.0x we use Flush
57  */
58 #ifdef AMIGA
59 # ifdef FEAT_ARP
60 extern int dos2;			// this is in os_amiga.c
61 # endif
62 # ifdef SASC
63 #  include <proto/dos.h>
64 #  include <ios1.h>			// for chkufb()
65 # endif
66 #endif
67 
68 #define MEMFILE_PAGE_SIZE 4096		// default page size
69 
70 static long_u	total_mem_used = 0;	// total memory used for memfiles
71 
72 static void mf_ins_hash(memfile_T *, bhdr_T *);
73 static void mf_rem_hash(memfile_T *, bhdr_T *);
74 static bhdr_T *mf_find_hash(memfile_T *, blocknr_T);
75 static void mf_ins_used(memfile_T *, bhdr_T *);
76 static void mf_rem_used(memfile_T *, bhdr_T *);
77 static bhdr_T *mf_release(memfile_T *, int);
78 static bhdr_T *mf_alloc_bhdr(memfile_T *, int);
79 static void mf_free_bhdr(bhdr_T *);
80 static void mf_ins_free(memfile_T *, bhdr_T *);
81 static bhdr_T *mf_rem_free(memfile_T *);
82 static int  mf_read(memfile_T *, bhdr_T *);
83 static int  mf_write(memfile_T *, bhdr_T *);
84 static int  mf_write_block(memfile_T *mfp, bhdr_T *hp, off_T offset, unsigned size);
85 static int  mf_trans_add(memfile_T *, bhdr_T *);
86 static void mf_do_open(memfile_T *, char_u *, int);
87 static void mf_hash_init(mf_hashtab_T *);
88 static void mf_hash_free(mf_hashtab_T *);
89 static void mf_hash_free_all(mf_hashtab_T *);
90 static mf_hashitem_T *mf_hash_find(mf_hashtab_T *, blocknr_T);
91 static void mf_hash_add_item(mf_hashtab_T *, mf_hashitem_T *);
92 static void mf_hash_rem_item(mf_hashtab_T *, mf_hashitem_T *);
93 static int mf_hash_grow(mf_hashtab_T *);
94 
95 /*
96  * The functions for using a memfile:
97  *
98  * mf_open()	    open a new or existing memfile
99  * mf_open_file()   open a swap file for an existing memfile
100  * mf_close()	    close (and delete) a memfile
101  * mf_new()	    create a new block in a memfile and lock it
102  * mf_get()	    get an existing block and lock it
103  * mf_put()	    unlock a block, may be marked for writing
104  * mf_free()	    remove a block
105  * mf_sync()	    sync changed parts of memfile to disk
106  * mf_release_all() release as much memory as possible
107  * mf_trans_del()   may translate negative to positive block number
108  * mf_fullname()    make file name full path (use before first :cd)
109  */
110 
111 /*
112  * Open an existing or new memory block file.
113  *
114  *  fname:	name of file to use (NULL means no file at all)
115  *		Note: fname must have been allocated, it is not copied!
116  *			If opening the file fails, fname is freed.
117  *  flags:	flags for open() call
118  *
119  *  If fname != NULL and file cannot be opened, fail.
120  *
121  * return value: identifier for this memory block file.
122  */
123     memfile_T *
124 mf_open(char_u *fname, int flags)
125 {
126     memfile_T		*mfp;
127     off_T		size;
128 #if defined(STATFS) && defined(UNIX) && !defined(__QNX__) && !defined(__minix)
129 # define USE_FSTATFS
130     struct STATFS	stf;
131 #endif
132 
133     if ((mfp = ALLOC_ONE(memfile_T)) == NULL)
134 	return NULL;
135 
136     if (fname == NULL)	    // no file for this memfile, use memory only
137     {
138 	mfp->mf_fname = NULL;
139 	mfp->mf_ffname = NULL;
140 	mfp->mf_fd = -1;
141     }
142     else
143     {
144 	mf_do_open(mfp, fname, flags);	// try to open the file
145 
146 	// if the file cannot be opened, return here
147 	if (mfp->mf_fd < 0)
148 	{
149 	    vim_free(mfp);
150 	    return NULL;
151 	}
152     }
153 
154     mfp->mf_free_first = NULL;		// free list is empty
155     mfp->mf_used_first = NULL;		// used list is empty
156     mfp->mf_used_last = NULL;
157     mfp->mf_dirty = FALSE;
158     mfp->mf_used_count = 0;
159     mf_hash_init(&mfp->mf_hash);
160     mf_hash_init(&mfp->mf_trans);
161     mfp->mf_page_size = MEMFILE_PAGE_SIZE;
162 #ifdef FEAT_CRYPT
163     mfp->mf_old_key = NULL;
164 #endif
165 
166 #ifdef USE_FSTATFS
167     /*
168      * Try to set the page size equal to the block size of the device.
169      * Speeds up I/O a lot.
170      * When recovering, the actual block size will be retrieved from block 0
171      * in ml_recover().  The size used here may be wrong, therefore
172      * mf_blocknr_max must be rounded up.
173      */
174     if (mfp->mf_fd >= 0
175 	    && fstatfs(mfp->mf_fd, &stf, sizeof(struct statfs), 0) == 0
176 	    && stf.F_BSIZE >= MIN_SWAP_PAGE_SIZE
177 	    && stf.F_BSIZE <= MAX_SWAP_PAGE_SIZE)
178 	mfp->mf_page_size = stf.F_BSIZE;
179 #endif
180 
181     if (mfp->mf_fd < 0 || (flags & (O_TRUNC|O_EXCL))
182 		  || (size = vim_lseek(mfp->mf_fd, (off_T)0L, SEEK_END)) <= 0)
183 	mfp->mf_blocknr_max = 0;	// no file or empty file
184     else
185 	mfp->mf_blocknr_max = (blocknr_T)((size + mfp->mf_page_size - 1)
186 							 / mfp->mf_page_size);
187     mfp->mf_blocknr_min = -1;
188     mfp->mf_neg_count = 0;
189     mfp->mf_infile_count = mfp->mf_blocknr_max;
190 
191     /*
192      * Compute maximum number of pages ('maxmem' is in Kbyte):
193      *	'mammem' * 1Kbyte / page-size-in-bytes.
194      * Avoid overflow by first reducing page size as much as possible.
195      */
196     {
197 	int	    shift = 10;
198 	unsigned    page_size = mfp->mf_page_size;
199 
200 	while (shift > 0 && (page_size & 1) == 0)
201 	{
202 	    page_size = page_size >> 1;
203 	    --shift;
204 	}
205 	mfp->mf_used_count_max = (p_mm << shift) / page_size;
206 	if (mfp->mf_used_count_max < 10)
207 	    mfp->mf_used_count_max = 10;
208     }
209 
210     return mfp;
211 }
212 
213 /*
214  * Open a file for an existing memfile.  Used when updatecount set from 0 to
215  * some value.
216  * If the file already exists, this fails.
217  * "fname" is the name of file to use (NULL means no file at all)
218  * Note: "fname" must have been allocated, it is not copied!  If opening the
219  * file fails, "fname" is freed.
220  *
221  * return value: FAIL if file could not be opened, OK otherwise
222  */
223     int
224 mf_open_file(memfile_T *mfp, char_u *fname)
225 {
226     mf_do_open(mfp, fname, O_RDWR|O_CREAT|O_EXCL); // try to open the file
227 
228     if (mfp->mf_fd < 0)
229 	return FAIL;
230 
231     mfp->mf_dirty = TRUE;
232     return OK;
233 }
234 
235 /*
236  * Close a memory file and delete the associated file if 'del_file' is TRUE.
237  */
238     void
239 mf_close(memfile_T *mfp, int del_file)
240 {
241     bhdr_T	*hp, *nextp;
242 
243     if (mfp == NULL)		    // safety check
244 	return;
245     if (mfp->mf_fd >= 0)
246     {
247 	if (close(mfp->mf_fd) < 0)
248 	    emsg(_(e_swapclose));
249     }
250     if (del_file && mfp->mf_fname != NULL)
251 	mch_remove(mfp->mf_fname);
252 					    // free entries in used list
253     for (hp = mfp->mf_used_first; hp != NULL; hp = nextp)
254     {
255 	total_mem_used -= hp->bh_page_count * mfp->mf_page_size;
256 	nextp = hp->bh_next;
257 	mf_free_bhdr(hp);
258     }
259     while (mfp->mf_free_first != NULL)	    // free entries in free list
260 	vim_free(mf_rem_free(mfp));
261     mf_hash_free(&mfp->mf_hash);
262     mf_hash_free_all(&mfp->mf_trans);	    // free hashtable and its items
263     vim_free(mfp->mf_fname);
264     vim_free(mfp->mf_ffname);
265     vim_free(mfp);
266 }
267 
268 /*
269  * Close the swap file for a memfile.  Used when 'swapfile' is reset.
270  */
271     void
272 mf_close_file(
273     buf_T	*buf,
274     int		getlines)	// get all lines into memory?
275 {
276     memfile_T	*mfp;
277     linenr_T	lnum;
278 
279     mfp = buf->b_ml.ml_mfp;
280     if (mfp == NULL || mfp->mf_fd < 0)		// nothing to close
281 	return;
282 
283     if (getlines)
284     {
285 	// get all blocks in memory by accessing all lines (clumsy!)
286 	mf_dont_release = TRUE;
287 	for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum)
288 	    (void)ml_get_buf(buf, lnum, FALSE);
289 	mf_dont_release = FALSE;
290 	// TODO: should check if all blocks are really in core
291     }
292 
293     if (close(mfp->mf_fd) < 0)			// close the file
294 	emsg(_(e_swapclose));
295     mfp->mf_fd = -1;
296 
297     if (mfp->mf_fname != NULL)
298     {
299 	mch_remove(mfp->mf_fname);		// delete the swap file
300 	VIM_CLEAR(mfp->mf_fname);
301 	VIM_CLEAR(mfp->mf_ffname);
302     }
303 }
304 
305 /*
306  * Set new size for a memfile.  Used when block 0 of a swapfile has been read
307  * and the size it indicates differs from what was guessed.
308  */
309     void
310 mf_new_page_size(memfile_T *mfp, unsigned new_size)
311 {
312     // Correct the memory used for block 0 to the new size, because it will be
313     // freed with that size later on.
314     total_mem_used += new_size - mfp->mf_page_size;
315     mfp->mf_page_size = new_size;
316 }
317 
318 /*
319  * get a new block
320  *
321  *   negative: TRUE if negative block number desired (data block)
322  */
323     bhdr_T *
324 mf_new(memfile_T *mfp, int negative, int page_count)
325 {
326     bhdr_T	*hp;	// new bhdr_T
327     bhdr_T	*freep;	// first block in free list
328     char_u	*p;
329 
330     /*
331      * If we reached the maximum size for the used memory blocks, release one
332      * If a bhdr_T is returned, use it and adjust the page_count if necessary.
333      */
334     hp = mf_release(mfp, page_count);
335 
336 /*
337  * Decide on the number to use:
338  * If there is a free block, use its number.
339  * Otherwise use mf_block_min for a negative number, mf_block_max for
340  * a positive number.
341  */
342     freep = mfp->mf_free_first;
343     if (!negative && freep != NULL && freep->bh_page_count >= page_count)
344     {
345 	/*
346 	 * If the block in the free list has more pages, take only the number
347 	 * of pages needed and allocate a new bhdr_T with data
348 	 *
349 	 * If the number of pages matches and mf_release() did not return a
350 	 * bhdr_T, use the bhdr_T from the free list and allocate the data
351 	 *
352 	 * If the number of pages matches and mf_release() returned a bhdr_T,
353 	 * just use the number and free the bhdr_T from the free list
354 	 */
355 	if (freep->bh_page_count > page_count)
356 	{
357 	    if (hp == NULL && (hp = mf_alloc_bhdr(mfp, page_count)) == NULL)
358 		return NULL;
359 	    hp->bh_bnum = freep->bh_bnum;
360 	    freep->bh_bnum += page_count;
361 	    freep->bh_page_count -= page_count;
362 	}
363 	else if (hp == NULL)	    // need to allocate memory for this block
364 	{
365 	    if ((p = alloc(mfp->mf_page_size * page_count)) == NULL)
366 		return NULL;
367 	    hp = mf_rem_free(mfp);
368 	    hp->bh_data = p;
369 	}
370 	else		    // use the number, remove entry from free list
371 	{
372 	    freep = mf_rem_free(mfp);
373 	    hp->bh_bnum = freep->bh_bnum;
374 	    vim_free(freep);
375 	}
376     }
377     else	// get a new number
378     {
379 	if (hp == NULL && (hp = mf_alloc_bhdr(mfp, page_count)) == NULL)
380 	    return NULL;
381 	if (negative)
382 	{
383 	    hp->bh_bnum = mfp->mf_blocknr_min--;
384 	    mfp->mf_neg_count++;
385 	}
386 	else
387 	{
388 	    hp->bh_bnum = mfp->mf_blocknr_max;
389 	    mfp->mf_blocknr_max += page_count;
390 	}
391     }
392     hp->bh_flags = BH_LOCKED | BH_DIRTY;	// new block is always dirty
393     mfp->mf_dirty = TRUE;
394     hp->bh_page_count = page_count;
395     mf_ins_used(mfp, hp);
396     mf_ins_hash(mfp, hp);
397 
398     /*
399      * Init the data to all zero, to avoid reading uninitialized data.
400      * This also avoids that the passwd file ends up in the swap file!
401      */
402     (void)vim_memset((char *)(hp->bh_data), 0,
403 				      (size_t)mfp->mf_page_size * page_count);
404 
405     return hp;
406 }
407 
408 /*
409  * Get existing block "nr" with "page_count" pages.
410  *
411  * Note: The caller should first check a negative nr with mf_trans_del()
412  */
413     bhdr_T *
414 mf_get(memfile_T *mfp, blocknr_T nr, int page_count)
415 {
416     bhdr_T    *hp;
417 						// doesn't exist
418     if (nr >= mfp->mf_blocknr_max || nr <= mfp->mf_blocknr_min)
419 	return NULL;
420 
421     /*
422      * see if it is in the cache
423      */
424     hp = mf_find_hash(mfp, nr);
425     if (hp == NULL)	// not in the hash list
426     {
427 	if (nr < 0 || nr >= mfp->mf_infile_count)   // can't be in the file
428 	    return NULL;
429 
430 	// could check here if the block is in the free list
431 
432 	/*
433 	 * Check if we need to flush an existing block.
434 	 * If so, use that block.
435 	 * If not, allocate a new block.
436 	 */
437 	hp = mf_release(mfp, page_count);
438 	if (hp == NULL && (hp = mf_alloc_bhdr(mfp, page_count)) == NULL)
439 	    return NULL;
440 
441 	hp->bh_bnum = nr;
442 	hp->bh_flags = 0;
443 	hp->bh_page_count = page_count;
444 	if (mf_read(mfp, hp) == FAIL)	    // cannot read the block!
445 	{
446 	    mf_free_bhdr(hp);
447 	    return NULL;
448 	}
449     }
450     else
451     {
452 	mf_rem_used(mfp, hp);	// remove from list, insert in front below
453 	mf_rem_hash(mfp, hp);
454     }
455 
456     hp->bh_flags |= BH_LOCKED;
457     mf_ins_used(mfp, hp);	// put in front of used list
458     mf_ins_hash(mfp, hp);	// put in front of hash list
459 
460     return hp;
461 }
462 
463 /*
464  * release the block *hp
465  *
466  *   dirty: Block must be written to file later
467  *   infile: Block should be in file (needed for recovery)
468  *
469  *  no return value, function cannot fail
470  */
471     void
472 mf_put(
473     memfile_T	*mfp,
474     bhdr_T	*hp,
475     int		dirty,
476     int		infile)
477 {
478     int		flags;
479 
480     flags = hp->bh_flags;
481 
482     if ((flags & BH_LOCKED) == 0)
483 	iemsg(_("E293: block was not locked"));
484     flags &= ~BH_LOCKED;
485     if (dirty)
486     {
487 	flags |= BH_DIRTY;
488 	mfp->mf_dirty = TRUE;
489     }
490     hp->bh_flags = flags;
491     if (infile)
492 	mf_trans_add(mfp, hp);	    // may translate negative in positive nr
493 }
494 
495 /*
496  * block *hp is no longer in used, may put it in the free list of memfile *mfp
497  */
498     void
499 mf_free(memfile_T *mfp, bhdr_T *hp)
500 {
501     vim_free(hp->bh_data);	// free the memory
502     mf_rem_hash(mfp, hp);	// get *hp out of the hash list
503     mf_rem_used(mfp, hp);	// get *hp out of the used list
504     if (hp->bh_bnum < 0)
505     {
506 	vim_free(hp);		// don't want negative numbers in free list
507 	mfp->mf_neg_count--;
508     }
509     else
510 	mf_ins_free(mfp, hp);	// put *hp in the free list
511 }
512 
513 #if defined(__MORPHOS__) && defined(__libnix__)
514 // function is missing in MorphOS libnix version
515 extern unsigned long *__stdfiledes;
516 
517     static unsigned long
518 fdtofh(int filedescriptor)
519 {
520     return __stdfiledes[filedescriptor];
521 }
522 #endif
523 
524 /*
525  * Sync the memory file *mfp to disk.
526  * Flags:
527  *  MFS_ALL	If not given, blocks with negative numbers are not synced,
528  *		even when they are dirty!
529  *  MFS_STOP	Stop syncing when a character becomes available, but sync at
530  *		least one block.
531  *  MFS_FLUSH	Make sure buffers are flushed to disk, so they will survive a
532  *		system crash.
533  *  MFS_ZERO	Only write block 0.
534  *
535  * Return FAIL for failure, OK otherwise
536  */
537     int
538 mf_sync(memfile_T *mfp, int flags)
539 {
540     int		status;
541     bhdr_T	*hp;
542     int		got_int_save = got_int;
543 
544     if (mfp->mf_fd < 0)	    // there is no file, nothing to do
545     {
546 	mfp->mf_dirty = FALSE;
547 	return FAIL;
548     }
549 
550     // Only a CTRL-C while writing will break us here, not one typed
551     // previously.
552     got_int = FALSE;
553 
554     /*
555      * sync from last to first (may reduce the probability of an inconsistent
556      * file) If a write fails, it is very likely caused by a full filesystem.
557      * Then we only try to write blocks within the existing file. If that also
558      * fails then we give up.
559      */
560     status = OK;
561     for (hp = mfp->mf_used_last; hp != NULL; hp = hp->bh_prev)
562 	if (((flags & MFS_ALL) || hp->bh_bnum >= 0)
563 		&& (hp->bh_flags & BH_DIRTY)
564 		&& (status == OK || (hp->bh_bnum >= 0
565 		    && hp->bh_bnum < mfp->mf_infile_count)))
566 	{
567 	    if ((flags & MFS_ZERO) && hp->bh_bnum != 0)
568 		continue;
569 	    if (mf_write(mfp, hp) == FAIL)
570 	    {
571 		if (status == FAIL)	// double error: quit syncing
572 		    break;
573 		status = FAIL;
574 	    }
575 	    if (flags & MFS_STOP)
576 	    {
577 		// Stop when char available now.
578 		if (ui_char_avail())
579 		    break;
580 	    }
581 	    else
582 		ui_breakcheck();
583 	    if (got_int)
584 		break;
585 	}
586 
587     /*
588      * If the whole list is flushed, the memfile is not dirty anymore.
589      * In case of an error this flag is also set, to avoid trying all the time.
590      */
591     if (hp == NULL || status == FAIL)
592 	mfp->mf_dirty = FALSE;
593 
594     if ((flags & MFS_FLUSH) && *p_sws != NUL)
595     {
596 #if defined(UNIX)
597 # ifdef HAVE_FSYNC
598 	/*
599 	 * most Unixes have the very useful fsync() function, just what we need.
600 	 */
601 	if (STRCMP(p_sws, "fsync") == 0)
602 	{
603 	    if (vim_fsync(mfp->mf_fd))
604 		status = FAIL;
605 	}
606 	else
607 # endif
608 	    // OpenNT is strictly POSIX (Benzinger)
609 	    // Tandem/Himalaya NSK-OSS doesn't have sync()
610 	    // No sync() on Stratus VOS
611 # if defined(__OPENNT) || defined(__TANDEM) || defined(__VOS__)
612 	    fflush(NULL);
613 # else
614 	    sync();
615 # endif
616 #endif
617 #ifdef VMS
618 	if (STRCMP(p_sws, "fsync") == 0)
619 	{
620 	    if (vim_fsync(mfp->mf_fd))
621 		status = FAIL;
622 	}
623 #endif
624 #ifdef MSWIN
625 	if (_commit(mfp->mf_fd))
626 	    status = FAIL;
627 #endif
628 #ifdef AMIGA
629 # if defined(__AROS__) || defined(__amigaos4__)
630 	if (vim_fsync(mfp->mf_fd) != 0)
631 	    status = FAIL;
632 # else
633 	/*
634 	 * Flush() only exists for AmigaDos 2.0.
635 	 * For 1.3 it should be done with close() + open(), but then the risk
636 	 * is that the open() may fail and lose the file....
637 	 */
638 #  ifdef FEAT_ARP
639 	if (dos2)
640 #  endif
641 #  ifdef SASC
642 	{
643 	    struct UFB *fp = chkufb(mfp->mf_fd);
644 
645 	    if (fp != NULL)
646 		Flush(fp->ufbfh);
647 	}
648 #  else
649 #   if defined(_DCC) || defined(__GNUC__) || defined(__MORPHOS__)
650 	{
651 #    if defined(__GNUC__) && !defined(__MORPHOS__) && defined(__libnix__)
652 	    // Have function (in libnix at least),
653 	    // but ain't got no prototype anywhere.
654 	    extern unsigned long fdtofh(int filedescriptor);
655 #    endif
656 #    if !defined(__libnix__)
657 	    fflush(NULL);
658 #    else
659 	    BPTR fh = (BPTR)fdtofh(mfp->mf_fd);
660 
661 	    if (fh != 0)
662 		Flush(fh);
663 #    endif
664 	}
665 #   else // assume Manx
666 	    Flush(_devtab[mfp->mf_fd].fd);
667 #   endif
668 #  endif
669 # endif
670 #endif // AMIGA
671     }
672 
673     got_int |= got_int_save;
674 
675     return status;
676 }
677 
678 /*
679  * For all blocks in memory file *mfp that have a positive block number set
680  * the dirty flag.  These are blocks that need to be written to a newly
681  * created swapfile.
682  */
683     void
684 mf_set_dirty(memfile_T *mfp)
685 {
686     bhdr_T	*hp;
687 
688     for (hp = mfp->mf_used_last; hp != NULL; hp = hp->bh_prev)
689 	if (hp->bh_bnum > 0)
690 	    hp->bh_flags |= BH_DIRTY;
691     mfp->mf_dirty = TRUE;
692 }
693 
694 /*
695  * insert block *hp in front of hashlist of memfile *mfp
696  */
697     static void
698 mf_ins_hash(memfile_T *mfp, bhdr_T *hp)
699 {
700     mf_hash_add_item(&mfp->mf_hash, (mf_hashitem_T *)hp);
701 }
702 
703 /*
704  * remove block *hp from hashlist of memfile list *mfp
705  */
706     static void
707 mf_rem_hash(memfile_T *mfp, bhdr_T *hp)
708 {
709     mf_hash_rem_item(&mfp->mf_hash, (mf_hashitem_T *)hp);
710 }
711 
712 /*
713  * look in hash lists of memfile *mfp for block header with number 'nr'
714  */
715     static bhdr_T *
716 mf_find_hash(memfile_T *mfp, blocknr_T nr)
717 {
718     return (bhdr_T *)mf_hash_find(&mfp->mf_hash, nr);
719 }
720 
721 /*
722  * insert block *hp in front of used list of memfile *mfp
723  */
724     static void
725 mf_ins_used(memfile_T *mfp, bhdr_T *hp)
726 {
727     hp->bh_next = mfp->mf_used_first;
728     mfp->mf_used_first = hp;
729     hp->bh_prev = NULL;
730     if (hp->bh_next == NULL)	    // list was empty, adjust last pointer
731 	mfp->mf_used_last = hp;
732     else
733 	hp->bh_next->bh_prev = hp;
734     mfp->mf_used_count += hp->bh_page_count;
735     total_mem_used += hp->bh_page_count * mfp->mf_page_size;
736 }
737 
738 /*
739  * remove block *hp from used list of memfile *mfp
740  */
741     static void
742 mf_rem_used(memfile_T *mfp, bhdr_T *hp)
743 {
744     if (hp->bh_next == NULL)	    // last block in used list
745 	mfp->mf_used_last = hp->bh_prev;
746     else
747 	hp->bh_next->bh_prev = hp->bh_prev;
748     if (hp->bh_prev == NULL)	    // first block in used list
749 	mfp->mf_used_first = hp->bh_next;
750     else
751 	hp->bh_prev->bh_next = hp->bh_next;
752     mfp->mf_used_count -= hp->bh_page_count;
753     total_mem_used -= hp->bh_page_count * mfp->mf_page_size;
754 }
755 
756 /*
757  * Release the least recently used block from the used list if the number
758  * of used memory blocks gets to big.
759  *
760  * Return the block header to the caller, including the memory block, so
761  * it can be re-used. Make sure the page_count is right.
762  *
763  * Returns NULL if no block is released.
764  */
765     static bhdr_T *
766 mf_release(memfile_T *mfp, int page_count)
767 {
768     bhdr_T	*hp;
769     int		need_release;
770     buf_T	*buf;
771 
772     // don't release while in mf_close_file()
773     if (mf_dont_release)
774 	return NULL;
775 
776     /*
777      * Need to release a block if the number of blocks for this memfile is
778      * higher than the maximum or total memory used is over 'maxmemtot'
779      */
780     need_release = ((mfp->mf_used_count >= mfp->mf_used_count_max)
781 				  || (total_mem_used >> 10) >= (long_u)p_mmt);
782 
783     /*
784      * Try to create a swap file if the amount of memory used is getting too
785      * high.
786      */
787     if (mfp->mf_fd < 0 && need_release && p_uc)
788     {
789 	// find for which buffer this memfile is
790 	FOR_ALL_BUFFERS(buf)
791 	    if (buf->b_ml.ml_mfp == mfp)
792 		break;
793 	if (buf != NULL && buf->b_may_swap)
794 	    ml_open_file(buf);
795     }
796 
797     /*
798      * don't release a block if
799      *	there is no file for this memfile
800      * or
801      *	the number of blocks for this memfile is lower than the maximum
802      *	  and
803      *	total memory used is not up to 'maxmemtot'
804      */
805     if (mfp->mf_fd < 0 || !need_release)
806 	return NULL;
807 
808     for (hp = mfp->mf_used_last; hp != NULL; hp = hp->bh_prev)
809 	if (!(hp->bh_flags & BH_LOCKED))
810 	    break;
811     if (hp == NULL)	// not a single one that can be released
812 	return NULL;
813 
814     /*
815      * If the block is dirty, write it.
816      * If the write fails we don't free it.
817      */
818     if ((hp->bh_flags & BH_DIRTY) && mf_write(mfp, hp) == FAIL)
819 	return NULL;
820 
821     mf_rem_used(mfp, hp);
822     mf_rem_hash(mfp, hp);
823 
824     /*
825      * If a bhdr_T is returned, make sure that the page_count of bh_data is
826      * right
827      */
828     if (hp->bh_page_count != page_count)
829     {
830 	vim_free(hp->bh_data);
831 	if ((hp->bh_data = alloc(mfp->mf_page_size * page_count)) == NULL)
832 	{
833 	    vim_free(hp);
834 	    return NULL;
835 	}
836 	hp->bh_page_count = page_count;
837     }
838     return hp;
839 }
840 
841 /*
842  * release as many blocks as possible
843  * Used in case of out of memory
844  *
845  * return TRUE if any memory was released
846  */
847     int
848 mf_release_all(void)
849 {
850     buf_T	*buf;
851     memfile_T	*mfp;
852     bhdr_T	*hp;
853     int		retval = FALSE;
854 
855     FOR_ALL_BUFFERS(buf)
856     {
857 	mfp = buf->b_ml.ml_mfp;
858 	if (mfp != NULL)
859 	{
860 	    // If no swap file yet, may open one
861 	    if (mfp->mf_fd < 0 && buf->b_may_swap)
862 		ml_open_file(buf);
863 
864 	    // only if there is a swapfile
865 	    if (mfp->mf_fd >= 0)
866 	    {
867 		for (hp = mfp->mf_used_last; hp != NULL; )
868 		{
869 		    if (!(hp->bh_flags & BH_LOCKED)
870 			    && (!(hp->bh_flags & BH_DIRTY)
871 				|| mf_write(mfp, hp) != FAIL))
872 		    {
873 			mf_rem_used(mfp, hp);
874 			mf_rem_hash(mfp, hp);
875 			mf_free_bhdr(hp);
876 			hp = mfp->mf_used_last;	// re-start, list was changed
877 			retval = TRUE;
878 		    }
879 		    else
880 			hp = hp->bh_prev;
881 		}
882 	    }
883 	}
884     }
885     return retval;
886 }
887 
888 /*
889  * Allocate a block header and a block of memory for it
890  */
891     static bhdr_T *
892 mf_alloc_bhdr(memfile_T *mfp, int page_count)
893 {
894     bhdr_T	*hp;
895 
896     if ((hp = ALLOC_ONE(bhdr_T)) != NULL)
897     {
898 	if ((hp->bh_data = alloc(mfp->mf_page_size * page_count)) == NULL)
899 	{
900 	    vim_free(hp);	    // not enough memory
901 	    return NULL;
902 	}
903 	hp->bh_page_count = page_count;
904     }
905     return hp;
906 }
907 
908 /*
909  * Free a block header and the block of memory for it
910  */
911     static void
912 mf_free_bhdr(bhdr_T *hp)
913 {
914     vim_free(hp->bh_data);
915     vim_free(hp);
916 }
917 
918 /*
919  * insert entry *hp in the free list
920  */
921     static void
922 mf_ins_free(memfile_T *mfp, bhdr_T *hp)
923 {
924     hp->bh_next = mfp->mf_free_first;
925     mfp->mf_free_first = hp;
926 }
927 
928 /*
929  * remove the first entry from the free list and return a pointer to it
930  * Note: caller must check that mfp->mf_free_first is not NULL!
931  */
932     static bhdr_T *
933 mf_rem_free(memfile_T *mfp)
934 {
935     bhdr_T	*hp;
936 
937     hp = mfp->mf_free_first;
938     mfp->mf_free_first = hp->bh_next;
939     return hp;
940 }
941 
942 /*
943  * read a block from disk
944  *
945  * Return FAIL for failure, OK otherwise
946  */
947     static int
948 mf_read(memfile_T *mfp, bhdr_T *hp)
949 {
950     off_T	offset;
951     unsigned	page_size;
952     unsigned	size;
953 
954     if (mfp->mf_fd < 0)	    // there is no file, can't read
955 	return FAIL;
956 
957     page_size = mfp->mf_page_size;
958     offset = (off_T)page_size * hp->bh_bnum;
959     size = page_size * hp->bh_page_count;
960     if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset)
961     {
962 	PERROR(_("E294: Seek error in swap file read"));
963 	return FAIL;
964     }
965     if ((unsigned)read_eintr(mfp->mf_fd, hp->bh_data, size) != size)
966     {
967 	PERROR(_("E295: Read error in swap file"));
968 	return FAIL;
969     }
970 
971 #ifdef FEAT_CRYPT
972     // Decrypt if 'key' is set and this is a data block. And when changing the
973     // key.
974     if (*mfp->mf_buffer->b_p_key != NUL || mfp->mf_old_key != NULL)
975 	ml_decrypt_data(mfp, hp->bh_data, offset, size);
976 #endif
977 
978     return OK;
979 }
980 
981 /*
982  * write a block to disk
983  *
984  * Return FAIL for failure, OK otherwise
985  */
986     static int
987 mf_write(memfile_T *mfp, bhdr_T *hp)
988 {
989     off_T	offset;	    // offset in the file
990     blocknr_T	nr;	    // block nr which is being written
991     bhdr_T	*hp2;
992     unsigned	page_size;  // number of bytes in a page
993     unsigned	page_count; // number of pages written
994     unsigned	size;	    // number of bytes written
995 
996     if (mfp->mf_fd < 0 && !mfp->mf_reopen)
997 	// there is no file and there was no file, can't write
998 	return FAIL;
999 
1000     if (hp->bh_bnum < 0)	// must assign file block number
1001 	if (mf_trans_add(mfp, hp) == FAIL)
1002 	    return FAIL;
1003 
1004     page_size = mfp->mf_page_size;
1005 
1006     /*
1007      * We don't want gaps in the file. Write the blocks in front of *hp
1008      * to extend the file.
1009      * If block 'mf_infile_count' is not in the hash list, it has been
1010      * freed. Fill the space in the file with data from the current block.
1011      */
1012     for (;;)
1013     {
1014 	int attempt;
1015 
1016 	nr = hp->bh_bnum;
1017 	if (nr > mfp->mf_infile_count)		// beyond end of file
1018 	{
1019 	    nr = mfp->mf_infile_count;
1020 	    hp2 = mf_find_hash(mfp, nr);	// NULL caught below
1021 	}
1022 	else
1023 	    hp2 = hp;
1024 
1025 	offset = (off_T)page_size * nr;
1026 	if (hp2 == NULL)	    // freed block, fill with dummy data
1027 	    page_count = 1;
1028 	else
1029 	    page_count = hp2->bh_page_count;
1030 	size = page_size * page_count;
1031 
1032 	for (attempt = 1; attempt <= 2; ++attempt)
1033 	{
1034 	    if (mfp->mf_fd >= 0)
1035 	    {
1036 		if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset)
1037 		{
1038 		    PERROR(_("E296: Seek error in swap file write"));
1039 		    return FAIL;
1040 		}
1041 		if (mf_write_block(mfp,
1042 				   hp2 == NULL ? hp : hp2, offset, size) == OK)
1043 		    break;
1044 	    }
1045 
1046 	    if (attempt == 1)
1047 	    {
1048 		// If the swap file is on a network drive, and the network
1049 		// gets disconnected and then re-connected, we can maybe fix it
1050 		// by closing and then re-opening the file.
1051 		if (mfp->mf_fd >= 0)
1052 		    close(mfp->mf_fd);
1053 		mfp->mf_fd = mch_open_rw((char *)mfp->mf_fname, mfp->mf_flags);
1054 		mfp->mf_reopen = (mfp->mf_fd < 0);
1055 	    }
1056 	    if (attempt == 2 || mfp->mf_fd < 0)
1057 	    {
1058 		// Avoid repeating the error message, this mostly happens when
1059 		// the disk is full. We give the message again only after a
1060 		// successful write or when hitting a key. We keep on trying,
1061 		// in case some space becomes available.
1062 		if (!did_swapwrite_msg)
1063 		    emsg(_("E297: Write error in swap file"));
1064 		did_swapwrite_msg = TRUE;
1065 		return FAIL;
1066 	    }
1067 	}
1068 
1069 	did_swapwrite_msg = FALSE;
1070 	if (hp2 != NULL)		    // written a non-dummy block
1071 	    hp2->bh_flags &= ~BH_DIRTY;
1072 					    // appended to the file
1073 	if (nr + (blocknr_T)page_count > mfp->mf_infile_count)
1074 	    mfp->mf_infile_count = nr + page_count;
1075 	if (nr == hp->bh_bnum)		    // written the desired block
1076 	    break;
1077     }
1078     return OK;
1079 }
1080 
1081 /*
1082  * Write block "hp" with data size "size" to file "mfp->mf_fd".
1083  * Takes care of encryption.
1084  * Return FAIL or OK.
1085  */
1086     static int
1087 mf_write_block(
1088     memfile_T	*mfp,
1089     bhdr_T	*hp,
1090     off_T	offset UNUSED,
1091     unsigned	size)
1092 {
1093     char_u	*data = hp->bh_data;
1094     int		result = OK;
1095 
1096 #ifdef FEAT_CRYPT
1097     // Encrypt if 'key' is set and this is a data block.
1098     if (*mfp->mf_buffer->b_p_key != NUL)
1099     {
1100 	data = ml_encrypt_data(mfp, data, offset, size);
1101 	if (data == NULL)
1102 	    return FAIL;
1103     }
1104 #endif
1105 
1106     if ((unsigned)write_eintr(mfp->mf_fd, data, size) != size)
1107 	result = FAIL;
1108 
1109 #ifdef FEAT_CRYPT
1110     if (data != hp->bh_data)
1111 	vim_free(data);
1112 #endif
1113 
1114     return result;
1115 }
1116 
1117 /*
1118  * Make block number for *hp positive and add it to the translation list
1119  *
1120  * Return FAIL for failure, OK otherwise
1121  */
1122     static int
1123 mf_trans_add(memfile_T *mfp, bhdr_T *hp)
1124 {
1125     bhdr_T	*freep;
1126     blocknr_T	new_bnum;
1127     NR_TRANS	*np;
1128     int		page_count;
1129 
1130     if (hp->bh_bnum >= 0)		    // it's already positive
1131 	return OK;
1132 
1133     if ((np = ALLOC_ONE(NR_TRANS)) == NULL)
1134 	return FAIL;
1135 
1136 /*
1137  * Get a new number for the block.
1138  * If the first item in the free list has sufficient pages, use its number
1139  * Otherwise use mf_blocknr_max.
1140  */
1141     freep = mfp->mf_free_first;
1142     page_count = hp->bh_page_count;
1143     if (freep != NULL && freep->bh_page_count >= page_count)
1144     {
1145 	new_bnum = freep->bh_bnum;
1146 	/*
1147 	 * If the page count of the free block was larger, reduce it.
1148 	 * If the page count matches, remove the block from the free list
1149 	 */
1150 	if (freep->bh_page_count > page_count)
1151 	{
1152 	    freep->bh_bnum += page_count;
1153 	    freep->bh_page_count -= page_count;
1154 	}
1155 	else
1156 	{
1157 	    freep = mf_rem_free(mfp);
1158 	    vim_free(freep);
1159 	}
1160     }
1161     else
1162     {
1163 	new_bnum = mfp->mf_blocknr_max;
1164 	mfp->mf_blocknr_max += page_count;
1165     }
1166 
1167     np->nt_old_bnum = hp->bh_bnum;	    // adjust number
1168     np->nt_new_bnum = new_bnum;
1169 
1170     mf_rem_hash(mfp, hp);		    // remove from old hash list
1171     hp->bh_bnum = new_bnum;
1172     mf_ins_hash(mfp, hp);		    // insert in new hash list
1173 
1174     // Insert "np" into "mf_trans" hashtable with key "np->nt_old_bnum"
1175     mf_hash_add_item(&mfp->mf_trans, (mf_hashitem_T *)np);
1176 
1177     return OK;
1178 }
1179 
1180 /*
1181  * Lookup a translation from the trans lists and delete the entry.
1182  *
1183  * Return the positive new number when found, the old number when not found
1184  */
1185     blocknr_T
1186 mf_trans_del(memfile_T *mfp, blocknr_T old_nr)
1187 {
1188     NR_TRANS	*np;
1189     blocknr_T	new_bnum;
1190 
1191     np = (NR_TRANS *)mf_hash_find(&mfp->mf_trans, old_nr);
1192 
1193     if (np == NULL)		// not found
1194 	return old_nr;
1195 
1196     mfp->mf_neg_count--;
1197     new_bnum = np->nt_new_bnum;
1198 
1199     // remove entry from the trans list
1200     mf_hash_rem_item(&mfp->mf_trans, (mf_hashitem_T *)np);
1201 
1202     vim_free(np);
1203 
1204     return new_bnum;
1205 }
1206 
1207 /*
1208  * Set mfp->mf_ffname according to mfp->mf_fname and some other things.
1209  * Only called when creating or renaming the swapfile.	Either way it's a new
1210  * name so we must work out the full path name.
1211  */
1212     void
1213 mf_set_ffname(memfile_T *mfp)
1214 {
1215     mfp->mf_ffname = FullName_save(mfp->mf_fname, FALSE);
1216 }
1217 
1218 /*
1219  * Make the name of the file used for the memfile a full path.
1220  * Used before doing a :cd
1221  */
1222     void
1223 mf_fullname(memfile_T *mfp)
1224 {
1225     if (mfp != NULL && mfp->mf_fname != NULL && mfp->mf_ffname != NULL)
1226     {
1227 	vim_free(mfp->mf_fname);
1228 	mfp->mf_fname = mfp->mf_ffname;
1229 	mfp->mf_ffname = NULL;
1230     }
1231 }
1232 
1233 /*
1234  * return TRUE if there are any translations pending for 'mfp'
1235  */
1236     int
1237 mf_need_trans(memfile_T *mfp)
1238 {
1239     return (mfp->mf_fname != NULL && mfp->mf_neg_count > 0);
1240 }
1241 
1242 /*
1243  * Open a swap file for a memfile.
1244  * The "fname" must be in allocated memory, and is consumed (also when an
1245  * error occurs).
1246  */
1247     static void
1248 mf_do_open(
1249     memfile_T	*mfp,
1250     char_u	*fname,
1251     int		flags)		// flags for open()
1252 {
1253 #ifdef HAVE_LSTAT
1254     stat_T	sb;
1255 #endif
1256 
1257     mfp->mf_fname = fname;
1258 
1259     /*
1260      * Get the full path name before the open, because this is
1261      * not possible after the open on the Amiga.
1262      * fname cannot be NameBuff, because it must have been allocated.
1263      */
1264     mf_set_ffname(mfp);
1265 #if defined(MSWIN)
1266     /*
1267      * A ":!cd e:xxx" may change the directory without us knowing, use the
1268      * full pathname always.  Careful: This frees fname!
1269      */
1270     mf_fullname(mfp);
1271 #endif
1272 
1273 #ifdef HAVE_LSTAT
1274     /*
1275      * Extra security check: When creating a swap file it really shouldn't
1276      * exist yet.  If there is a symbolic link, this is most likely an attack.
1277      */
1278     if ((flags & O_CREAT) && mch_lstat((char *)mfp->mf_fname, &sb) >= 0)
1279     {
1280 	mfp->mf_fd = -1;
1281 	emsg(_("E300: Swap file already exists (symlink attack?)"));
1282     }
1283     else
1284 #endif
1285     {
1286 	/*
1287 	 * try to open the file
1288 	 */
1289 	flags |= O_EXTRA | O_NOFOLLOW;
1290 #ifdef MSWIN
1291 	// Prevent handle inheritance that cause problems with Cscope
1292 	// (swap file may not be deleted if cscope connection was open after
1293 	// the file)
1294 	flags |= O_NOINHERIT;
1295 #endif
1296 	mfp->mf_flags = flags;
1297 	mfp->mf_fd = mch_open_rw((char *)mfp->mf_fname, flags);
1298     }
1299 
1300     /*
1301      * If the file cannot be opened, use memory only
1302      */
1303     if (mfp->mf_fd < 0)
1304     {
1305 	VIM_CLEAR(mfp->mf_fname);
1306 	VIM_CLEAR(mfp->mf_ffname);
1307     }
1308     else
1309     {
1310 #ifdef HAVE_FD_CLOEXEC
1311 	int fdflags = fcntl(mfp->mf_fd, F_GETFD);
1312 	if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
1313 	    (void)fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC);
1314 #endif
1315 #if defined(HAVE_SELINUX) || defined(HAVE_SMACK)
1316 	mch_copy_sec(fname, mfp->mf_fname);
1317 #endif
1318 	mch_hide(mfp->mf_fname);    // try setting the 'hidden' flag
1319     }
1320 }
1321 
1322 /*
1323  * Implementation of mf_hashtab_T follows.
1324  */
1325 
1326 /*
1327  * The number of buckets in the hashtable is increased by a factor of
1328  * MHT_GROWTH_FACTOR when the average number of items per bucket
1329  * exceeds 2 ^ MHT_LOG_LOAD_FACTOR.
1330  */
1331 #define MHT_LOG_LOAD_FACTOR 6
1332 #define MHT_GROWTH_FACTOR   2   // must be a power of two
1333 
1334 /*
1335  * Initialize an empty hash table.
1336  */
1337     static void
1338 mf_hash_init(mf_hashtab_T *mht)
1339 {
1340     CLEAR_POINTER(mht);
1341     mht->mht_buckets = mht->mht_small_buckets;
1342     mht->mht_mask = MHT_INIT_SIZE - 1;
1343 }
1344 
1345 /*
1346  * Free the array of a hash table.  Does not free the items it contains!
1347  * The hash table must not be used again without another mf_hash_init() call.
1348  */
1349     static void
1350 mf_hash_free(mf_hashtab_T *mht)
1351 {
1352     if (mht->mht_buckets != mht->mht_small_buckets)
1353 	vim_free(mht->mht_buckets);
1354 }
1355 
1356 /*
1357  * Free the array of a hash table and all the items it contains.
1358  */
1359     static void
1360 mf_hash_free_all(mf_hashtab_T *mht)
1361 {
1362     long_u	    idx;
1363     mf_hashitem_T   *mhi;
1364     mf_hashitem_T   *next;
1365 
1366     for (idx = 0; idx <= mht->mht_mask; idx++)
1367 	for (mhi = mht->mht_buckets[idx]; mhi != NULL; mhi = next)
1368 	{
1369 	    next = mhi->mhi_next;
1370 	    vim_free(mhi);
1371 	}
1372 
1373     mf_hash_free(mht);
1374 }
1375 
1376 /*
1377  * Find "key" in hashtable "mht".
1378  * Returns a pointer to a mf_hashitem_T or NULL if the item was not found.
1379  */
1380     static mf_hashitem_T *
1381 mf_hash_find(mf_hashtab_T *mht, blocknr_T key)
1382 {
1383     mf_hashitem_T   *mhi;
1384 
1385     mhi = mht->mht_buckets[key & mht->mht_mask];
1386     while (mhi != NULL && mhi->mhi_key != key)
1387 	mhi = mhi->mhi_next;
1388 
1389     return mhi;
1390 }
1391 
1392 /*
1393  * Add item "mhi" to hashtable "mht".
1394  * "mhi" must not be NULL.
1395  */
1396     static void
1397 mf_hash_add_item(mf_hashtab_T *mht, mf_hashitem_T *mhi)
1398 {
1399     long_u	    idx;
1400 
1401     idx = mhi->mhi_key & mht->mht_mask;
1402     mhi->mhi_next = mht->mht_buckets[idx];
1403     mhi->mhi_prev = NULL;
1404     if (mhi->mhi_next != NULL)
1405 	mhi->mhi_next->mhi_prev = mhi;
1406     mht->mht_buckets[idx] = mhi;
1407 
1408     mht->mht_count++;
1409 
1410     /*
1411      * Grow hashtable when we have more thank 2^MHT_LOG_LOAD_FACTOR
1412      * items per bucket on average
1413      */
1414     if (mht->mht_fixed == 0
1415 	&& (mht->mht_count >> MHT_LOG_LOAD_FACTOR) > mht->mht_mask)
1416     {
1417 	if (mf_hash_grow(mht) == FAIL)
1418 	{
1419 	    // stop trying to grow after first failure to allocate memory
1420 	    mht->mht_fixed = 1;
1421 	}
1422     }
1423 }
1424 
1425 /*
1426  * Remove item "mhi" from hashtable "mht".
1427  * "mhi" must not be NULL and must have been inserted into "mht".
1428  */
1429     static void
1430 mf_hash_rem_item(mf_hashtab_T *mht, mf_hashitem_T *mhi)
1431 {
1432     if (mhi->mhi_prev == NULL)
1433 	mht->mht_buckets[mhi->mhi_key & mht->mht_mask] = mhi->mhi_next;
1434     else
1435 	mhi->mhi_prev->mhi_next = mhi->mhi_next;
1436 
1437     if (mhi->mhi_next != NULL)
1438 	mhi->mhi_next->mhi_prev = mhi->mhi_prev;
1439 
1440     mht->mht_count--;
1441 
1442     // We could shrink the table here, but it typically takes little memory,
1443     // so why bother?
1444 }
1445 
1446 /*
1447  * Increase number of buckets in the hashtable by MHT_GROWTH_FACTOR and
1448  * rehash items.
1449  * Returns FAIL when out of memory.
1450  */
1451     static int
1452 mf_hash_grow(mf_hashtab_T *mht)
1453 {
1454     long_u	    i, j;
1455     int		    shift;
1456     mf_hashitem_T   *mhi;
1457     mf_hashitem_T   *tails[MHT_GROWTH_FACTOR];
1458     mf_hashitem_T   **buckets;
1459     size_t	    size;
1460 
1461     size = (mht->mht_mask + 1) * MHT_GROWTH_FACTOR * sizeof(void *);
1462     buckets = lalloc_clear(size, FALSE);
1463     if (buckets == NULL)
1464 	return FAIL;
1465 
1466     shift = 0;
1467     while ((mht->mht_mask >> shift) != 0)
1468 	shift++;
1469 
1470     for (i = 0; i <= mht->mht_mask; i++)
1471     {
1472 	/*
1473 	 * Traverse the items in the i-th original bucket and move them into
1474 	 * MHT_GROWTH_FACTOR new buckets, preserving their relative order
1475 	 * within each new bucket.  Preserving the order is important because
1476 	 * mf_get() tries to keep most recently used items at the front of
1477 	 * each bucket.
1478 	 *
1479 	 * Here we strongly rely on the fact the hashes are computed modulo
1480 	 * a power of two.
1481 	 */
1482 
1483 	CLEAR_FIELD(tails);
1484 
1485 	for (mhi = mht->mht_buckets[i]; mhi != NULL; mhi = mhi->mhi_next)
1486 	{
1487 	    j = (mhi->mhi_key >> shift) & (MHT_GROWTH_FACTOR - 1);
1488 	    if (tails[j] == NULL)
1489 	    {
1490 		buckets[i + (j << shift)] = mhi;
1491 		tails[j] = mhi;
1492 		mhi->mhi_prev = NULL;
1493 	    }
1494 	    else
1495 	    {
1496 		tails[j]->mhi_next = mhi;
1497 		mhi->mhi_prev = tails[j];
1498 		tails[j] = mhi;
1499 	    }
1500 	}
1501 
1502 	for (j = 0; j < MHT_GROWTH_FACTOR; j++)
1503 	    if (tails[j] != NULL)
1504 		tails[j]->mhi_next = NULL;
1505     }
1506 
1507     if (mht->mht_buckets != mht->mht_small_buckets)
1508 	vim_free(mht->mht_buckets);
1509 
1510     mht->mht_buckets = buckets;
1511     mht->mht_mask = (mht->mht_mask + 1) * MHT_GROWTH_FACTOR - 1;
1512 
1513     return OK;
1514 }
1515