利用BLCR加快Android的启动过程(三)

2014-11-24 07:48:44 · 作者: · 浏览: 16
cr_request_checkpoint");


return rc;


}



return my_args.cr_fd;


}



int


crut_checkpoint_wait(cr_checkpoint_handle_t *handle_p, int fd) {


int rc, save_err;



do {


rc = cr_poll_checkpoint(handle_p, NULL);


if (rc < 0) {


if ((rc == CR_POLL_CHKPT_ERR_POST) && (errno == CR_ERESTARTED)) {


/* restarting -- not an error */


rc = 1; /* Signify RESTART to caller */


} else if (errno == EINTR) {


/* poll was interrupted by a signal -- retry */


continue;


} else {


/* return the error to caller */


break;


}


} else if (rc == 0) {


fprintf(stderr, "cr_poll_checkpoint returned unexpected 0\n");


rc = -1;


goto out;


} else {


rc = 0; /* Signify CONTINUE to caller */


}


} while (rc < 0);



save_err = errno;


#if 0 // Nothing in the testsuite needs this, but your APP might want it.


(void)fsync(fd);


#endif


(void)close(fd);


errno = save_err;



out:


return rc;


}



int


crut_checkpoint_block(const char *filename) {


cr_checkpoint_handle_t my_handle;


int ret, fd, save_err;



fd = crut_checkpoint_request(&my_handle, filename);


if (fd < 0) return fd;



ret = crut_checkpoint_wait(&my_handle, fd);



save_err = errno;


(void)close(fd);


errno = save_err;



return ret;


}