Various fixes and improvements.

This commit is contained in:
C. Guy Yarvin 2014-11-15 17:10:15 -08:00
parent f3fba50144
commit dfbd88b7b9
13 changed files with 372 additions and 356 deletions

View File

@ -125,8 +125,8 @@
} all; } all;
struct { // jet dashboard struct { // jet dashboard
u3p(u3h_root) har_p; // jet index (old style) u3p(u3h_root) har_p; // warm state
u3_noun das; // dashboard (new style) u3_noun das; // cold state
} jed; } jed;
struct { // namespace struct { // namespace

11
i/n/e.h
View File

@ -40,7 +40,7 @@
/* u3e_pool: entire memory system. /* u3e_pool: entire memory system.
*/ */
typedef struct _u3e_pool { typedef struct _u3e_pool {
c3_c* cpu_c; // path to c3_c* dir_c; // path to
c3_d evt_d; // last patch written at event c3_d evt_d; // last patch written at event
c3_w dit_w[u3a_pages >> 5]; // touched since last save c3_w dit_w[u3a_pages >> 5]; // touched since last save
u3e_image nor_u; // north segment u3e_image nor_u; // north segment
@ -68,10 +68,15 @@
void void
u3e_save(void); u3e_save(void);
/* u3e_boot(): start the memory system. /* u3e_live(): start the persistence system.
*/
void
u3e_live(c3_o nuu_o, c3_c* dir_c);
/* u3e_boot(): start the u3 system.
*/ */
void void
u3e_boot(c3_o nuu_o, c3_o bug_o, c3_c* cpu_c); u3e_boot(c3_o nuu_o, c3_o bug_o, c3_c* dir_c);
/* u3e_init(): start the environment, with/without checkpointing. /* u3e_init(): start the environment, with/without checkpointing.
*/ */

57
i/n/j.h
View File

@ -9,12 +9,18 @@
++ bash ,@uvH :: ctx identity hash ++ bash ,@uvH :: ctx identity hash
++ bosh ,@uvH :: local battery hash ++ bosh ,@uvH :: local battery hash
++ batt ,* :: battery ++ batt ,* :: battery
++ calx :: cached by battery ++ calf ::
$: jax=,@ud :: jet index $: jax=,@ud :: jet index
pax=,@ud :: parent axis or 0 pax=,@ud :: parent axis or 0
hap=(map ,@ud ,@ud) :: axis/jet hap=(map ,@ud ,@ud) :: axis/jet
huc=(map term nock) :: name/tool
== :: == ::
++ calx (trel calf ,* (map term nock)) :: cached by battery
++ chum $? lef=term :: jet name
[std=term kel=@] :: kelvin version
[ven=term pro=term kel=@] :: vendor and product
[ven=term pro=term ver=@ kel=@] :: all of the above
== ::
++ clue ,[p=chum q=nock r=(list (pair term nock))] :: battery definition
++ clog (pair cope (map batt (map term nock))) :: identity record ++ clog (pair cope (map batt (map term nock))) :: identity record
++ cope (trel bane axis (each bash noun)) :: core pattern ++ cope (trel bane axis (each bash noun)) :: core pattern
++ dash :: jet system ++ dash :: jet system
@ -60,39 +66,35 @@
/** Data structures. /** Data structures.
*** ***
*** All of these are transient structures allocated with malloc. *** All of these are process structures on the heap or data segment.
**/ **/
/* u3j_harm: jet arm. /* u3j_harm: jet arm.
*/ */
typedef struct _u3j_harm { typedef struct _u3j_harm {
c3_c* fcs_c; // `.axe` or name c3_c* fcs_c; // `.axe` or name
u3_noun (*fun_f)(u3_noun); // compute or 0 / semitransfer u3_noun (*fun_f)(u3_noun); // compute or 0 / semitransfer
// c3_o (*val_f)(u3_noun); // validate or 0 / retain c3_o ice; // perfect (don't test)
c3_o ice; // perfect (don't test) c3_o tot; // total (never punts)
c3_o tot; // total (never punts) c3_o liv; // live (enabled)
c3_o liv; // live (enabled)
c3_l axe_l; // computed/discovered axis
struct _u3j_core* cop_u; // containing core
} u3j_harm; } u3j_harm;
/* u3j_core: driver definition. /* u3j_core: driver definition.
*/ */
typedef struct _u3j_core { typedef struct _u3j_core {
c3_c* cos_c; // control string c3_c* cos_c; // control string
struct _u3j_harm* arm_u; // blank-terminated static list struct _u3j_harm* arm_u; // blank-terminated static list
struct _u3j_core* dev_u; // blank-terminated static list struct _u3j_core* dev_u; // blank-terminated static list
struct _u3j_core* par_u; // dynamic parent pointer struct _u3j_core* par_u; // initialized parent pointer
c3_l axe_l; // axis to parent c3_l jax_l; // initialized jet index
c3_l jax_l; // index in global dashboard
} u3j_core; } u3j_core;
/* u3e_dash, u3_Dash, u3D: jet dashboard singleton /* u3e_dash, u3_Dash, u3D: jet dashboard singleton
*/ */
typedef struct _u3e_dash { typedef struct _u3e_dash {
u3j_core* dev_u; // null-terminated static list u3j_core* dev_u; // null-terminated static list
c3_l len_l; // dynamic array length c3_l len_l; // dynamic array length
c3_l all_l; // allocated length c3_l all_l; // allocated length
u3j_core* ray_u; // dynamic array by axis u3j_core* ray_u; // dynamic array by axis
} u3j_dash; } u3j_dash;
/** Globals. /** Globals.
@ -110,11 +112,6 @@
void void
u3j_boot(void); u3j_boot(void);
/* u3j_clear(): clear jet table to re-register.
*/
void
u3j_clear(void);
/* u3j_hook(): /* u3j_hook():
** **
** Execute hook from core. ** Execute hook from core.
@ -145,19 +142,17 @@
*/ */
u3_weak u3_weak
u3j_kick(u3_noun cor, u3j_kick(u3_noun cor,
u3_noun axe); u3_noun axe);
/* u3j_kink(): kick either by jet or by nock. /* u3j_kink(): kick either by jet or by nock.
*/ */
u3_noun u3_noun
u3j_kink(u3_noun cor, u3j_kink(u3_noun cor, u3_noun axe);
u3_noun axe);
/* u3j_mine(): register core for jets. /* u3j_mine(): register core for jets.
*/ */
void void
u3j_mine(u3_noun clu, u3j_mine(u3_noun clu, u3_noun cor);
u3_noun cor);
/* u3j_ream(): refresh after restoring from checkpoint. /* u3j_ream(): refresh after restoring from checkpoint.
*/ */

90
i/n/m.h
View File

@ -4,24 +4,10 @@
*/ */
/** System management. /** System management.
**/ **/
/* u3m_boot(): set up top-level road. /* u3m_boot(): start the u3 system.
*/ */
void void
u3m_boot(c3_o nuu_o, c3_o bug_o); u3m_boot(c3_o nuu_o, c3_o bug_o, c3_c* dir_c);
/* u3m_trap(): setjmp within road.
*/
#if 0
c3_o
u3m_trap(void);
#else
# define u3m_trap() (u3_noun)(setjmp(u3R->esc.buf))
#endif
/* u3m_signal(): treat a nock-level exception as a signal interrupt.
*/
void
u3m_signal(u3_noun sig_l);
/* u3m_bail(): bail out. Does not return. /* u3m_bail(): bail out. Does not return.
** **
@ -34,45 +20,22 @@
** %foul :: assert failure ** %foul :: assert failure
** %need :: network block ** %need :: network block
** %meme :: out of memory ** %meme :: out of memory
** %time :: timed out
** %oops :: assertion failure
*/ */
c3_i c3_i
u3m_bail(c3_m how_m); u3m_bail(c3_m how_m);
/* u3m_dump(): dump the current road to stderr.
*/
void
u3m_dump(void);
/* u3m_file(): load file, as atom, or bail. /* u3m_file(): load file, as atom, or bail.
*/ */
u3_noun u3_noun
u3m_file(c3_c* pas_c); u3m_file(c3_c* pas_c);
/* u3m_clear(): clear all allocated data in road.
*/
void
u3m_clear(void);
/* u3m_mark(): mark all nouns in the road.
*/
void
u3m_mark(void);
/* u3m_error(): bail out with %exit, ct_pushing error. /* u3m_error(): bail out with %exit, ct_pushing error.
*/ */
c3_i c3_i
u3m_error(c3_c* str_c); u3m_error(c3_c* str_c);
/* u3m_check(): checkpoint memory to file. Asserts u3R == u3H.
*/
void
u3m_check(void);
/* u3m_fall(): return to parent road.
*/
void
u3m_fall(void);
/* u3m_hate(): new, integrated leap mechanism (enter). /* u3m_hate(): new, integrated leap mechanism (enter).
*/ */
void void
@ -83,32 +46,6 @@
u3_noun u3_noun
u3m_love(u3_noun pro); u3m_love(u3_noun pro);
/* u3m_leap(): in u3R, create a new road within the existing one.
*/
void
u3m_leap(c3_w pad_w);
/* u3m_golf(): record cap length for u3_flog().
*/
c3_w
u3m_golf(void);
/* u3m_flog(): pop the cap.
**
** A common sequence for inner allocation is:
**
** c3_w gof_w = u3m_golf();
** u3m_leap();
** // allocate some inner stuff...
** u3m_fall();
** // inner stuff is still valid, but on cap
** u3m_flog(gof_w);
**
** u3m_flog(0) simply clears the cap.
*/
void
u3m_flog(c3_w gof_w);
/* u3m_soft(): system soft wrapper. unifies unix and nock errors. /* u3m_soft(): system soft wrapper. unifies unix and nock errors.
** **
** Produces [%$ result] or [%error (list tank)]. ** Produces [%$ result] or [%error (list tank)].
@ -116,19 +53,16 @@
u3_noun u3_noun
u3m_soft(c3_w sec_w, u3_funk fun_f, u3_noun arg); u3m_soft(c3_w sec_w, u3_funk fun_f, u3_noun arg);
/* u3m_soft_top(): top-level safety wrapper.
*/
u3_noun
u3m_soft_top(c3_w sec_w, // timer seconds
c3_w pad_w, // base memory pad
u3_funk fun_f,
u3_noun arg);
/* u3m_soft_slam: top-level call. /* u3m_soft_slam: top-level call.
*/ */
u3_noun u3_noun
u3m_soft_slam(u3_noun gat, u3_noun sam); u3m_soft_slam(u3_noun gat, u3_noun sam);
/* u3m_soft_nock: top-level nock.
*/
u3_noun
u3m_soft_nock(u3_noun bus, u3_noun fol);
/* u3m_soft_sure(): top-level call assumed correct. /* u3m_soft_sure(): top-level call assumed correct.
*/ */
u3_noun u3_noun
@ -138,9 +72,9 @@
*/ */
u3_noun u3_noun
u3m_soft_run(u3_noun fly, u3m_soft_run(u3_noun fly,
u3_funq fun_f, u3_funq fun_f,
u3_noun aga, u3_noun aga,
u3_noun agb); u3_noun agb);
/* u3m_soft_esc(): namespace lookup to (unit ,*). /* u3m_soft_esc(): namespace lookup to (unit ,*).
*/ */

View File

@ -537,8 +537,7 @@
*/ */
typedef struct _u3_host { typedef struct _u3_host {
c3_w kno_w; // current executing stage c3_w kno_w; // current executing stage
c3_c* cpu_c; // computer path c3_c* dir_c; // pier path
c3_d now_d; // event tick c3_d now_d; // event tick
uv_loop_t* lup_u; // libuv event loop uv_loop_t* lup_u; // libuv event loop
u3_http* htp_u; // http servers u3_http* htp_u; // http servers

View File

@ -36,8 +36,7 @@
} }
} }
u3_noun u3_noun
u3wdb_get( u3wdb_get(u3_noun cor)
u3_noun cor)
{ {
u3_noun a, b; u3_noun a, b;

202
n/e.c
View File

@ -5,9 +5,6 @@
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sigsegv.h>
#include <pmmintrin.h>
#include <xmmintrin.h>
#include "all.h" #include "all.h"
@ -168,16 +165,16 @@ _ce_image_open(u3e_image* img_u, c3_o nuu_o)
c3_i mod_i = _(nuu_o) ? (O_RDWR | O_CREAT) : O_RDWR; c3_i mod_i = _(nuu_o) ? (O_RDWR | O_CREAT) : O_RDWR;
c3_c ful_c[8193]; c3_c ful_c[8193];
snprintf(ful_c, 8192, "%s", u3P.cpu_c); snprintf(ful_c, 8192, "%s", u3P.dir_c);
mkdir(ful_c, 0700); mkdir(ful_c, 0700);
snprintf(ful_c, 8192, "%s/.urb", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb", u3P.dir_c);
mkdir(ful_c, 0700); mkdir(ful_c, 0700);
snprintf(ful_c, 8192, "%s/.urb/chk", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb/chk", u3P.dir_c);
mkdir(ful_c, 0700); mkdir(ful_c, 0700);
snprintf(ful_c, 8192, "%s/.urb/chk/%s.bin", u3P.cpu_c, img_u->nam_c); snprintf(ful_c, 8192, "%s/.urb/chk/%s.bin", u3P.dir_c, img_u->nam_c);
if ( -1 == (img_u->fid_i = open(ful_c, mod_i, 0666)) ) { if ( -1 == (img_u->fid_i = open(ful_c, mod_i, 0666)) ) {
perror(ful_c); perror(ful_c);
return c3n; return c3n;
@ -266,18 +263,18 @@ _ce_patch_create(u3_ce_patch* pat_u)
{ {
c3_c ful_c[8193]; c3_c ful_c[8193];
snprintf(ful_c, 8192, "%s", u3P.cpu_c); snprintf(ful_c, 8192, "%s", u3P.dir_c);
mkdir(ful_c, 0700); mkdir(ful_c, 0700);
snprintf(ful_c, 8192, "%s/.urb", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb", u3P.dir_c);
mkdir(ful_c, 0700); mkdir(ful_c, 0700);
snprintf(ful_c, 8192, "%s/.urb/chk/control.bin", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb/chk/control.bin", u3P.dir_c);
if ( -1 == (pat_u->ctl_i = open(ful_c, O_RDWR | O_CREAT | O_EXCL, 0666)) ) { if ( -1 == (pat_u->ctl_i = open(ful_c, O_RDWR | O_CREAT | O_EXCL, 0666)) ) {
c3_assert(0); c3_assert(0);
} }
snprintf(ful_c, 8192, "%s/.urb/chk/memory.bin", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb/chk/memory.bin", u3P.dir_c);
if ( -1 == (pat_u->mem_i = open(ful_c, O_RDWR | O_CREAT | O_EXCL, 0666)) ) { if ( -1 == (pat_u->mem_i = open(ful_c, O_RDWR | O_CREAT | O_EXCL, 0666)) ) {
c3_assert(0); c3_assert(0);
} }
@ -290,10 +287,10 @@ _ce_patch_delete(void)
{ {
c3_c ful_c[8193]; c3_c ful_c[8193];
snprintf(ful_c, 8192, "%s/.urb/chk/control.bin", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb/chk/control.bin", u3P.dir_c);
unlink(ful_c); unlink(ful_c);
snprintf(ful_c, 8192, "%s/.urb/chk/memory.bin", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb/chk/memory.bin", u3P.dir_c);
unlink(ful_c); unlink(ful_c);
} }
@ -358,18 +355,18 @@ _ce_patch_open(void)
c3_c ful_c[8193]; c3_c ful_c[8193];
c3_i ctl_i, mem_i; c3_i ctl_i, mem_i;
snprintf(ful_c, 8192, "%s", u3P.cpu_c); snprintf(ful_c, 8192, "%s", u3P.dir_c);
mkdir(ful_c, 0700); mkdir(ful_c, 0700);
snprintf(ful_c, 8192, "%s/.urb", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb", u3P.dir_c);
mkdir(ful_c, 0700); mkdir(ful_c, 0700);
snprintf(ful_c, 8192, "%s/.urb/chk/control.bin", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb/chk/control.bin", u3P.dir_c);
if ( -1 == (ctl_i = open(ful_c, O_RDWR)) ) { if ( -1 == (ctl_i = open(ful_c, O_RDWR)) ) {
return 0; return 0;
} }
snprintf(ful_c, 8192, "%s/.urb/chk/memory.bin", u3P.cpu_c); snprintf(ful_c, 8192, "%s/.urb/chk/memory.bin", u3P.dir_c);
if ( -1 == (mem_i = open(ful_c, O_RDWR)) ) { if ( -1 == (mem_i = open(ful_c, O_RDWR)) ) {
close(ctl_i); close(ctl_i);
@ -808,149 +805,12 @@ u3e_save(void)
_ce_patch_free(pat_u); _ce_patch_free(pat_u);
} }
/* _ce_limits(): set up global modes and limits. /* u3e_live(): start the persistence system.
*/
static void
_ce_limits(void)
{
struct rlimit rlm;
c3_i ret_i;
/* Set compatible floating-point modes.
*/
{
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
}
/* Moar stack.
*/
{
ret_i = getrlimit(RLIMIT_STACK, &rlm);
c3_assert(0 == ret_i);
rlm.rlim_cur = (rlm.rlim_max > (65536 << 10))
? (65536 << 10)
: rlm.rlim_max;
if ( 0 != setrlimit(RLIMIT_STACK, &rlm) ) {
perror("stack");
exit(1);
}
}
/* Moar filez.
*/
{
ret_i = getrlimit(RLIMIT_NOFILE, &rlm);
c3_assert(0 == ret_i);
rlm.rlim_cur = 4096;
if ( 0 != setrlimit(RLIMIT_NOFILE, &rlm) ) {
perror("file limit");
// no exit, not a critical limit
}
}
/* Moar core.
*/
{
getrlimit(RLIMIT_CORE, &rlm);
rlm.rlim_cur = RLIM_INFINITY;
if ( 0 != setrlimit(RLIMIT_CORE, &rlm) ) {
perror("core limit");
// no exit, not a critical limit
}
}
}
/* _ce_signals(): set up interrupts, etc.
*/
static void
_ce_signals(void)
{
if ( 0 != sigsegv_install_handler(u3e_fault) ) {
fprintf(stderr, "sigsegv install failed\n");
exit(1);
}
// signal(SIGINT, _loom_stop);
}
/* u3e_init(): start the environment, with/without checkpointing.
*/ */
void void
u3e_init(c3_o chk_o) u3e_live(c3_o nuu_o, c3_c* dir_c)
{ {
_ce_limits(); u3P.dir_c = dir_c;
_ce_signals();
/* Make sure GMP uses our malloc.
*/
mp_set_memory_functions(u3a_malloc, u3a_realloc2, u3a_free2);
/* Map at fixed address.
*/
{
c3_w len_w = u3a_bytes;
void* map_v;
map_v = mmap((void *)u3_Loom,
len_w,
_(chk_o) ? PROT_READ : (PROT_READ | PROT_WRITE),
(MAP_ANON | MAP_FIXED | MAP_PRIVATE),
-1, 0);
if ( -1 == (c3_ps)map_v ) {
map_v = mmap((void *)0,
len_w,
PROT_READ,
MAP_ANON | MAP_PRIVATE,
-1, 0);
if ( -1 == (c3_ps)map_v ) {
fprintf(stderr, "boot: map failed twice\r\n");
} else {
fprintf(stderr, "boot: map failed - try U3_OS_LoomBase %p\r\n", map_v);
}
exit(1);
}
printf("loom: mapped %dMB\r\n", len_w >> 20);
}
}
/* u3e_grab(): garbage-collect the world, plus extra roots, then
*/
void
u3e_grab(c3_c* cap_c, u3_noun som, ...) // terminate with u3_none
{
// u3h_free(u3R->cax.har_p);
// u3R->cax.har_p = u3h_new();
u3v_mark();
u3m_mark();
{
va_list vap;
u3_noun tur;
va_start(vap, som);
if ( som != u3_none ) {
u3a_mark_noun(som);
while ( u3_none != (tur = va_arg(vap, u3_noun)) ) {
u3a_mark_noun(tur);
}
}
va_end(vap);
}
u3a_sweep(cap_c);
}
/* u3e_boot(): start the u3 system.
*/
void
u3e_boot(c3_o nuu_o, c3_o bug_o, c3_c* cpu_c)
{
u3e_init(nuu_o);
u3P.cpu_c = cpu_c;
u3P.nor_u.nam_c = "north"; u3P.nor_u.nam_c = "north";
u3P.sou_u.nam_c = "south"; u3P.sou_u.nam_c = "south";
@ -1019,32 +879,4 @@ u3e_boot(c3_o nuu_o, c3_o bug_o, c3_c* cpu_c)
nuu_o = c3y; nuu_o = c3y;
} }
} }
/* Construct or activate the allocator.
*/
u3m_boot(nuu_o, bug_o);
/* Initialize the jet system.
*/
u3j_boot();
/* Install the kernel.
*/
if ( _(nuu_o) ) {
c3_c pas_c[2049];
struct stat buf_u;
snprintf(pas_c, 2048, "%s/.urb/urbit.pill", cpu_c);
if ( -1 == stat(pas_c, &buf_u) ) {
snprintf(pas_c, 2048, "%s/urbit.pill", U3_LIB);
}
printf("boot: loading %s\r\n", pas_c);
u3v_make(pas_c);
u3v_jack();
}
else {
u3v_hose();
u3j_ream();
}
} }

14
n/j.c
View File

@ -355,12 +355,12 @@ _cj_warm_hump(c3_l jax_l, u3_noun huc)
return hap; return hap;
} }
/* _cj_boil_mean(): in parent, declare a core. RETAINS. /* _cj_hot_mean(): in parent, declare a core. RETAINS.
** **
** XX bat is used only for printing, remove. ** XX bat is used only for printing, remove.
*/ */
static c3_l static c3_l
_cj_boil_mean(c3_l par_l, u3_noun mop, u3_noun bat) _cj_hot_mean(c3_l par_l, u3_noun mop, u3_noun bat)
{ {
u3j_core* par_u; u3j_core* par_u;
u3j_core* dev_u; u3j_core* dev_u;
@ -395,10 +395,10 @@ _cj_boil_mean(c3_l par_l, u3_noun mop, u3_noun bat)
return 0; return 0;
} }
/* _cj_boil_mine(): in boiling state, declare a core. RETAINS. /* _cj_hot_mine(): in boiling state, declare a core. RETAINS.
*/ */
static c3_l static c3_l
_cj_boil_mine(u3_noun mop, u3_noun cor) _cj_hot_mine(u3_noun mop, u3_noun cor)
{ {
u3_noun p_mop, q_mop, r_mop, hr_mop, tr_mop; u3_noun p_mop, q_mop, r_mop, hr_mop, tr_mop;
@ -417,7 +417,7 @@ _cj_boil_mine(u3_noun mop, u3_noun cor)
} }
else par_l = 0; else par_l = 0;
return _cj_boil_mean(par_l, mop, u3h(cor)); return _cj_hot_mean(par_l, mop, u3h(cor));
} }
} }
@ -498,7 +498,7 @@ _cj_warm_ream_at(u3_noun soh, u3_noun cag)
} }
else par_l = 0; else par_l = 0;
jax_l = _cj_boil_mean(par_l, mop, 0); jax_l = _cj_hot_mean(par_l, mop, 0);
_cj_warm_ream_is(jax_l, q_mop, sab); _cj_warm_ream_is(jax_l, q_mop, sab);
return jax_l; return jax_l;
@ -569,7 +569,7 @@ _cj_warm_mine(u3_noun clu, u3_noun cor)
u3_noun mop; u3_noun mop;
if ( u3_none != (mop = _cj_cold_mine(cey, cor)) ) { if ( u3_none != (mop = _cj_cold_mine(cey, cor)) ) {
c3_l jax_l = _cj_boil_mine(mop, cor); c3_l jax_l = _cj_hot_mine(mop, cor);
// fprintf(stderr, "warm: bat %x\r\n", u3r_mug(bat)); // fprintf(stderr, "warm: bat %x\r\n", u3r_mug(bat));
u3h_put(u3R->jed.har_p, u3h_put(u3R->jed.har_p,

286
n/m.c
View File

@ -7,9 +7,75 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <ctype.h> #include <ctype.h>
#include <sigsegv.h> #include <sigsegv.h>
#include <pmmintrin.h>
#include <xmmintrin.h>
#include "all.h" #include "all.h"
/* (u3_noun)setjmp(u3R->esc.buf): setjmp within road.
*/
#if 0
c3_o
u3m_trap(void);
#else
# define u3m_trap() (u3_noun)(setjmp(u3R->esc.buf))
#endif
/* u3m_signal(): treat a nock-level exception as a signal interrupt.
*/
void
u3m_signal(u3_noun sig_l);
/* u3m_dump(): dump the current road to stderr.
*/
void
u3m_dump(void);
/* u3m_mark(): mark all nouns in the road.
*/
void
u3m_mark(void);
/* u3m_fall(): return to parent road.
*/
void
u3m_fall(void);
/* u3m_leap(): in u3R, create a new road within the existing one.
*/
void
u3m_leap(c3_w pad_w);
/* u3m_golf(): record cap length for u3_flog().
*/
c3_w
u3m_golf(void);
/* u3m_flog(): pop the cap.
**
** A common sequence for inner allocation is:
**
** c3_w gof_w = u3m_golf();
** u3m_leap();
** // allocate some inner stuff...
** u3m_fall();
** // inner stuff is still valid, but on cap
** u3m_flog(gof_w);
**
** u3m_flog(0) simply clears the cap.
*/
void
u3m_flog(c3_w gof_w);
/* u3m_soft_top(): top-level safety wrapper.
*/
u3_noun
u3m_soft_top(c3_w sec_w, // timer seconds
c3_w pad_w, // base memory pad
u3_funk fun_f,
u3_noun arg);
static jmp_buf u3_Signal; static jmp_buf u3_Signal;
#ifndef SIGSTKSZ #ifndef SIGSTKSZ
@ -294,7 +360,7 @@ _find_south(c3_w* mem_w, c3_w siz_w, c3_w len_w)
#endif #endif
static u3_road* static u3_road*
_boot_north(c3_w* mem_w, c3_w siz_w, c3_w len_w) _pave_north(c3_w* mem_w, c3_w siz_w, c3_w len_w)
{ {
c3_w* rut_w = mem_w; c3_w* rut_w = mem_w;
c3_w* hat_w = rut_w; c3_w* hat_w = rut_w;
@ -314,10 +380,10 @@ _boot_north(c3_w* mem_w, c3_w siz_w, c3_w len_w)
return rod_u; return rod_u;
} }
/* _boot_south(): install a south road. /* _pave_south(): install a south road.
*/ */
static u3_road* static u3_road*
_boot_south(c3_w* mem_w, c3_w siz_w, c3_w len_w) _pave_south(c3_w* mem_w, c3_w siz_w, c3_w len_w)
{ {
c3_w* rut_w = (mem_w + len_w); c3_w* rut_w = (mem_w + len_w);
c3_w* hat_w = rut_w; c3_w* hat_w = rut_w;
@ -337,10 +403,10 @@ _boot_south(c3_w* mem_w, c3_w siz_w, c3_w len_w)
return rod_u; return rod_u;
} }
/* _boot_parts(): build internal tables. /* _pave_parts(): build internal tables.
*/ */
static void static void
_boot_parts(void) _pave_parts(void)
{ {
u3R->cax.har_p = u3h_new(); u3R->cax.har_p = u3h_new();
u3R->jed.har_p = u3h_new(); u3R->jed.har_p = u3h_new();
@ -362,18 +428,18 @@ u3m_mark(void)
u3h_mark(u3R->cax.har_p); u3h_mark(u3R->cax.har_p);
} }
/* u3m_boot(): instantiate or activate image. /* _cm_pave(): instantiate or activate image.
*/ */
void static void
u3m_boot(c3_o nuu_o, c3_o bug_o) _cm_pave(c3_o nuu_o, c3_o bug_o)
{ {
if ( c3y == nuu_o ) { if ( c3y == nuu_o ) {
u3H = (void *)_boot_north(u3_Loom + 1, u3H = (void *)_pave_north(u3_Loom + 1,
c3_wiseof(u3v_home), c3_wiseof(u3v_home),
u3a_words - 1); u3a_words - 1);
u3R = &u3H->rod_u; u3R = &u3H->rod_u;
_boot_parts(); _pave_parts();
} }
else { else {
u3H = (void *)_find_north(u3_Loom + 1, u3H = (void *)_find_north(u3_Loom + 1,
@ -387,6 +453,7 @@ u3m_boot(c3_o nuu_o, c3_o bug_o)
} }
} }
#if 0
/* u3m_clear(): clear all allocated data in road. /* u3m_clear(): clear all allocated data in road.
*/ */
void void
@ -397,7 +464,6 @@ u3m_clear(void)
u3a_lose(u3R->jed.das); u3a_lose(u3R->jed.das);
} }
#if 0
void void
u3m_dump(void) u3m_dump(void)
{ {
@ -578,7 +644,7 @@ u3m_leap(c3_w pad_w)
bot_p = (u3R->cap_p - len_w); bot_p = (u3R->cap_p - len_w);
u3R->cap_p -= len_w; u3R->cap_p -= len_w;
rod_u = _boot_south(u3a_into(bot_p), c3_wiseof(u3a_road), len_w); rod_u = _pave_south(u3a_into(bot_p), c3_wiseof(u3a_road), len_w);
#if 0 #if 0
fprintf(stderr, "leap: from north %p (cap %x), to south %p\r\n", fprintf(stderr, "leap: from north %p (cap %x), to south %p\r\n",
u3R, u3R,
@ -590,7 +656,7 @@ u3m_leap(c3_w pad_w)
bot_p = u3R->cap_p; bot_p = u3R->cap_p;
u3R->cap_p += len_w; u3R->cap_p += len_w;
rod_u = _boot_north(u3a_into(bot_p), c3_wiseof(u3a_road), len_w); rod_u = _pave_north(u3a_into(bot_p), c3_wiseof(u3a_road), len_w);
#if 0 #if 0
fprintf(stderr, "leap: from north %p (cap %p), to south %p\r\n", fprintf(stderr, "leap: from north %p (cap %p), to south %p\r\n",
u3R, u3R,
@ -615,7 +681,7 @@ u3m_leap(c3_w pad_w)
rod_u->how.fag_w |= u3a_flag_debug; rod_u->how.fag_w |= u3a_flag_debug;
} }
u3R = rod_u; u3R = rod_u;
_boot_parts(); _pave_parts();
} }
} }
@ -755,7 +821,7 @@ u3m_soft_top(c3_w sec_w, // timer seconds
/* Trap for ordinary nock exceptions. /* Trap for ordinary nock exceptions.
*/ */
if ( 0 == (why = u3m_trap()) ) { if ( 0 == (why = (u3_noun)setjmp(u3R->esc.buf)) ) {
pro = fun_f(arg); pro = fun_f(arg);
/* Make sure the inner routine did not create garbage. /* Make sure the inner routine did not create garbage.
@ -814,6 +880,15 @@ u3m_soft_slam(u3_noun gat, u3_noun sam)
return u3m_soft_sure(_cm_slam, u3nc(gat, sam)); return u3m_soft_sure(_cm_slam, u3nc(gat, sam));
} }
/* u3m_soft_nock: top-level nock.
*/
u3_noun _cm_nock(u3_noun arg) { return u3n_nock_on(u3h(arg), u3t(arg)); }
u3_noun
u3m_soft_nock(u3_noun bus, u3_noun fol)
{
return u3m_soft_sure(_cm_nock, u3nc(bus, fol));
}
/* u3m_soft_run(): descend into virtualization context. /* u3m_soft_run(): descend into virtualization context.
*/ */
u3_noun u3_noun
@ -838,7 +913,7 @@ u3m_soft_run(u3_noun fly,
/* Trap for exceptions. /* Trap for exceptions.
*/ */
if ( 0 == (why = u3m_trap()) ) { if ( 0 == (why = (u3_noun)setjmp(u3R->esc.buf)) ) {
pro = fun_f(aga, agb); pro = fun_f(aga, agb);
if ( u3R->how.fag_w & u3a_flag_debug ) { if ( u3R->how.fag_w & u3a_flag_debug ) {
@ -926,7 +1001,7 @@ u3m_soft_esc(u3_noun sam)
/* Trap for exceptions. /* Trap for exceptions.
*/ */
if ( 0 == (why = u3m_trap()) ) { if ( 0 == (why = (u3_noun)setjmp(u3R->esc.buf)) ) {
pro = u3n_slam_on(fly, sam); pro = u3n_slam_on(fly, sam);
/* Fall back to the old road, leaving temporary memory intact. /* Fall back to the old road, leaving temporary memory intact.
@ -1189,3 +1264,180 @@ u3m_wall(u3_noun wol)
} }
u3z(wol); u3z(wol);
} }
/* _cm_limits(): set up global modes and limits.
*/
static void
_cm_limits(void)
{
struct rlimit rlm;
c3_i ret_i;
/* Set compatible floating-point modes.
*/
{
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
}
/* Moar stack.
*/
{
ret_i = getrlimit(RLIMIT_STACK, &rlm);
c3_assert(0 == ret_i);
rlm.rlim_cur = (rlm.rlim_max > (65536 << 10))
? (65536 << 10)
: rlm.rlim_max;
if ( 0 != setrlimit(RLIMIT_STACK, &rlm) ) {
perror("stack");
exit(1);
}
}
/* Moar filez.
*/
{
ret_i = getrlimit(RLIMIT_NOFILE, &rlm);
c3_assert(0 == ret_i);
rlm.rlim_cur = 4096;
if ( 0 != setrlimit(RLIMIT_NOFILE, &rlm) ) {
perror("file limit");
// no exit, not a critical limit
}
}
/* Moar core.
*/
{
getrlimit(RLIMIT_CORE, &rlm);
rlm.rlim_cur = RLIM_INFINITY;
if ( 0 != setrlimit(RLIMIT_CORE, &rlm) ) {
perror("core limit");
// no exit, not a critical limit
}
}
}
/* _cm_signals(): set up interrupts, etc.
*/
static void
_cm_signals(void)
{
if ( 0 != sigsegv_install_handler(u3e_fault) ) {
fprintf(stderr, "sigsegv install failed\n");
exit(1);
}
// signal(SIGINT, _loom_stop);
}
/* _cm_init(): start the environment, with/without checkpointing.
*/
void
_cm_init(c3_o chk_o)
{
_cm_limits();
_cm_signals();
/* Make sure GMP uses our malloc.
*/
mp_set_memory_functions(u3a_malloc, u3a_realloc2, u3a_free2);
/* Map at fixed address.
*/
{
c3_w len_w = u3a_bytes;
void* map_v;
map_v = mmap((void *)u3_Loom,
len_w,
_(chk_o) ? PROT_READ : (PROT_READ | PROT_WRITE),
(MAP_ANON | MAP_FIXED | MAP_PRIVATE),
-1, 0);
if ( -1 == (c3_ps)map_v ) {
map_v = mmap((void *)0,
len_w,
PROT_READ,
MAP_ANON | MAP_PRIVATE,
-1, 0);
if ( -1 == (c3_ps)map_v ) {
fprintf(stderr, "boot: map failed twice\r\n");
} else {
fprintf(stderr, "boot: map failed - try U3_OS_LoomBase %p\r\n", map_v);
}
exit(1);
}
printf("loom: mapped %dMB\r\n", len_w >> 20);
}
}
/* u3e_grab(): garbage-collect the world, plus extra roots, then
*/
void
u3e_grab(c3_c* cap_c, u3_noun som, ...) // terminate with u3_none
{
// u3h_free(u3R->cax.har_p);
// u3R->cax.har_p = u3h_new();
u3v_mark();
u3m_mark();
{
va_list vap;
u3_noun tur;
va_start(vap, som);
if ( som != u3_none ) {
u3a_mark_noun(som);
while ( u3_none != (tur = va_arg(vap, u3_noun)) ) {
u3a_mark_noun(tur);
}
}
va_end(vap);
}
u3a_sweep(cap_c);
}
/* u3m_boot(): start the u3 system.
*/
void
u3m_boot(c3_o nuu_o, c3_o bug_o, c3_c* dir_c)
{
/* Activate the loom.
*/
_cm_init(nuu_o);
/* Activate the storage system.
*/
u3e_live(nuu_o, dir_c);
/* Construct or activate the allocator.
*/
_cm_pave(nuu_o, bug_o);
/* Initialize the jet system.
*/
u3j_boot();
/* Install or reactivate the kernel.
*/
if ( _(nuu_o) ) {
c3_c pas_c[2049];
struct stat buf_u;
snprintf(pas_c, 2048, "%s/.urb/urbit.pill", dir_c);
if ( -1 == stat(pas_c, &buf_u) ) {
snprintf(pas_c, 2048, "%s/urbit.pill", U3_LIB);
}
printf("boot: loading %s\r\n", pas_c);
u3v_make(pas_c);
u3v_jack();
}
else {
u3v_hose();
u3j_ream();
}
}

View File

@ -164,7 +164,7 @@ _main_getopt(c3_i argc, c3_c** argv)
} }
} }
u3_Host.cpu_c = strdup(argv[optind]); u3_Host.dir_c = strdup(argv[optind]);
return c3y; return c3y;
} }
} }
@ -195,7 +195,7 @@ u3_ve_panic(c3_i argc, c3_c** argv)
static void static void
u3_ve_sysopt() u3_ve_sysopt()
{ {
u3_Local = strdup(u3_Host.cpu_c); u3_Local = strdup(u3_Host.dir_c);
u3_System = U3_LIB; u3_System = U3_LIB;
u3_Flag_Abort = u3_Host.ops_u.abo; u3_Flag_Abort = u3_Host.ops_u.abo;
u3_Flag_Garbage = u3_Host.ops_u.gab; u3_Flag_Garbage = u3_Host.ops_u.gab;
@ -294,7 +294,7 @@ main(c3_i argc,
printf("~\n"); printf("~\n");
printf("welcome.\n"); printf("welcome.\n");
printf("vere: urbit home is %s\n", u3_Host.cpu_c); printf("vere: urbit home is %s\n", u3_Host.dir_c);
printf("vere: hostname is %s\n", u3_Host.ops_u.nam_c); printf("vere: hostname is %s\n", u3_Host.ops_u.nam_c);
if ( c3y == u3_Host.ops_u.dem && c3n == u3_Host.ops_u.bat ) { if ( c3y == u3_Host.ops_u.dem && c3n == u3_Host.ops_u.bat ) {
@ -309,7 +309,7 @@ main(c3_i argc,
{ {
/* Boot the image and checkpoint. /* Boot the image and checkpoint.
*/ */
u3e_boot(u3_Host.ops_u.nuu, u3_Host.ops_u.gab, u3_Host.cpu_c); u3m_boot(u3_Host.ops_u.nuu, u3_Host.ops_u.gab, u3_Host.dir_c);
/* Start Arvo. /* Start Arvo.
*/ */

View File

@ -100,7 +100,7 @@ u3_sist_put(const c3_c* key_c, const c3_y* val_y, size_t siz_i)
c3_i ret_i; c3_i ret_i;
c3_i fid_i; c3_i fid_i;
ret_i = snprintf(ful_c, 2048, "%s/.urb/sis/_%s", u3_Host.cpu_c, key_c); ret_i = snprintf(ful_c, 2048, "%s/.urb/sis/_%s", u3_Host.dir_c, key_c);
c3_assert(ret_i < 2048); c3_assert(ret_i < 2048);
if ( (fid_i = open(ful_c, O_CREAT | O_TRUNC | O_WRONLY, 0600)) < 0 ) { if ( (fid_i = open(ful_c, O_CREAT | O_TRUNC | O_WRONLY, 0600)) < 0 ) {
@ -132,7 +132,7 @@ u3_sist_has(const c3_c* key_c)
c3_i ret_i; c3_i ret_i;
struct stat sat_u; struct stat sat_u;
ret_i = snprintf(ful_c, 2048, "%s/.urb/sis/_%s", u3_Host.cpu_c, key_c); ret_i = snprintf(ful_c, 2048, "%s/.urb/sis/_%s", u3_Host.dir_c, key_c);
c3_assert(ret_i < 2048); c3_assert(ret_i < 2048);
if ( (ret_i = stat(ful_c, &sat_u)) < 0 ) { if ( (ret_i = stat(ful_c, &sat_u)) < 0 ) {
@ -161,7 +161,7 @@ u3_sist_get(const c3_c* key_c, c3_y* val_y)
c3_i fid_i; c3_i fid_i;
struct stat sat_u; struct stat sat_u;
ret_i = snprintf(ful_c, 2048, "%s/.urb/sis/_%s", u3_Host.cpu_c, key_c); ret_i = snprintf(ful_c, 2048, "%s/.urb/sis/_%s", u3_Host.dir_c, key_c);
c3_assert(ret_i < 2048); c3_assert(ret_i < 2048);
if ( (fid_i = open(ful_c, O_RDONLY)) < 0 ) { if ( (fid_i = open(ful_c, O_RDONLY)) < 0 ) {
@ -193,7 +193,7 @@ u3_sist_nil(const c3_c* key_c)
c3_c ful_c[2048]; c3_c ful_c[2048];
c3_i ret_i; c3_i ret_i;
ret_i = snprintf(ful_c, 2048, "%s/.urb/sis/_%s", u3_Host.cpu_c, key_c); ret_i = snprintf(ful_c, 2048, "%s/.urb/sis/_%s", u3_Host.dir_c, key_c);
c3_assert(ret_i < 2048); c3_assert(ret_i < 2048);
if ( (ret_i = unlink(ful_c)) < 0 ) { if ( (ret_i = unlink(ful_c)) < 0 ) {
@ -281,24 +281,24 @@ _sist_home()
// Create subdirectories. // Create subdirectories.
// //
{ {
mkdir(u3_Host.cpu_c, 0700); mkdir(u3_Host.dir_c, 0700);
snprintf(ful_c, 2048, "%s/.urb", u3_Host.cpu_c); snprintf(ful_c, 2048, "%s/.urb", u3_Host.dir_c);
mkdir(ful_c, 0700); mkdir(ful_c, 0700);
snprintf(ful_c, 2048, "%s/.urb/get", u3_Host.cpu_c); snprintf(ful_c, 2048, "%s/.urb/get", u3_Host.dir_c);
if ( 0 != mkdir(ful_c, 0700) ) { if ( 0 != mkdir(ful_c, 0700) ) {
perror(ful_c); perror(ful_c);
u3_lo_bail(); u3_lo_bail();
} }
snprintf(ful_c, 2048, "%s/.urb/put", u3_Host.cpu_c); snprintf(ful_c, 2048, "%s/.urb/put", u3_Host.dir_c);
if ( 0 != mkdir(ful_c, 0700) ) { if ( 0 != mkdir(ful_c, 0700) ) {
perror(ful_c); perror(ful_c);
u3_lo_bail(); u3_lo_bail();
} }
snprintf(ful_c, 2048, "%s/.urb/sis", u3_Host.cpu_c); snprintf(ful_c, 2048, "%s/.urb/sis", u3_Host.dir_c);
if ( 0 != mkdir(ful_c, 0700) ) { if ( 0 != mkdir(ful_c, 0700) ) {
perror(ful_c); perror(ful_c);
u3_lo_bail(); u3_lo_bail();
@ -309,7 +309,7 @@ _sist_home()
// //
{ {
snprintf(ful_c, 2048, "cp %s/urbit.pill %s/.urb", snprintf(ful_c, 2048, "cp %s/urbit.pill %s/.urb",
U3_LIB, u3_Host.cpu_c); U3_LIB, u3_Host.dir_c);
printf("%s\r\n", ful_c); printf("%s\r\n", ful_c);
if ( 0 != system(ful_c) ) { if ( 0 != system(ful_c) ) {
uL(fprintf(uH, "could not %s\n", ful_c)); uL(fprintf(uH, "could not %s\n", ful_c));
@ -322,7 +322,7 @@ _sist_home()
// //
if ( u3_Host.ops_u.imp_c ) { if ( u3_Host.ops_u.imp_c ) {
snprintf(ful_c, 2048, "cp -r %s/zod %s/%s", snprintf(ful_c, 2048, "cp -r %s/zod %s/%s",
U3_LIB, u3_Host.cpu_c, u3_Host.ops_u.imp_c+1); U3_LIB, u3_Host.dir_c, u3_Host.ops_u.imp_c+1);
printf("%s\r\n", ful_c); printf("%s\r\n", ful_c);
if ( 0 != system(ful_c) ) { if ( 0 != system(ful_c) ) {
uL(fprintf(uH, "could not %s\n", ful_c)); uL(fprintf(uH, "could not %s\n", ful_c));
@ -464,7 +464,7 @@ static void
_sist_fast(u3_noun pas, c3_l key_l) _sist_fast(u3_noun pas, c3_l key_l)
{ {
c3_c ful_c[2048]; c3_c ful_c[2048];
c3_c* hom_c = u3_Host.cpu_c; c3_c* hom_c = u3_Host.dir_c;
u3_noun gum = u3dc("scot", 'p', key_l); u3_noun gum = u3dc("scot", 'p', key_l);
c3_c* gum_c = u3r_string(gum); c3_c* gum_c = u3r_string(gum);
u3_noun yek = u3dc("scot", 'p', pas); u3_noun yek = u3dc("scot", 'p', pas);
@ -496,7 +496,7 @@ static u3_noun
_sist_staf(c3_l key_l) _sist_staf(c3_l key_l)
{ {
c3_c ful_c[2048]; c3_c ful_c[2048];
c3_c* hom_c = u3_Host.cpu_c; c3_c* hom_c = u3_Host.dir_c;
u3_noun gum = u3dc("scot", 'p', key_l); u3_noun gum = u3dc("scot", 'p', key_l);
c3_c* gum_c = u3r_string(gum); c3_c* gum_c = u3r_string(gum);
u3_noun txt; u3_noun txt;
@ -568,7 +568,7 @@ _sist_zest()
#ifdef O_DSYNC #ifdef O_DSYNC
pig_i |= O_DSYNC; pig_i |= O_DSYNC;
#endif #endif
snprintf(ful_c, 2048, "%s/.urb/egz.hope", u3_Host.cpu_c); snprintf(ful_c, 2048, "%s/.urb/egz.hope", u3_Host.dir_c);
if ( ((fid_i = open(ful_c, pig_i, 0600)) < 0) || if ( ((fid_i = open(ful_c, pig_i, 0600)) < 0) ||
(fstat(fid_i, &buf_b) < 0) ) (fstat(fid_i, &buf_b) < 0) )
@ -731,7 +731,7 @@ _sist_rest_nuu(u3_ulog* lug_u, u3_uled led_u, c3_c* old_c)
u3_lo_bail(); u3_lo_bail();
} }
ret_i = snprintf(nuu_c, 2048, "%s/.urb/ham.hope", u3_Host.cpu_c); ret_i = snprintf(nuu_c, 2048, "%s/.urb/ham.hope", u3_Host.dir_c);
c3_assert(ret_i < 2048); c3_assert(ret_i < 2048);
if ( (fud_i = open(nuu_c, O_CREAT | O_TRUNC | O_RDWR, 0600)) < 0 ) { if ( (fud_i = open(nuu_c, O_CREAT | O_TRUNC | O_RDWR, 0600)) < 0 ) {
@ -834,7 +834,7 @@ _sist_rest()
#ifdef O_DSYNC #ifdef O_DSYNC
pig_i |= O_DSYNC; pig_i |= O_DSYNC;
#endif #endif
snprintf(ful_c, 2048, "%s/.urb/egz.hope", u3_Host.cpu_c); snprintf(ful_c, 2048, "%s/.urb/egz.hope", u3_Host.dir_c);
if ( ((fid_i = open(ful_c, pig_i)) < 0) || (fstat(fid_i, &buf_b) < 0) ) { if ( ((fid_i = open(ful_c, pig_i)) < 0) || (fstat(fid_i, &buf_b) < 0) ) {
uL(fprintf(uH, "rest: can't open record (%s)\n", ful_c)); uL(fprintf(uH, "rest: can't open record (%s)\n", ful_c));
u3_lo_bail(); u3_lo_bail();
@ -904,7 +904,7 @@ _sist_rest()
u3_noun key; u3_noun key;
while ( 1 ) { while ( 1 ) {
pas = pas ? pas : _sist_cask(u3_Host.cpu_c, c3n); pas = pas ? pas : _sist_cask(u3_Host.dir_c, c3n);
key = _sist_fatt(sal_l, pas); key = _sist_fatt(sal_l, pas);
@ -1123,9 +1123,9 @@ _sist_rest()
c3_c* fil_c; c3_c* fil_c;
c3_c* who_c; c3_c* who_c;
if ( (fil_c = strrchr(u3_Host.cpu_c, '/')) ) { if ( (fil_c = strrchr(u3_Host.dir_c, '/')) ) {
fil_c++; fil_c++;
} else fil_c = u3_Host.cpu_c; } else fil_c = u3_Host.dir_c;
who = u3dc("scot", 'p', u3k(u3A->our))); who = u3dc("scot", 'p', u3k(u3A->our)));
who_c = u3r_string(who); who_c = u3r_string(who);
@ -1219,7 +1219,7 @@ u3_sist_boot(void)
if ( 0 == u3_Host.ops_u.imp_c ) { if ( 0 == u3_Host.ops_u.imp_c ) {
c3_c get_c[2049]; c3_c get_c[2049];
snprintf(get_c, 2048, "%s/.urb/get", u3_Host.cpu_c); snprintf(get_c, 2048, "%s/.urb/get", u3_Host.dir_c);
if ( 0 == access(get_c, 0) ) { if ( 0 == access(get_c, 0) ) {
uL(fprintf(uH, "pier: already built\n")); uL(fprintf(uH, "pier: already built\n"));
u3_lo_bail(); u3_lo_bail();

View File

@ -617,7 +617,7 @@ _term_it_path(u3_noun fyl, u3_noun pax)
// measure // measure
// //
len_w = strlen(u3_Host.cpu_c); len_w = strlen(u3_Host.dir_c);
{ {
u3_noun wiz = pax; u3_noun wiz = pax;
@ -630,7 +630,7 @@ _term_it_path(u3_noun fyl, u3_noun pax)
// cut // cut
// //
pas_c = c3_malloc(len_w + 1); pas_c = c3_malloc(len_w + 1);
strncpy(pas_c, u3_Host.cpu_c, len_w); strncpy(pas_c, u3_Host.dir_c, len_w);
pas_c[len_w] = '\0'; pas_c[len_w] = '\0';
{ {
u3_noun wiz = pax; u3_noun wiz = pax;

View File

@ -1026,7 +1026,7 @@ _unix_hot_gain(u3_noun who, u3_noun mek)
{ {
u3_noun hox = u3dc("scot", 'p', u3k(who)); u3_noun hox = u3dc("scot", 'p', u3k(who));
c3_c* hox_c = u3r_string(hox); c3_c* hox_c = u3r_string(hox);
c3_c* pax_c = _unix_down(u3_Host.cpu_c, hox_c + 1); c3_c* pax_c = _unix_down(u3_Host.dir_c, hox_c + 1);
DIR* rid_u = opendir(pax_c); DIR* rid_u = opendir(pax_c);
if ( !rid_u ) { if ( !rid_u ) {
@ -1527,7 +1527,7 @@ u3_unix_io_init(void)
void void
u3_unix_io_talk() u3_unix_io_talk()
{ {
u3_unix_acquire(u3_Host.cpu_c); u3_unix_acquire(u3_Host.dir_c);
u3_unix_ef_move(); u3_unix_ef_move();
uv_check_start(&u3_Host.unx_u.syn_u, _unix_ef_sync); uv_check_start(&u3_Host.unx_u.syn_u, _unix_ef_sync);
} }
@ -1538,7 +1538,7 @@ void
u3_unix_io_exit(void) u3_unix_io_exit(void)
{ {
uv_check_stop(&u3_Host.unx_u.syn_u); uv_check_stop(&u3_Host.unx_u.syn_u);
u3_unix_release(u3_Host.cpu_c); u3_unix_release(u3_Host.dir_c);
{ {
u3_uhot* hot_u; u3_uhot* hot_u;