diff --git a/pkg/urbit/hashtable_tests b/pkg/urbit/hashtable_tests deleted file mode 100755 index 7706a8208..000000000 Binary files a/pkg/urbit/hashtable_tests and /dev/null differ diff --git a/pkg/urbit/include/c/motes.h b/pkg/urbit/include/c/motes.h index 240086ec9..fea3ebf2f 100644 --- a/pkg/urbit/include/c/motes.h +++ b/pkg/urbit/include/c/motes.h @@ -1236,6 +1236,7 @@ # define c3__werp c3_s4('w','e','r','p') # define c3__west c3_s4('w','e','s','t') # define c3__what c3_s4('w','h','a','t') +# define c3__whey c3_s4('w','h','e','y') # define c3__whom c3_s4('w','h','o','m') # define c3__wing c3_s4('w','i','n','g') # define c3__wild c3_s4('w','i','l','d') diff --git a/pkg/urbit/worker/main.c b/pkg/urbit/worker/main.c index 2ce271337..428e22a9a 100644 --- a/pkg/urbit/worker/main.c +++ b/pkg/urbit/worker/main.c @@ -340,6 +340,7 @@ _cw_grab(c3_i argc, c3_c* argv[]) c3_c* dir_c = argv[2]; u3m_boot(dir_c); + u3C.wag_w |= u3o_hashless; u3_serf_grab(); u3m_stop(); } @@ -422,6 +423,7 @@ _cw_meld(c3_i argc, c3_c* argv[]) c3_c* dir_c = argv[2]; + u3C.wag_w |= u3o_hashless; u3m_boot(dir_c); u3_serf_grab(); diff --git a/pkg/urbit/worker/serf.c b/pkg/urbit/worker/serf.c index 79fab1fc6..3e005a750 100644 --- a/pkg/urbit/worker/serf.c +++ b/pkg/urbit/worker/serf.c @@ -183,11 +183,11 @@ _serf_prof(FILE* fil_u, c3_w den, u3_noun mas) /* _serf_grab(): garbage collect, checking for profiling. RETAIN. */ static void -_serf_grab(u3_serf* sef_u) +_serf_grab(u3_noun sac) { - if ( u3_nul == sef_u->sac) { + if ( u3_nul == sac) { if ( u3C.wag_w & (u3o_debug_ram | u3o_check_corrupt) ) { - u3m_grab(sef_u->sac, u3_none); + u3m_grab(sac, u3_none); } } else { @@ -225,9 +225,9 @@ _serf_grab(u3_serf* sef_u) c3_assert( u3R == &(u3H->rod_u) ); fprintf(fil_u, "\r\n"); - tot_w += u3a_maid(fil_u, "total userspace", _serf_prof(fil_u, 0, sef_u->sac)); + tot_w += u3a_maid(fil_u, "total userspace", _serf_prof(fil_u, 0, sac)); tot_w += u3m_mark(fil_u); - tot_w += u3a_maid(fil_u, "space profile", u3a_mark_noun(sef_u->sac)); + tot_w += u3a_maid(fil_u, "space profile", u3a_mark_noun(sac)); u3a_print_memory(fil_u, "total marked", tot_w); u3a_print_memory(fil_u, "free lists", u3a_idle(u3R)); @@ -241,8 +241,7 @@ _serf_grab(u3_serf* sef_u) } #endif - u3z(sef_u->sac); - sef_u->sac = u3_nul; + u3z(sac); u3l_log("\n"); } @@ -253,13 +252,49 @@ _serf_grab(u3_serf* sef_u) void u3_serf_grab(void) { + u3_noun sac = u3_nul; + c3_assert( u3R == &(u3H->rod_u) ); + { + u3_noun sam, gon; + + { + u3_noun pax = u3nc(c3__whey, u3_nul); + u3_noun lyc = u3nc(u3_nul, u3_nul); + sam = u3nt(lyc, c3n, u3nq(c3__once, u3_blip, u3_blip, pax)); + } + + gon = u3m_soft(0, u3v_peek, sam); + + { + u3_noun tag, dat, val; + u3x_cell(gon, &tag, &dat); + + if ( (u3_blip == tag) + && (u3_nul != dat) + && (c3y == u3r_pq(u3t(dat), c3__omen, 0, &val)) + && (c3y == u3r_p(val, c3__mass, &sac)) ) + { + u3k(sac); + } + } + + u3z(gon); + } + fprintf(stderr, "serf: measuring memory:\r\n"); - u3a_print_memory(stderr, "total marked", u3m_mark(stderr)); - u3a_print_memory(stderr, "free lists", u3a_idle(u3R)); - u3a_print_memory(stderr, "sweep", u3a_sweep()); - fprintf(stderr, "\r\n"); + + if ( u3_nul != sac ) { + _serf_grab(sac); + } + else { + u3a_print_memory(stderr, "total marked", u3m_mark(stderr)); + u3a_print_memory(stderr, "free lists", u3a_idle(u3R)); + u3a_print_memory(stderr, "sweep", u3a_sweep()); + fprintf(stderr, "\r\n"); + } + fflush(stderr); } @@ -276,7 +311,8 @@ u3_serf_post(u3_serf* sef_u) // XX this runs on replay too, |mass s/b elsewhere // if ( c3y == sef_u->mut_o ) { - _serf_grab(sef_u); + _serf_grab(sef_u->sac); + sef_u->sac = u3_nul; sef_u->mut_o = c3n; }