neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

memfile_defs.h (2655B)


      1 #pragma once
      2 
      3 #include <stdbool.h>
      4 #include <stdint.h>
      5 #include <stdlib.h>
      6 
      7 #include "nvim/map_defs.h"
      8 
      9 /// A block number.
     10 ///
     11 /// Blocks numbered from 0 upwards have been assigned a place in the actual
     12 /// file. The block number is equal to the page number in the file. The blocks
     13 /// with negative numbers are currently in memory only.
     14 typedef int64_t blocknr_T;
     15 
     16 /// A block header.
     17 ///
     18 /// There is a block header for each previously used block in the memfile.
     19 ///
     20 /// The block may be linked in the used list OR in the free list.
     21 ///
     22 /// The used list is a doubly linked list, most recently used block first.
     23 /// The blocks in the used list have a block of memory allocated.
     24 /// The free list is a single linked list, not sorted.
     25 /// The blocks in the free list have no block of memory allocated and
     26 /// the contents of the block in the file (if any) is irrelevant.
     27 typedef struct {
     28  blocknr_T bh_bnum;                 ///< key used in hash table
     29 
     30  void *bh_data;                     ///< pointer to memory (for used block)
     31  unsigned bh_page_count;            ///< number of pages in this block
     32 
     33 #define BH_DIRTY    1U
     34 #define BH_LOCKED   2U
     35  unsigned bh_flags;                 ///< BH_DIRTY or BH_LOCKED
     36 } bhdr_T;
     37 
     38 typedef enum {
     39  MF_DIRTY_NO = 0,      ///< no dirty blocks
     40  MF_DIRTY_YES,         ///< there are dirty blocks
     41  MF_DIRTY_YES_NOSYNC,  ///< there are dirty blocks, do not sync yet
     42 } mfdirty_T;
     43 
     44 /// A memory file.
     45 typedef struct {
     46  char *mf_fname;                    ///< name of the file
     47  char *mf_ffname;                   ///< idem, full path
     48  int mf_fd;                         ///< file descriptor
     49  int mf_flags;                      ///< flags used when opening this memfile
     50  bool mf_reopen;                    ///< mf_fd was closed, retry opening
     51  bhdr_T *mf_free_first;             ///< first block header in free list
     52 
     53  /// The used blocks are kept in mf_hash.
     54  /// mf_hash are used to quickly find a block in the used list.
     55  PMap(int64_t) mf_hash;
     56 
     57  /// When a block with a negative number is flushed to the file, it gets
     58  /// a positive number. Because the reference to the block is still the negative
     59  /// number, we remember the translation to the new positive number.
     60  Map(int64_t, int64_t) mf_trans;
     61 
     62  blocknr_T mf_blocknr_max;          ///< highest positive block number + 1
     63  blocknr_T mf_blocknr_min;          ///< lowest negative block number - 1
     64  blocknr_T mf_neg_count;            ///< number of negative blocks numbers
     65  blocknr_T mf_infile_count;         ///< number of pages in the file
     66  unsigned mf_page_size;             ///< number of bytes in a page
     67  mfdirty_T mf_dirty;
     68 } memfile_T;