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)44 u3_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)66 u3_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)80 u3_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)87 u3_save_io_poll(void)
88 {
89 }
90