summaryrefslogtreecommitdiff
path: root/vere/pkg/noun/v2/allocate.h
blob: 883297755871b879ea8107a8ec78bda4c7fe98a9 (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
132
133
134
#ifndef U3_ALLOCATE_V2_H
#define U3_ALLOCATE_V2_H

#include "../allocate.h"

#include "v2/manage.h"
#include "options.h"

  /**  Aliases.
  **/
#     define u3a_v2_botox        u3a_botox
#     define u3a_v2_box          u3a_box
#     define u3a_v2_cell         u3a_cell
#     define u3a_v2_fbox         u3a_fbox
#     define u3a_v2_fbox_no      u3a_fbox_no
#     define u3a_v2_free         u3a_free
#     define u3a_v2_heap         u3a_heap
#     define u3a_v2_into         u3a_into
#     define u3a_v2_is_cat       u3a_is_cat
#     define u3a_v2_is_cell      u3a_is_cell
#     define u3a_v2_is_north     u3a_is_north
#     define u3a_v2_is_pom       u3a_is_pom
#     define u3a_v2_is_pug       u3a_is_pug
#     define u3a_v2_lose         u3a_lose
#     define u3a_v2_malloc       u3a_malloc
#     define u3a_v2_minimum      u3a_minimum
#     define u3a_v2_outa         u3a_outa
#     define u3a_v2_pack_seek    u3a_pack_seek
#     define u3a_v2_rewrite      u3a_rewrite
#     define u3a_v2_rewrite_ptr  u3a_rewrite_ptr
#     define u3a_v2_rewritten    u3a_rewritten
#     define u3a_v2_to_off       u3a_to_off
#     define u3a_v2_to_ptr       u3a_to_ptr
#     define u3a_v2_to_wtr       u3a_to_wtr
#     define u3a_v2_to_pug       u3a_to_pug
#     define u3a_v2_to_pom       u3a_to_pom
#     define u3a_v2_wfree        u3a_wfree

  /**  Data structures.
  **/
    /* u3a_v2_road: contiguous allocation and execution context.
    */
      typedef struct _u3a_v2_road {
        u3p(struct _u3a_v2_road) par_p;          //  parent road
        u3p(struct _u3a_v2_road) kid_p;          //  child road list
        u3p(struct _u3a_v2_road) nex_p;          //  sibling road

        u3p(c3_w) cap_p;                      //  top of transient region
        u3p(c3_w) hat_p;                      //  top of durable region
        u3p(c3_w) mat_p;                      //  bottom of transient region
        u3p(c3_w) rut_p;                      //  bottom of durable region
        u3p(c3_w) ear_p;                      //  original cap if kid is live

        c3_w fut_w[32];                       //  futureproof buffer

        struct {                              //  escape buffer
          union {
            jmp_buf buf;
            c3_w buf_w[256];                  //  futureproofing
          };
        } esc;

        struct {                              //  miscellaneous config
          c3_w fag_w;                         //  flag bits
        } how;                                //

        struct {                                   //  allocation pools
          u3p(u3a_v2_fbox) fre_p[u3a_v2_fbox_no];  //  heap by node size log
          u3p(u3a_fbox) cel_p;                //  custom cell allocator
          c3_w fre_w;                         //  number of free words
          c3_w max_w;                         //  maximum allocated
        } all;

        u3a_jets jed;                         //  jet dashboard

        struct {                              // bytecode state
          u3p(u3h_root) har_p;                // formula->post of bytecode
        } byc;

        struct {                              //  namespace
          u3_noun gul;                        //  (list $+(* (unit (unit)))) now
        } ski;

        struct {                              //  trace stack
          u3_noun tax;                        //  (list ,*)
          u3_noun mer;                        //  emergency buffer to release
        } bug;

        struct {                              //  profile stack
          c3_d    nox_d;                      //  nock steps
          c3_d    cel_d;                      //  cell allocations
          u3_noun don;                        //  (list batt)
          u3_noun trace;                      //  (list trace)
          u3_noun day;                        //  doss, only in u3H (moveme)
        } pro;

        struct {                              //  memoization
          u3p(u3h_root) har_p;                //  (map (pair term noun) noun)
        } cax;
      } u3a_v2_road;

  /**  Globals.
  **/
      /// Current road (thread-local).
      extern u3a_v2_road* u3a_v2_Road;
#       define u3R_v2  u3a_v2_Road

  /**  Functions.
  **/
    /**  Allocation.
    **/
      /* Reference and arena control.
      */
        /* u3a_v2_mig_rewrite_compact(): rewrite pointers in ad-hoc persistent road structures.
        */
          void
          u3a_v2_mig_rewrite_compact(void);

        /* u3a_v2_rewrite_noun(): rewrite a noun for compaction.
        */
          void
          u3a_v2_rewrite_noun(u3_noun som);

        /* u3a_v2_rewritten(): rewrite a pointer for compaction.
        */
          u3_post
          u3a_v2_rewritten(u3_post som_p);

        /* u3a_v2_rewritten(): rewritten noun pointer for compaction.
        */
          u3_noun
          u3a_v2_rewritten_noun(u3_noun som);

#endif /* ifndef U3_ALLOCATE_V2_H */