mirror of
https://github.com/urbit/shrub.git
synced 2025-01-03 10:02:32 +03:00
Convert road markers to relative pointers.
This commit is contained in:
parent
f3b19abeb6
commit
c7b4917a75
70
g/a.c
70
g/a.c
@ -124,15 +124,16 @@ _me_road_all_hat(c3_w len_w)
|
||||
}
|
||||
|
||||
if ( u3_yes == u3_co_is_north(u3R) ) {
|
||||
c3_w* all_w;
|
||||
u3_post all_p;
|
||||
|
||||
all_w = u3R->hat_w;
|
||||
u3R->hat_w += len_w;
|
||||
return all_w;
|
||||
all_p = u3R->hat_p;
|
||||
u3R->hat_p += len_w;
|
||||
|
||||
return u3_co_into(all_p);
|
||||
}
|
||||
else {
|
||||
u3R->hat_w -= len_w;
|
||||
return u3R->hat_w;
|
||||
u3R->hat_p -= len_w;
|
||||
return u3_co_into(u3R->hat_p);
|
||||
}
|
||||
}
|
||||
|
||||
@ -147,15 +148,15 @@ _me_road_all_cap(c3_w len_w)
|
||||
}
|
||||
|
||||
if ( u3_yes == u3_co_is_north(u3R) ) {
|
||||
u3R->cap_w -= len_w;
|
||||
return u3R->cap_w;
|
||||
u3R->cap_p -= len_w;
|
||||
return u3_co_into(u3R->cap_p);
|
||||
}
|
||||
else {
|
||||
c3_w* all_w;
|
||||
u3_post all_p;
|
||||
|
||||
all_w = u3R->cap_w;
|
||||
u3R->cap_w += len_w;
|
||||
return all_w;
|
||||
all_p = u3R->cap_p;
|
||||
u3R->cap_p += len_w;
|
||||
return u3_co_into(all_p);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -213,7 +214,7 @@ _ca_walloc(c3_w len_w)
|
||||
break;
|
||||
}
|
||||
else {
|
||||
/* Nothing in top free list. Chip away at the hat_w.
|
||||
/* Nothing in top free list. Chip away at the hat.
|
||||
*/
|
||||
return u3_co_boxto(_box_make(_me_road_all_hat(siz_w), siz_w, 1));
|
||||
}
|
||||
@ -278,7 +279,7 @@ _ca_walloc(c3_w len_w)
|
||||
|
||||
int FOO;
|
||||
|
||||
/* u3_ca_walloc(): allocate storage words on hat_w.
|
||||
/* u3_ca_walloc(): allocate storage words on hat.
|
||||
*/
|
||||
void*
|
||||
u3_ca_walloc(c3_w len_w)
|
||||
@ -372,7 +373,7 @@ u3_ca_free(void* tox_v)
|
||||
if ( u3_yes == u3_co_is_north(u3R) ) {
|
||||
/* Try to coalesce with the block below.
|
||||
*/
|
||||
if ( box_w != u3R->rut_w ) {
|
||||
if ( box_w != u3_co_into(u3R->rut_p) ) {
|
||||
c3_w laz_w = *(box_w - 1);
|
||||
u3_cs_box* pox_u = (u3_cs_box*)(void *)(box_w - laz_w);
|
||||
|
||||
@ -387,8 +388,8 @@ u3_ca_free(void* tox_v)
|
||||
|
||||
/* Try to coalesce with the block above, or the wilderness.
|
||||
*/
|
||||
if ( (box_w + box_u->siz_w) == u3R->hat_w ) {
|
||||
u3R->hat_w = box_w;
|
||||
if ( (box_w + box_u->siz_w) == u3_co_into(u3R->hat_p) ) {
|
||||
u3R->hat_p = u3_co_outa(box_w);
|
||||
}
|
||||
else {
|
||||
u3_cs_box* nox_u = (u3_cs_box*)(void *)(box_w + box_u->siz_w);
|
||||
@ -403,7 +404,7 @@ u3_ca_free(void* tox_v)
|
||||
else {
|
||||
/* Try to coalesce with the block above.
|
||||
*/
|
||||
if ( (box_w + box_u->siz_w) != u3R->rut_w ) {
|
||||
if ( (box_w + box_u->siz_w) != u3_co_into(u3R->rut_p) ) {
|
||||
u3_cs_box* nox_u = (u3_cs_box*)(void *)(box_w + box_u->siz_w);
|
||||
|
||||
if ( 0 == nox_u->use_w ) {
|
||||
@ -414,8 +415,8 @@ u3_ca_free(void* tox_v)
|
||||
|
||||
/* Try to coalesce with the block below, or with the wilderness.
|
||||
*/
|
||||
if ( box_w == u3R->hat_w ) {
|
||||
u3R->hat_w = (box_w + box_u->siz_w);
|
||||
if ( box_w == u3_co_into(u3R->hat_p) ) {
|
||||
u3R->hat_p = u3_co_outa(box_w + box_u->siz_w);
|
||||
}
|
||||
else {
|
||||
c3_w laz_w = *(box_w - 1);
|
||||
@ -1031,12 +1032,16 @@ c3_w
|
||||
u3_ca_mark_ptr(void* ptr_v)
|
||||
{
|
||||
if ( u3_so(u3_co_is_north(u3R)) ) {
|
||||
if ( !((ptr_v >= (void*)u3R->rut_w) && (ptr_v < (void*)u3R->hat_w)) ) {
|
||||
if ( !((ptr_v >= u3_co_into(u3R->rut_p)) &&
|
||||
(ptr_v < u3_co_into(u3R->hat_p))) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ( !((ptr_v >= (void*)u3R->hat_w) && (ptr_v < (void*)u3R->rut_w)) ) {
|
||||
if ( !((ptr_v >= u3_co_into(u3R->hat_p)) &&
|
||||
(ptr_v < u3_co_into(u3R->rut_p))) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -1150,8 +1155,8 @@ u3_ca_sweep(c3_c* cap_c)
|
||||
c3_w i_w;
|
||||
|
||||
end_w = u3_so(u3_co_is_north(u3R))
|
||||
? (u3R->hat_w - u3R->rut_w)
|
||||
: (u3R->rut_w - u3R->hat_w);
|
||||
? (u3R->hat_p - u3R->rut_p)
|
||||
: (u3R->rut_p - u3R->hat_p);
|
||||
|
||||
for ( i_w = 0; i_w < u3_cc_fbox_no; i_w++ ) {
|
||||
u3p(u3_cs_fbox) fre_p = u3R->all.fre_p[i_w];
|
||||
@ -1170,10 +1175,13 @@ u3_ca_sweep(c3_c* cap_c)
|
||||
*/
|
||||
pos_w = leq_w = weq_w = 0;
|
||||
{
|
||||
c3_w* box_w = u3_so(u3_co_is_north(u3R)) ? u3R->rut_w : u3R->hat_w;
|
||||
u3_post box_p = u3_so(u3_co_is_north(u3R)) ? u3R->rut_p : u3R->hat_p;
|
||||
u3_post end_p = u3_so(u3_co_is_north(u3R)) ? u3R->hat_p : u3R->rut_p;
|
||||
c3_w* box_w = u3_co_into(box_p);
|
||||
c3_w* end_w = u3_co_into(end_p);
|
||||
|
||||
while ( box_w < (u3_so(u3_co_is_north(u3R)) ? u3R->hat_w : u3R->rut_w) ) {
|
||||
u3_cs_box* box_u = (void *)box_w;
|
||||
while ( box_w < end_w ) {
|
||||
u3_cs_box* box_u = (void *)box_w;
|
||||
|
||||
#ifdef U3_MEMORY_DEBUG
|
||||
if ( box_u->use_w != box_u->eus_w ) {
|
||||
@ -1231,11 +1239,11 @@ u3_ca_sweep(c3_c* cap_c)
|
||||
}
|
||||
|
||||
tot_w = u3_so(u3_co_is_north(u3R))
|
||||
? u3R->mat_w - u3R->rut_w
|
||||
: u3R->rut_w - u3R->mat_w;
|
||||
? u3R->mat_p - u3R->rut_p
|
||||
: u3R->rut_p - u3R->mat_p;
|
||||
caf_w = u3_so(u3_co_is_north(u3R))
|
||||
? u3R->mat_w - u3R->cap_w
|
||||
: u3R->cap_w - u3R->mat_w;
|
||||
? u3R->mat_p - u3R->cap_p
|
||||
: u3R->cap_p - u3R->mat_p;
|
||||
|
||||
// u3_ca_print_memory("available", (tot_w - pos_w));
|
||||
// u3_ca_print_memory("allocated", pos_w);
|
||||
|
72
g/m.c
72
g/m.c
@ -117,8 +117,8 @@ static void
|
||||
_cm_signal_reset(void)
|
||||
{
|
||||
u3R = &u3H->rod_u;
|
||||
u3R->cap_w = u3R->mat_w;
|
||||
u3R->ear_w = 0;
|
||||
u3R->cap_p = u3R->mat_p;
|
||||
u3R->ear_p = 0;
|
||||
u3R->kid_u = 0;
|
||||
}
|
||||
|
||||
@ -305,11 +305,11 @@ _boot_north(c3_w* mem_w, c3_w siz_w, c3_w len_w)
|
||||
// memset(mem_w, 0, 4 * len_w); // enable in case of corruption
|
||||
memset(rod_u, 0, 4 * siz_w);
|
||||
|
||||
rod_u->rut_w = rut_w;
|
||||
rod_u->hat_w = hat_w;
|
||||
rod_u->rut_p = u3of(c3_w, rut_w);
|
||||
rod_u->hat_p = u3of(c3_w, hat_w);
|
||||
|
||||
rod_u->mat_w = mat_w;
|
||||
rod_u->cap_w = cap_w;
|
||||
rod_u->mat_p = u3of(c3_w, mat_w);
|
||||
rod_u->cap_p = u3of(c3_w, cap_w);
|
||||
|
||||
return rod_u;
|
||||
}
|
||||
@ -328,12 +328,12 @@ _boot_south(c3_w* mem_w, c3_w siz_w, c3_w len_w)
|
||||
// memset(mem_w, 0, 4 * len_w); // enable in case of corruption
|
||||
memset(rod_u, 0, 4 * siz_w);
|
||||
|
||||
rod_u->rut_w = rut_w;
|
||||
rod_u->hat_w = hat_w;
|
||||
rod_u->rut_p = u3of(c3_w, rut_w);
|
||||
rod_u->hat_p = u3of(c3_w, hat_w);
|
||||
|
||||
rod_u->mat_p = u3of(c3_w, mat_w);
|
||||
rod_u->cap_p = u3of(c3_w, cap_w);
|
||||
|
||||
rod_u->mat_w = mat_w;
|
||||
rod_u->cap_w = cap_w;
|
||||
|
||||
return rod_u;
|
||||
}
|
||||
|
||||
@ -572,29 +572,29 @@ u3_cm_leap(c3_w pad_w)
|
||||
/* Allocate a region on the cap.
|
||||
*/
|
||||
{
|
||||
c3_w* bot_w;
|
||||
u3p(c3_w) bot_p;
|
||||
|
||||
if ( u3_yes == u3_co_is_north(u3R) ) {
|
||||
bot_w = (u3R->cap_w - len_w);
|
||||
u3R->cap_w -= len_w;
|
||||
bot_p = (u3R->cap_p - len_w);
|
||||
u3R->cap_p -= len_w;
|
||||
|
||||
rod_u = _boot_south(bot_w, c3_wiseof(u3_cs_road), len_w);
|
||||
rod_u = _boot_south(u3_co_into(bot_p), c3_wiseof(u3_cs_road), len_w);
|
||||
#if 0
|
||||
fprintf(stderr, "leap: from north %p (cap %p), to south %p\r\n",
|
||||
fprintf(stderr, "leap: from north %p (cap %x), to south %p\r\n",
|
||||
u3R,
|
||||
u3R->cap_w + len_w,
|
||||
u3R->cap_p + len_p,
|
||||
rod_u);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
bot_w = u3R->cap_w;
|
||||
u3R->cap_w += len_w;
|
||||
bot_p = u3R->cap_p;
|
||||
u3R->cap_p += len_w;
|
||||
|
||||
rod_u = _boot_north(bot_w, c3_wiseof(u3_cs_road), len_w);
|
||||
rod_u = _boot_north(u3_co_into(bot_p), c3_wiseof(u3_cs_road), len_w);
|
||||
#if 0
|
||||
fprintf(stderr, "leap: from north %p (cap %p), to south %p\r\n",
|
||||
u3R,
|
||||
u3R->cap_w - len_w,
|
||||
u3R->cap_p - len_p,
|
||||
rod_u);
|
||||
#endif
|
||||
}
|
||||
@ -638,7 +638,7 @@ u3_cm_fall()
|
||||
|
||||
/* The new cap is the old hat - it's as simple as that.
|
||||
*/
|
||||
u3R->par_u->cap_w = u3R->hat_w;
|
||||
u3R->par_u->cap_p = u3R->hat_p;
|
||||
|
||||
/* And, we're back home.
|
||||
*/
|
||||
@ -651,9 +651,9 @@ u3_cm_fall()
|
||||
void
|
||||
u3_cm_hate(c3_w pad_w)
|
||||
{
|
||||
c3_assert(0 == u3R->ear_w);
|
||||
c3_assert(0 == u3R->ear_p);
|
||||
|
||||
u3R->ear_w = u3R->cap_w;
|
||||
u3R->ear_p = u3R->cap_p;
|
||||
u3_cm_leap(pad_w);
|
||||
}
|
||||
|
||||
@ -671,26 +671,26 @@ u3_cm_love(u3_noun pro)
|
||||
|
||||
u3_cj_reap(das, har_u);
|
||||
|
||||
u3R->cap_w = u3R->ear_w;
|
||||
u3R->ear_w = 0;
|
||||
u3R->cap_p = u3R->ear_p;
|
||||
u3R->ear_p = 0;
|
||||
|
||||
return pro;
|
||||
}
|
||||
|
||||
/* u3_cm_golf(): record cap_w length for u3_flog().
|
||||
/* u3_cm_golf(): record cap_p length for u3_flog().
|
||||
*/
|
||||
c3_w
|
||||
u3_cm_golf(void)
|
||||
{
|
||||
if ( u3_yes == u3_co_is_north(u3R) ) {
|
||||
return u3R->mat_w - u3R->cap_w;
|
||||
return u3R->mat_p - u3R->cap_p;
|
||||
}
|
||||
else {
|
||||
return u3R->cap_w - u3R->mat_w;
|
||||
return u3R->cap_p - u3R->mat_p;
|
||||
}
|
||||
}
|
||||
|
||||
/* u3_cm_flog(): reset cap_w.
|
||||
/* u3_cm_flog(): reset cap_p.
|
||||
*/
|
||||
void
|
||||
u3_cm_flog(c3_w gof_w)
|
||||
@ -698,18 +698,18 @@ u3_cm_flog(c3_w gof_w)
|
||||
// Enable memsets in case of memory corruption.
|
||||
//
|
||||
if ( u3_yes == u3_co_is_north(u3R) ) {
|
||||
c3_w* bot_w = (u3R->mat_w - gof_w);
|
||||
u3_post bot_p = (u3R->mat_p - gof_w);
|
||||
// c3_w len_w = (bot_w - u3R->cap_w);
|
||||
|
||||
// memset(u3R->cap_w, 0, 4 * len_w);
|
||||
u3R->cap_w = bot_w;
|
||||
u3R->cap_p = bot_p;
|
||||
}
|
||||
else {
|
||||
c3_w* bot_w = u3R->mat_w + gof_w;
|
||||
u3_post bot_p = u3R->mat_p + gof_w;
|
||||
// c3_w len_w = (u3R->cap_w - bot_w);
|
||||
|
||||
// memset(bot_w, 0, 4 * len_w); //
|
||||
u3R->cap_w = bot_w;
|
||||
u3R->cap_p = bot_p;
|
||||
}
|
||||
}
|
||||
|
||||
@ -720,8 +720,8 @@ u3_cm_water(c3_w* low_w, c3_w* hig_w)
|
||||
{
|
||||
c3_assert(u3R == &u3H->rod_u);
|
||||
|
||||
*low_w = (u3H->rod_u.hat_w - u3H->rod_u.rut_w);
|
||||
*hig_w = (u3H->rod_u.mat_w - u3H->rod_u.cap_w) + c3_wiseof(u3_cs_home);
|
||||
*low_w = (u3H->rod_u.hat_p - u3H->rod_u.rut_p);
|
||||
*hig_w = (u3H->rod_u.mat_p - u3H->rod_u.cap_p) + c3_wiseof(u3_cs_home);
|
||||
}
|
||||
|
||||
/* u3_cm_soft_top(): top-level safety wrapper.
|
||||
|
@ -125,11 +125,11 @@
|
||||
struct _u3_cs_road* nex_u; // sibling road
|
||||
struct _u3_cs_road* now_u; // current road pointer
|
||||
|
||||
c3_w* cap_w; // top of transient region
|
||||
c3_w* hat_w; // top of durable region
|
||||
c3_w* mat_w; // bottom of transient region
|
||||
c3_w* rut_w; // bottom of durable region
|
||||
c3_w* ear_w; // original cap if kid is live
|
||||
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
|
||||
|
||||
@ -192,32 +192,32 @@
|
||||
# define u3to(type, x) ((type *) u3_co_into(x))
|
||||
# define u3of(type, x) (u3_co_outa((type *)x))
|
||||
|
||||
# define u3_co_is_north(r) ((r->cap_w > r->hat_w) ? u3_yes : u3_no)
|
||||
# define u3_co_is_north(r) ((r->cap_p > r->hat_p) ? u3_yes : u3_no)
|
||||
# define u3_co_is_south(r) ((u3_so(u3_co_is_north(r))) ? u3_no : u3_yes)
|
||||
|
||||
# define u3_co_open(r) ( (u3_yes == u3_co_is_north(r)) \
|
||||
? (c3_w)(r->cap_w - r->hat_w) \
|
||||
: (c3_w)(r->hat_w - r->cap_w) )
|
||||
? (c3_w)(r->cap_p - r->hat_p) \
|
||||
: (c3_w)(r->hat_p - r->cap_p) )
|
||||
|
||||
# define u3_co_north_is_senior(r, dog) \
|
||||
u3_say((u3_co_to_wtr(dog) < r->rut_w) || \
|
||||
(u3_co_to_wtr(dog) >= r->mat_w))
|
||||
u3_say((u3_co_to_off(dog) < r->rut_p) || \
|
||||
(u3_co_to_off(dog) >= r->mat_p))
|
||||
|
||||
# define u3_co_north_is_junior(r, dog) \
|
||||
u3_say((u3_co_to_wtr(dog) >= r->cap_w) && \
|
||||
(u3_co_to_wtr(dog) < r->mat_w))
|
||||
u3_say((u3_co_to_off(dog) >= r->cap_p) && \
|
||||
(u3_co_to_off(dog) < r->mat_p))
|
||||
|
||||
# define u3_co_north_is_normal(r, dog) \
|
||||
u3_and(u3_not(u3_co_north_is_senior(r, dog)), \
|
||||
u3_not(u3_co_north_is_junior(r, dog)))
|
||||
|
||||
# define u3_co_south_is_senior(r, dog) \
|
||||
u3_say((u3_co_to_wtr(dog) < r->mat_w) || \
|
||||
(u3_co_to_wtr(dog) >= r->rut_w))
|
||||
u3_say((u3_co_to_off(dog) < r->mat_p) || \
|
||||
(u3_co_to_off(dog) >= r->rut_p))
|
||||
|
||||
# define u3_co_south_is_junior(r, dog) \
|
||||
u3_say((u3_co_to_wtr(dog) < r->cap_w) && \
|
||||
(u3_co_to_wtr(dog) >= r->mat_w))
|
||||
u3_say((u3_co_to_off(dog) < r->cap_p) && \
|
||||
(u3_co_to_off(dog) >= r->mat_p))
|
||||
|
||||
# define u3_co_south_is_normal(r, dog) \
|
||||
u3_and(u3_not(u3_co_south_is_senior(r, dog)), \
|
||||
|
Loading…
Reference in New Issue
Block a user