mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-09-22 07:59:22 +03:00
vere: refactor %behn's retries of failed events
This commit is contained in:
parent
a5a148e66d
commit
6e8a914791
@ -840,11 +840,16 @@
|
||||
void
|
||||
u3_auto_bail_slog(u3_ovum* egg_u, u3_noun lud);
|
||||
|
||||
/* u3_auto_plan(): create and enqueue an ovum.
|
||||
/* u3_auto_plan(): enqueue an ovum.
|
||||
*/
|
||||
u3_ovum*
|
||||
u3_auto_plan(u3_auto* car_u, u3_ovum* egg_u);
|
||||
|
||||
/* u3_auto_redo(): retry an ovum.
|
||||
*/
|
||||
u3_ovum*
|
||||
u3_auto_redo(u3_auto* car_u, u3_ovum* egg_u);
|
||||
|
||||
/* u3_auto_peer(): subscribe to updates.
|
||||
*/
|
||||
void
|
||||
|
@ -19,16 +19,13 @@
|
||||
#include "all.h"
|
||||
#include "vere/vere.h"
|
||||
|
||||
/* u3_auto_plan(): create and enqueue an ovum.
|
||||
/* u3_auto_plan(): enqueue an ovum.
|
||||
*/
|
||||
u3_ovum*
|
||||
u3_auto_plan(u3_auto* car_u, u3_ovum *egg_u)
|
||||
{
|
||||
egg_u->car_u = car_u;
|
||||
|
||||
// [pre_u] points towards [ext_u] (back in time)
|
||||
// [nex_u] points towards [ent_u] (forward in time)
|
||||
//
|
||||
if ( !car_u->ent_u ) {
|
||||
c3_assert(!car_u->ext_u);
|
||||
|
||||
@ -36,6 +33,11 @@ u3_auto_plan(u3_auto* car_u, u3_ovum *egg_u)
|
||||
car_u->ent_u = car_u->ext_u = egg_u;
|
||||
car_u->dep_w = 1;
|
||||
}
|
||||
// enqueue at driver entry (back of the line)
|
||||
//
|
||||
// [pre_u] points towards [ext_u] (back in time)
|
||||
// [nex_u] points towards [ent_u] (forward in time)
|
||||
//
|
||||
else {
|
||||
egg_u->nex_u = 0;
|
||||
egg_u->pre_u = car_u->ent_u;
|
||||
@ -50,6 +52,38 @@ u3_auto_plan(u3_auto* car_u, u3_ovum *egg_u)
|
||||
return egg_u;
|
||||
}
|
||||
|
||||
/* u3_auto_redo(): retry an ovum.
|
||||
*/
|
||||
u3_ovum*
|
||||
u3_auto_redo(u3_auto* car_u, u3_ovum *egg_u)
|
||||
{
|
||||
c3_assert( egg_u->car_u == car_u );
|
||||
|
||||
egg_u->try_w++;
|
||||
|
||||
if ( !car_u->ent_u ) {
|
||||
c3_assert(!car_u->ext_u);
|
||||
|
||||
egg_u->pre_u = egg_u->nex_u = 0;
|
||||
car_u->ent_u = car_u->ext_u = egg_u;
|
||||
car_u->dep_w = 1;
|
||||
}
|
||||
// enqueue at driver exit (front of the line)
|
||||
//
|
||||
else {
|
||||
egg_u->nex_u = car_u->ext_u;
|
||||
egg_u->pre_u = 0;
|
||||
|
||||
car_u->ext_u->pre_u = egg_u;
|
||||
car_u->ext_u = egg_u;
|
||||
car_u->dep_w++;
|
||||
}
|
||||
|
||||
u3_pier_spin(car_u->pir_u);
|
||||
|
||||
return egg_u;
|
||||
}
|
||||
|
||||
/* u3_auto_peer(): subscribe to updates.
|
||||
*/
|
||||
void
|
||||
|
@ -19,6 +19,24 @@
|
||||
c3_o alm_o; // alarm
|
||||
} u3_behn;
|
||||
|
||||
// XX review, move
|
||||
//
|
||||
/* _behn_bail_dire(): c3y if fatal error. RETAIN
|
||||
*/
|
||||
static c3_o
|
||||
_behn_bail_dire(u3_noun lud)
|
||||
{
|
||||
u3_noun mot = u3r_at(4, lud);
|
||||
|
||||
if ( (c3__meme == mot)
|
||||
|| (c3__intr == mot) )
|
||||
{
|
||||
return c3n;
|
||||
}
|
||||
|
||||
return c3y;
|
||||
}
|
||||
|
||||
/* _behn_wake_bail(): %wake is essential, retry failures.
|
||||
*/
|
||||
static void
|
||||
@ -26,33 +44,22 @@ _behn_wake_bail(u3_ovum* egg_u, u3_noun lud)
|
||||
{
|
||||
u3_auto* car_u = egg_u->car_u;
|
||||
|
||||
if ( 2 == egg_u->try_w ) {
|
||||
u3l_log("behn: timer failed\n");
|
||||
|
||||
if ( 2 == u3qb_lent(lud) ) {
|
||||
u3_pier_punt_goof("wake", u3k(u3h(lud)));
|
||||
u3_pier_punt_goof("crud", u3k(u3h(u3t(lud))));
|
||||
}
|
||||
else {
|
||||
u3_noun dul = lud;
|
||||
c3_w len_w = 1;
|
||||
|
||||
while ( u3_nul != dul ) {
|
||||
u3l_log("behn: bail %u\r\n", len_w++);
|
||||
u3_pier_punt_goof("behn", u3k(u3h(dul)));
|
||||
dul = u3t(dul);
|
||||
}
|
||||
}
|
||||
|
||||
u3_ovum_free(egg_u);
|
||||
u3_pier_bail(car_u->pir_u);
|
||||
if ( (2 > egg_u->try_w)
|
||||
&& (c3n == _behn_bail_dire(lud)) )
|
||||
{
|
||||
u3z(lud);
|
||||
u3_auto_redo(car_u, egg_u);
|
||||
}
|
||||
else {
|
||||
egg_u->try_w++;
|
||||
u3_auto_plan(car_u, egg_u);
|
||||
}
|
||||
u3_auto_bail_slog(egg_u, lud);
|
||||
u3_ovum_free(egg_u);
|
||||
|
||||
u3z(lud);
|
||||
u3l_log("behn: timer failed; queue blocked\n");
|
||||
|
||||
// XX review, add flag to continue?
|
||||
//
|
||||
u3_pier_bail(car_u->pir_u);
|
||||
}
|
||||
}
|
||||
|
||||
/* _behn_time_cb(): timer callback.
|
||||
@ -138,33 +145,22 @@ _behn_born_bail(u3_ovum* egg_u, u3_noun lud)
|
||||
{
|
||||
u3_auto* car_u = egg_u->car_u;
|
||||
|
||||
if ( 2 == egg_u->try_w ) {
|
||||
u3l_log("behn: initialization failed\n");
|
||||
|
||||
if ( 2 == u3qb_lent(lud) ) {
|
||||
u3_pier_punt_goof("born", u3k(u3h(lud)));
|
||||
u3_pier_punt_goof("crud", u3k(u3h(u3t(lud))));
|
||||
}
|
||||
else {
|
||||
u3_noun dul = lud;
|
||||
c3_w len_w = 1;
|
||||
|
||||
while ( u3_nul != dul ) {
|
||||
u3l_log("behn: bail %u\r\n", len_w++);
|
||||
u3_pier_punt_goof("behn", u3k(u3h(dul)));
|
||||
dul = u3t(dul);
|
||||
}
|
||||
}
|
||||
|
||||
u3_ovum_free(egg_u);
|
||||
u3_pier_bail(car_u->pir_u);
|
||||
if ( (2 > egg_u->try_w)
|
||||
&& (c3n == _behn_bail_dire(lud)) )
|
||||
{
|
||||
u3z(lud);
|
||||
u3_auto_redo(car_u, egg_u);
|
||||
}
|
||||
else {
|
||||
egg_u->try_w++;
|
||||
u3_auto_plan(car_u, egg_u);
|
||||
}
|
||||
u3_auto_bail_slog(egg_u, lud);
|
||||
u3_ovum_free(egg_u);
|
||||
|
||||
u3z(lud);
|
||||
u3l_log("behn: initialization failed\n");
|
||||
|
||||
// XX review, add flag to continue?
|
||||
//
|
||||
u3_pier_bail(car_u->pir_u);
|
||||
}
|
||||
}
|
||||
/* _behn_io_talk(): notify %behn that we're live
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user