Temporarily leak duplicates on intermediate roads.

This cures the 6+-minute duplicate-triggered boot times
we've seen since the previous fix in unification.
This commit is contained in:
C. Guy Yarvin 2017-05-02 16:57:59 -07:00
parent 83d0f88710
commit 1c57cdf814

View File

@ -586,6 +586,8 @@ _sang_x(u3_noun a, u3_noun b)
} }
/* _sung_one(): pick a unified pointer for identical (a) and (b). /* _sung_one(): pick a unified pointer for identical (a) and (b).
**
** Assumes exclusive access to noun memory.
*/ */
static void static void
_sung_one(u3_noun* a, u3_noun* b) _sung_one(u3_noun* a, u3_noun* b)
@ -609,40 +611,54 @@ _sung_one(u3_noun* a, u3_noun* b)
if ( _(asr_o) && _(bsr_o) ) { if ( _(asr_o) && _(bsr_o) ) {
// //
// both are senior, so we address them on a higher road // when unifying on a higher road, we can't free nouns,
// if possible. // because we can't track junior nouns that point into
// that road.
// //
// this is just an implementation issue -- we could set use
// counts to 0 without actually freeing. but the allocator
// would have to be actually designed for this.
//
// not freeing may generate spurious leaks, so we disable
// senior unification when debugging memory. this will
// cause a very slow boot process as the compiler compiles
// itself, constantly running into duplicates.
//
#ifdef U3_MEMORY_DEBUG
return;
#else
u3R = u3to(u3_road, u3R->par_p); u3R = u3to(u3_road, u3R->par_p);
continue; continue;
#endif
} }
if ( _(asr_o) && !_(bsr_o) ){ if ( _(asr_o) && !_(bsr_o) ){
u3z(*b); if ( u3R == rod_u ) { u3z(*b); }
*b = *a; *b = *a;
} }
if ( _(bsr_o) && !_(asr_o) ) { if ( _(bsr_o) && !_(asr_o) ) {
u3z(*a); if ( u3R == rod_u ) { u3z(*a); }
*a = *b; *a = *b;
} }
if ( u3a_is_north(u3R) ) { if ( u3a_is_north(u3R) ) {
if ( *a <= *b ) { if ( *a <= *b ) {
u3k(*a); u3k(*a);
u3z(*b); if ( u3R == rod_u ) { u3z(*b); }
*b = *a; *b = *a;
} else { } else {
u3k(*b); u3k(*b);
u3z(*a); if ( u3R == rod_u ) { u3z(*a); }
*a = *b; *a = *b;
} }
} }
else { else {
if ( *a >= *b ) { if ( *a >= *b ) {
u3k(*a); u3k(*a);
u3z(*b); if ( u3R == rod_u ) { u3z(*b); }
*b = *a; *b = *a;
} else { } else {
u3k(*b); u3k(*b);
u3z(*a); if ( u3R == rod_u ) { u3z(*a); }
*a = *b; *a = *b;
} }
} }