1 /* v/save.c 2 ** 3 */ 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <fcntl.h> 7 #include <sys/ioctl.h> 8 #include <sys/stat.h> 9 #include <sys/wait.h> 10 #include <unistd.h> 11 #include <setjmp.h> 12 #include <gmp.h> 13 #include <stdint.h> 14 #include <termios.h> 15 #include <uv.h> 16 17 #include "all.h" 18 #include "vere/vere.h" 19 20 /* _save_time_cb(): timer callback. 21 */ 22 static void _save_time_cb(uv_timer_t * tim_u)23_save_time_cb(uv_timer_t* tim_u) 24 { 25 u3_save* sav_u = &u3_Host.sav_u; 26 27 if ( sav_u->pid_w ) { 28 return; 29 } 30 31 if ( u3A->ent_d > sav_u->ent_d ) { 32 // uL(fprintf(uH, "autosaving... ent_d %" PRIu64 "\n", u3A->ent_d)); 33 34 // u3e_grab("save", u3_none); 35 36 u3e_save(); 37 sav_u->ent_d = u3A->ent_d; 38 } 39 } 40 41 /* u3_save_ef_chld(): report save termination. 42 */ 43 void u3_save_ef_chld(void)44u3_save_ef_chld(void) 45 { 46 u3_save* sav_u = &u3_Host.sav_u; 47 c3_i loc_i; 48 c3_w pid_w; 49 50 /* modified for cases with no pid_w 51 */ 52 uL(fprintf(uH, "checkpoint: complete %d\n", sav_u->pid_w)); 53 pid_w = wait(&loc_i); 54 if (0 != sav_u->pid_w) { 55 c3_assert(pid_w == sav_u->pid_w); 56 } 57 else { 58 c3_assert(pid_w > 0); 59 } 60 sav_u->pid_w = 0; 61 } 62 63 /* u3_save_io_init(): initialize autosave. 64 */ 65 void u3_save_io_init(void)66u3_save_io_init(void) 67 { 68 u3_save* sav_u = &u3_Host.sav_u; 69 70 sav_u->ent_d = 0; 71 sav_u->pid_w = 0; 72 73 uv_timer_init(u3L, &sav_u->tim_u); 74 uv_timer_start(&sav_u->tim_u, _save_time_cb, 120000, 120000); 75 } 76 77 /* u3_save_io_exit(): terminate save I/O. 78 */ 79 void u3_save_io_exit(void)80u3_save_io_exit(void) 81 { 82 } 83 84 /* u3_save_io_poll(): poll kernel for save I/O. 85 */ 86 void u3_save_io_poll(void)87u3_save_io_poll(void) 88 { 89 } 90