Example #1
0
File: save.c Project: cjcole/urbit
/* _save_time_cb(): timer callback.
*/
static void
_save_time_cb(uv_timer_t* tim_u, c3_i sas_i)
{
  u2_save* sav_u = &u2_Host.sav_u;

  if ( sav_u->pid_w ) {
    return;
  }

  if ( u2A->ent_w > sav_u->ent_w ) {
    // uL(fprintf(uH, "autosaving... ent_w %d\n", u2A->ent_w));

    u2_cm_purge();
    u2_lo_grab("save", u2_none);

#ifdef FORKPT
    c3_w pid_w;
    if ( 0 == (pid_w = fork()) ) {
      u2_loom_save(u2A->ent_w);
      exit(0);
    }
    else {
      uL(fprintf(uH, "checkpoint: process %d\n", pid_w));

      sav_u->ent_w = u2A->ent_w;
      sav_u->pid_w = pid_w;
    }
#else
    u2_loom_save(u2A->ent_w);
    sav_u->ent_w = u2A->ent_w;
#endif
  }
}
Example #2
0
/* u2_lo_shut(): end callback processing.
*/
void
u2_lo_shut(u2_bean inn)
{
  // u2_lo_grab("lo_shut a", u2_none);

  //  process actions
  //
  u2_raft_work(u2A);

  // u2_lo_grab("lo_shut b", u2_none);

  //  update time
  //
  u2_reck_time(u2A);

  // u2_lo_grab("lo_shut c", u2_none);

  //  for input operations, poll fs (XX not permanent)
  //  XX remove raty_lead guard
  //
  if ( u2R->typ_e == u2_raty_lead && u2_yes == inn ) {
    u2_unix_ef_look();
  }

  // u2_lo_grab("lo_shut d", u2_none);

  //  clean shutdown
  //
  if ( u2_no == u2_Host.liv ) {
    //  direct save and die
    //
    u2_cm_purge();
    // u2_lo_grab("lo_exit", u2_none);
    u2_loom_save(u2A->ent_w);
    u2_loom_exit();
    u2_lo_exit();

    exit(0);
  }
  else {
    //  poll arvo to generate any event binding changes
    //
    _lo_poll();
  }
}