Lines Matching refs:mfp
81 static int mf_write_block(memfile_T *mfp, bhdr_T *hp, off_T offset, unsigned size);
123 memfile_T *mfp; in mf_open() local
130 if ((mfp = ALLOC_ONE(memfile_T)) == NULL) in mf_open()
135 mfp->mf_fname = NULL; in mf_open()
136 mfp->mf_ffname = NULL; in mf_open()
137 mfp->mf_fd = -1; in mf_open()
141 mf_do_open(mfp, fname, flags); // try to open the file in mf_open()
144 if (mfp->mf_fd < 0) in mf_open()
146 vim_free(mfp); in mf_open()
151 mfp->mf_free_first = NULL; // free list is empty in mf_open()
152 mfp->mf_used_first = NULL; // used list is empty in mf_open()
153 mfp->mf_used_last = NULL; in mf_open()
154 mfp->mf_dirty = FALSE; in mf_open()
155 mfp->mf_used_count = 0; in mf_open()
156 mf_hash_init(&mfp->mf_hash); in mf_open()
157 mf_hash_init(&mfp->mf_trans); in mf_open()
158 mfp->mf_page_size = MEMFILE_PAGE_SIZE; in mf_open()
160 mfp->mf_old_key = NULL; in mf_open()
171 if (mfp->mf_fd >= 0 in mf_open()
172 && fstatfs(mfp->mf_fd, &stf, sizeof(struct statfs), 0) == 0 in mf_open()
175 mfp->mf_page_size = stf.F_BSIZE; in mf_open()
178 if (mfp->mf_fd < 0 || (flags & (O_TRUNC|O_EXCL)) in mf_open()
179 || (size = vim_lseek(mfp->mf_fd, (off_T)0L, SEEK_END)) <= 0) in mf_open()
180 mfp->mf_blocknr_max = 0; // no file or empty file in mf_open()
182 mfp->mf_blocknr_max = (blocknr_T)((size + mfp->mf_page_size - 1) in mf_open()
183 / mfp->mf_page_size); in mf_open()
184 mfp->mf_blocknr_min = -1; in mf_open()
185 mfp->mf_neg_count = 0; in mf_open()
186 mfp->mf_infile_count = mfp->mf_blocknr_max; in mf_open()
195 unsigned page_size = mfp->mf_page_size; in mf_open()
202 mfp->mf_used_count_max = (p_mm << shift) / page_size; in mf_open()
203 if (mfp->mf_used_count_max < 10) in mf_open()
204 mfp->mf_used_count_max = 10; in mf_open()
207 return mfp; in mf_open()
221 mf_open_file(memfile_T *mfp, char_u *fname) in mf_open_file() argument
223 mf_do_open(mfp, fname, O_RDWR|O_CREAT|O_EXCL); // try to open the file in mf_open_file()
225 if (mfp->mf_fd < 0) in mf_open_file()
228 mfp->mf_dirty = TRUE; in mf_open_file()
236 mf_close(memfile_T *mfp, int del_file) in mf_close() argument
240 if (mfp == NULL) // safety check in mf_close()
242 if (mfp->mf_fd >= 0) in mf_close()
244 if (close(mfp->mf_fd) < 0) in mf_close()
247 if (del_file && mfp->mf_fname != NULL) in mf_close()
248 mch_remove(mfp->mf_fname); in mf_close()
250 for (hp = mfp->mf_used_first; hp != NULL; hp = nextp) in mf_close()
252 total_mem_used -= hp->bh_page_count * mfp->mf_page_size; in mf_close()
256 while (mfp->mf_free_first != NULL) // free entries in free list in mf_close()
257 vim_free(mf_rem_free(mfp)); in mf_close()
258 mf_hash_free(&mfp->mf_hash); in mf_close()
259 mf_hash_free_all(&mfp->mf_trans); // free hashtable and its items in mf_close()
260 vim_free(mfp->mf_fname); in mf_close()
261 vim_free(mfp->mf_ffname); in mf_close()
262 vim_free(mfp); in mf_close()
273 memfile_T *mfp; in mf_close_file() local
276 mfp = buf->b_ml.ml_mfp; in mf_close_file()
277 if (mfp == NULL || mfp->mf_fd < 0) // nothing to close in mf_close_file()
290 if (close(mfp->mf_fd) < 0) // close the file in mf_close_file()
292 mfp->mf_fd = -1; in mf_close_file()
294 if (mfp->mf_fname != NULL) in mf_close_file()
296 mch_remove(mfp->mf_fname); // delete the swap file in mf_close_file()
297 VIM_CLEAR(mfp->mf_fname); in mf_close_file()
298 VIM_CLEAR(mfp->mf_ffname); in mf_close_file()
307 mf_new_page_size(memfile_T *mfp, unsigned new_size) in mf_new_page_size() argument
311 total_mem_used += new_size - mfp->mf_page_size; in mf_new_page_size()
312 mfp->mf_page_size = new_size; in mf_new_page_size()
321 mf_new(memfile_T *mfp, int negative, int page_count) in mf_new() argument
331 hp = mf_release(mfp, page_count); in mf_new()
339 freep = mfp->mf_free_first; in mf_new()
354 if (hp == NULL && (hp = mf_alloc_bhdr(mfp, page_count)) == NULL) in mf_new()
362 if ((p = alloc(mfp->mf_page_size * page_count)) == NULL) in mf_new()
364 hp = mf_rem_free(mfp); in mf_new()
369 freep = mf_rem_free(mfp); in mf_new()
376 if (hp == NULL && (hp = mf_alloc_bhdr(mfp, page_count)) == NULL) in mf_new()
380 hp->bh_bnum = mfp->mf_blocknr_min--; in mf_new()
381 mfp->mf_neg_count++; in mf_new()
385 hp->bh_bnum = mfp->mf_blocknr_max; in mf_new()
386 mfp->mf_blocknr_max += page_count; in mf_new()
390 mfp->mf_dirty = TRUE; in mf_new()
392 mf_ins_used(mfp, hp); in mf_new()
393 mf_ins_hash(mfp, hp); in mf_new()
400 (size_t)mfp->mf_page_size * page_count); in mf_new()
411 mf_get(memfile_T *mfp, blocknr_T nr, int page_count) in mf_get() argument
415 if (nr >= mfp->mf_blocknr_max || nr <= mfp->mf_blocknr_min) in mf_get()
421 hp = mf_find_hash(mfp, nr); in mf_get()
424 if (nr < 0 || nr >= mfp->mf_infile_count) // can't be in the file in mf_get()
434 hp = mf_release(mfp, page_count); in mf_get()
435 if (hp == NULL && (hp = mf_alloc_bhdr(mfp, page_count)) == NULL) in mf_get()
441 if (mf_read(mfp, hp) == FAIL) // cannot read the block! in mf_get()
449 mf_rem_used(mfp, hp); // remove from list, insert in front below in mf_get()
450 mf_rem_hash(mfp, hp); in mf_get()
454 mf_ins_used(mfp, hp); // put in front of used list in mf_get()
455 mf_ins_hash(mfp, hp); // put in front of hash list in mf_get()
470 memfile_T *mfp, in mf_put() argument
485 mfp->mf_dirty = TRUE; in mf_put()
489 mf_trans_add(mfp, hp); // may translate negative in positive nr in mf_put()
496 mf_free(memfile_T *mfp, bhdr_T *hp) in mf_free() argument
499 mf_rem_hash(mfp, hp); // get *hp out of the hash list in mf_free()
500 mf_rem_used(mfp, hp); // get *hp out of the used list in mf_free()
504 mfp->mf_neg_count--; in mf_free()
507 mf_ins_free(mfp, hp); // put *hp in the free list in mf_free()
524 mf_sync(memfile_T *mfp, int flags) in mf_sync() argument
530 if (mfp->mf_fd < 0) // there is no file, nothing to do in mf_sync()
532 mfp->mf_dirty = FALSE; in mf_sync()
547 for (hp = mfp->mf_used_last; hp != NULL; hp = hp->bh_prev) in mf_sync()
551 && hp->bh_bnum < mfp->mf_infile_count))) in mf_sync()
555 if (mf_write(mfp, hp) == FAIL) in mf_sync()
578 mfp->mf_dirty = FALSE; in mf_sync()
589 if (vim_fsync(mfp->mf_fd)) in mf_sync()
606 if (vim_fsync(mfp->mf_fd)) in mf_sync()
611 if (_commit(mfp->mf_fd)) in mf_sync()
616 if (vim_fsync(mfp->mf_fd) != 0) in mf_sync()
629 struct UFB *fp = chkufb(mfp->mf_fd); in mf_sync()
645 BPTR fh = (BPTR)fdtofh(mfp->mf_fd); in mf_sync()
652 Flush(_devtab[mfp->mf_fd].fd); in mf_sync()
670 mf_set_dirty(memfile_T *mfp) in mf_set_dirty() argument
674 for (hp = mfp->mf_used_last; hp != NULL; hp = hp->bh_prev) in mf_set_dirty()
677 mfp->mf_dirty = TRUE; in mf_set_dirty()
684 mf_ins_hash(memfile_T *mfp, bhdr_T *hp) in mf_ins_hash() argument
686 mf_hash_add_item(&mfp->mf_hash, (mf_hashitem_T *)hp); in mf_ins_hash()
693 mf_rem_hash(memfile_T *mfp, bhdr_T *hp) in mf_rem_hash() argument
695 mf_hash_rem_item(&mfp->mf_hash, (mf_hashitem_T *)hp); in mf_rem_hash()
702 mf_find_hash(memfile_T *mfp, blocknr_T nr) in mf_find_hash() argument
704 return (bhdr_T *)mf_hash_find(&mfp->mf_hash, nr); in mf_find_hash()
711 mf_ins_used(memfile_T *mfp, bhdr_T *hp) in mf_ins_used() argument
713 hp->bh_next = mfp->mf_used_first; in mf_ins_used()
714 mfp->mf_used_first = hp; in mf_ins_used()
717 mfp->mf_used_last = hp; in mf_ins_used()
720 mfp->mf_used_count += hp->bh_page_count; in mf_ins_used()
721 total_mem_used += hp->bh_page_count * mfp->mf_page_size; in mf_ins_used()
728 mf_rem_used(memfile_T *mfp, bhdr_T *hp) in mf_rem_used() argument
731 mfp->mf_used_last = hp->bh_prev; in mf_rem_used()
735 mfp->mf_used_first = hp->bh_next; in mf_rem_used()
738 mfp->mf_used_count -= hp->bh_page_count; in mf_rem_used()
739 total_mem_used -= hp->bh_page_count * mfp->mf_page_size; in mf_rem_used()
752 mf_release(memfile_T *mfp, int page_count) in mf_release() argument
766 need_release = ((mfp->mf_used_count >= mfp->mf_used_count_max) in mf_release()
773 if (mfp->mf_fd < 0 && need_release && p_uc) in mf_release()
777 if (buf->b_ml.ml_mfp == mfp) in mf_release()
791 if (mfp->mf_fd < 0 || !need_release) in mf_release()
794 for (hp = mfp->mf_used_last; hp != NULL; hp = hp->bh_prev) in mf_release()
804 if ((hp->bh_flags & BH_DIRTY) && mf_write(mfp, hp) == FAIL) in mf_release()
807 mf_rem_used(mfp, hp); in mf_release()
808 mf_rem_hash(mfp, hp); in mf_release()
817 if ((hp->bh_data = alloc(mfp->mf_page_size * page_count)) == NULL) in mf_release()
837 memfile_T *mfp; in mf_release_all() local
843 mfp = buf->b_ml.ml_mfp; in mf_release_all()
844 if (mfp != NULL) in mf_release_all()
847 if (mfp->mf_fd < 0 && buf->b_may_swap) in mf_release_all()
851 if (mfp->mf_fd >= 0) in mf_release_all()
853 for (hp = mfp->mf_used_last; hp != NULL; ) in mf_release_all()
857 || mf_write(mfp, hp) != FAIL)) in mf_release_all()
859 mf_rem_used(mfp, hp); in mf_release_all()
860 mf_rem_hash(mfp, hp); in mf_release_all()
862 hp = mfp->mf_used_last; // re-start, list was changed in mf_release_all()
878 mf_alloc_bhdr(memfile_T *mfp, int page_count) in mf_alloc_bhdr() argument
884 if ((hp->bh_data = alloc(mfp->mf_page_size * page_count)) == NULL) in mf_alloc_bhdr()
908 mf_ins_free(memfile_T *mfp, bhdr_T *hp) in mf_ins_free() argument
910 hp->bh_next = mfp->mf_free_first; in mf_ins_free()
911 mfp->mf_free_first = hp; in mf_ins_free()
919 mf_rem_free(memfile_T *mfp) in mf_rem_free() argument
923 hp = mfp->mf_free_first; in mf_rem_free()
924 mfp->mf_free_first = hp->bh_next; in mf_rem_free()
934 mf_read(memfile_T *mfp, bhdr_T *hp) in mf_read() argument
940 if (mfp->mf_fd < 0) // there is no file, can't read in mf_read()
943 page_size = mfp->mf_page_size; in mf_read()
946 if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset) in mf_read()
951 if ((unsigned)read_eintr(mfp->mf_fd, hp->bh_data, size) != size) in mf_read()
960 if (*mfp->mf_buffer->b_p_key != NUL || mfp->mf_old_key != NULL) in mf_read()
961 ml_decrypt_data(mfp, hp->bh_data, offset, size); in mf_read()
973 mf_write(memfile_T *mfp, bhdr_T *hp) in mf_write() argument
982 if (mfp->mf_fd < 0 && !mfp->mf_reopen) in mf_write()
987 if (mf_trans_add(mfp, hp) == FAIL) in mf_write()
990 page_size = mfp->mf_page_size; in mf_write()
1003 if (nr > mfp->mf_infile_count) // beyond end of file in mf_write()
1005 nr = mfp->mf_infile_count; in mf_write()
1006 hp2 = mf_find_hash(mfp, nr); // NULL caught below in mf_write()
1020 if (mfp->mf_fd >= 0) in mf_write()
1022 if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset) in mf_write()
1027 if (mf_write_block(mfp, in mf_write()
1037 if (mfp->mf_fd >= 0) in mf_write()
1038 close(mfp->mf_fd); in mf_write()
1039 mfp->mf_fd = mch_open_rw((char *)mfp->mf_fname, mfp->mf_flags); in mf_write()
1040 mfp->mf_reopen = (mfp->mf_fd < 0); in mf_write()
1042 if (attempt == 2 || mfp->mf_fd < 0) in mf_write()
1059 if (nr + (blocknr_T)page_count > mfp->mf_infile_count) in mf_write()
1060 mfp->mf_infile_count = nr + page_count; in mf_write()
1074 memfile_T *mfp, in mf_write_block() argument
1084 if (*mfp->mf_buffer->b_p_key != NUL) in mf_write_block()
1086 data = ml_encrypt_data(mfp, data, offset, size); in mf_write_block()
1092 if ((unsigned)write_eintr(mfp->mf_fd, data, size) != size) in mf_write_block()
1109 mf_trans_add(memfile_T *mfp, bhdr_T *hp) in mf_trans_add() argument
1127 freep = mfp->mf_free_first; in mf_trans_add()
1143 freep = mf_rem_free(mfp); in mf_trans_add()
1149 new_bnum = mfp->mf_blocknr_max; in mf_trans_add()
1150 mfp->mf_blocknr_max += page_count; in mf_trans_add()
1156 mf_rem_hash(mfp, hp); // remove from old hash list in mf_trans_add()
1158 mf_ins_hash(mfp, hp); // insert in new hash list in mf_trans_add()
1161 mf_hash_add_item(&mfp->mf_trans, (mf_hashitem_T *)np); in mf_trans_add()
1172 mf_trans_del(memfile_T *mfp, blocknr_T old_nr) in mf_trans_del() argument
1177 np = (NR_TRANS *)mf_hash_find(&mfp->mf_trans, old_nr); in mf_trans_del()
1182 mfp->mf_neg_count--; in mf_trans_del()
1186 mf_hash_rem_item(&mfp->mf_trans, (mf_hashitem_T *)np); in mf_trans_del()
1199 mf_set_ffname(memfile_T *mfp) in mf_set_ffname() argument
1201 mfp->mf_ffname = FullName_save(mfp->mf_fname, FALSE); in mf_set_ffname()
1209 mf_fullname(memfile_T *mfp) in mf_fullname() argument
1211 if (mfp != NULL && mfp->mf_fname != NULL && mfp->mf_ffname != NULL) in mf_fullname()
1213 vim_free(mfp->mf_fname); in mf_fullname()
1214 mfp->mf_fname = mfp->mf_ffname; in mf_fullname()
1215 mfp->mf_ffname = NULL; in mf_fullname()
1223 mf_need_trans(memfile_T *mfp) in mf_need_trans() argument
1225 return (mfp->mf_fname != NULL && mfp->mf_neg_count > 0); in mf_need_trans()
1235 memfile_T *mfp, in mf_do_open() argument
1243 mfp->mf_fname = fname; in mf_do_open()
1250 mf_set_ffname(mfp); in mf_do_open()
1256 mf_fullname(mfp); in mf_do_open()
1264 if ((flags & O_CREAT) && mch_lstat((char *)mfp->mf_fname, &sb) >= 0) in mf_do_open()
1266 mfp->mf_fd = -1; in mf_do_open()
1282 mfp->mf_flags = flags; in mf_do_open()
1283 mfp->mf_fd = mch_open_rw((char *)mfp->mf_fname, flags); in mf_do_open()
1289 if (mfp->mf_fd < 0) in mf_do_open()
1291 VIM_CLEAR(mfp->mf_fname); in mf_do_open()
1292 VIM_CLEAR(mfp->mf_ffname); in mf_do_open()
1297 int fdflags = fcntl(mfp->mf_fd, F_GETFD); in mf_do_open()
1299 (void)fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC); in mf_do_open()
1302 mch_copy_sec(fname, mfp->mf_fname); in mf_do_open()
1304 mch_hide(mfp->mf_fname); // try setting the 'hidden' flag in mf_do_open()