summaryrefslogtreecommitdiff
path: root/vere/pkg/noun/events.h
blob: d9cdb509da4374f214c5df072061db45947630a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/// @file

#ifndef U3_EVENTS_H
#define U3_EVENTS_H

#include "c3/c3.h"
#include "allocate.h"
#include "version.h"

  /** Data structures.
  **/
    /* u3e_line: control line.
    */
      typedef struct _u3e_line {
        c3_w pag_w;
        c3_w has_w;
      } u3e_line;

    /* u3e_control: memory change, control file.
    */
      typedef struct _u3e_control {
        u3e_version ver_w;                  //  version number
        c3_w        has_w;                  //  control checksum
        c3_w        tot_w;                  //  new page count
        c3_w        pgs_w;                  //  number of changed pages
        u3e_line    mem_u[];                //  per page
      } u3e_control;

    /* u3_cs_patch: memory change, top level.
    */
      typedef struct _u3_cs_patch {
        c3_i         ctl_i;
        c3_i         mem_i;
        c3_w         sip_w;
        u3e_control* con_u;
      } u3_ce_patch;

    /* u3e_image: memory segment, open file.
    */
      typedef struct _u3e_image {
        c3_c* nam_c;                        //  segment name
        c3_i  fid_i;                        //  open file, or 0
        c3_w  pgs_w;                        //  length in pages
      } u3e_image;

    /* u3e_pool: entire memory system.
    */
      typedef struct _u3e_pool {
        c3_c*     dir_c;                     //  path to
        c3_i      eph_i;                     //  ephemeral file descriptor
        c3_w      dit_w[u3a_pages >> 5];     //  touched since last save
        c3_w      pag_w;                     //  number of pages (<= u3a_pages)
        c3_w      gar_w;                     //  guard page
        u3e_image img_u;                     //  image
      } u3e_pool;

    /* u3e_flaw: loom fault result.
    */
      typedef enum {
        u3e_flaw_sham = 0,                  //  bogus state
        u3e_flaw_base = 1,                  //  vm fail (mprotect)
        u3e_flaw_meme = 2,                  //  bail:meme
        u3e_flaw_good = 3                   //  handled
      } u3e_flaw;

  /** Globals.
  **/
      /// Snapshotting system.
      extern u3e_pool u3e_Pool;
#     define u3P u3e_Pool

  /** Constants.
  **/

  /** Functions.
  **/
    /* u3e_backup(): copy the snapshot from [pux_c] to [pax_c],
     * overwriting optional.
    */
      c3_o
      u3e_backup(c3_c* pux_c, c3_c* pax_c, c3_o ovw_o);

    /* u3e_fault(): handle a memory fault.
    */
      u3e_flaw
      u3e_fault(u3_post low_p, u3_post hig_p, u3_post off_p);

    /* u3e_save(): update the checkpoint.
    */
      void
      u3e_save(u3_post low_p, u3_post hig_p);

    /* u3e_toss(): discard ephemeral pages.
    */
      void
      u3e_toss(u3_post low_p, u3_post hig_p);

    /* u3e_live(): start the persistence system.  Return c3y if no image.
    */
      c3_o
      u3e_live(c3_o nuu_o, c3_c* dir_c);

    /* u3e_stop(): gracefully stop the persistence system.
    */
      void
      u3e_stop(void);

    /* u3e_yolo(): disable dirty page tracking, read/write whole loom.
    */
      c3_o
      u3e_yolo(void);

    /* u3e_foul(): dirty all the pages of the loom.
    */
      void
      u3e_foul(void);

    /* u3e_init(): initialize guard page tracking.
    */
      void
      u3e_init(void);

    /* u3e_ward(): reposition guard page if needed.
    */
      void
      u3e_ward(u3_post low_p, u3_post hig_p);

      c3_i
      u3e_image_open_any(c3_c* nam_c, c3_c* dir_c, c3_z* len_z);

#endif /* ifndef U3_EVENTS_H */