mirror of
https://github.com/urbit/shrub.git
synced 2024-12-21 09:51:36 +03:00
u3: refactors snapshot patch application
This commit is contained in:
parent
08d22b14d3
commit
99d2056749
@ -609,44 +609,47 @@ _ce_image_sync(u3e_image* img_u)
|
|||||||
c3_sync(img_u->fid_i);
|
c3_sync(img_u->fid_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* _ce_patch_apply(): apply patch to image.
|
/* _ce_image_resize(): resize image, truncating if it shrunk.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
_ce_image_resize(u3e_image* img_u, c3_w pgs_w)
|
||||||
|
{
|
||||||
|
if ( img_u->pgs_w > pgs_w ) {
|
||||||
|
if ( ftruncate(img_u->fid_i, pgs_w << (u3a_page + 2)) ) {
|
||||||
|
fprintf(stderr, "loom: image truncate %s: %s\r\n",
|
||||||
|
img_u->nam_c,
|
||||||
|
strerror(errno));
|
||||||
|
c3_assert(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
img_u->pgs_w = pgs_w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* _ce_patch_apply(): apply patch to images.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
_ce_patch_apply(u3_ce_patch* pat_u)
|
_ce_patch_apply(u3_ce_patch* pat_u)
|
||||||
{
|
{
|
||||||
c3_w i_w;
|
c3_w i_w;
|
||||||
|
|
||||||
//u3l_log("image: nor_w %d, new %d\r\n", u3P.nor_u.pgs_w, pat_u->con_u->nor_w);
|
// resize images
|
||||||
//u3l_log("image: sou_w %d, new %d\r\n", u3P.sou_u.pgs_w, pat_u->con_u->sou_w);
|
//
|
||||||
|
_ce_image_resize(&u3P.nor_u, pat_u->con_u->nor_w);
|
||||||
|
_ce_image_resize(&u3P.sou_u, pat_u->con_u->sou_w);
|
||||||
|
|
||||||
if ( u3P.nor_u.pgs_w > pat_u->con_u->nor_w ) {
|
// seek to begining of patch and images
|
||||||
c3_w ret_w;
|
//
|
||||||
ret_w = ftruncate(u3P.nor_u.fid_i, pat_u->con_u->nor_w << (u3a_page + 2));
|
if ( (-1 == lseek(pat_u->mem_i, 0, SEEK_SET))
|
||||||
if (ret_w){
|
|| (-1 == lseek(u3P.nor_u.fid_i, 0, SEEK_SET))
|
||||||
fprintf(stderr, "loom: patch apply truncate north: %s\r\n", strerror(errno));
|
|| (-1 == lseek(u3P.sou_u.fid_i, 0, SEEK_SET)) )
|
||||||
c3_assert(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
u3P.nor_u.pgs_w = pat_u->con_u->nor_w;
|
|
||||||
|
|
||||||
if ( u3P.sou_u.pgs_w > pat_u->con_u->sou_w ) {
|
|
||||||
c3_w ret_w;
|
|
||||||
ret_w = ftruncate(u3P.sou_u.fid_i, pat_u->con_u->sou_w << (u3a_page + 2));
|
|
||||||
if (ret_w){
|
|
||||||
fprintf(stderr, "loom: patch apply truncate south: %s\r\n", strerror(errno));
|
|
||||||
c3_assert(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
u3P.sou_u.pgs_w = pat_u->con_u->sou_w;
|
|
||||||
|
|
||||||
if ( (-1 == lseek(pat_u->mem_i, 0, SEEK_SET)) ||
|
|
||||||
(-1 == lseek(u3P.nor_u.fid_i, 0, SEEK_SET)) ||
|
|
||||||
(-1 == lseek(u3P.sou_u.fid_i, 0, SEEK_SET)) )
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "loom: patch apply seek 0: %s\r\n", strerror(errno));
|
fprintf(stderr, "loom: patch apply seek 0: %s\r\n", strerror(errno));
|
||||||
c3_assert(0);
|
c3_assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// write patch pages into the appropriate image
|
||||||
|
//
|
||||||
for ( i_w = 0; i_w < pat_u->con_u->pgs_w; i_w++ ) {
|
for ( i_w = 0; i_w < pat_u->con_u->pgs_w; i_w++ ) {
|
||||||
c3_w pag_w = pat_u->con_u->mem_u[i_w].pag_w;
|
c3_w pag_w = pat_u->con_u->mem_u[i_w].pag_w;
|
||||||
c3_w mem_w[1 << u3a_page];
|
c3_w mem_w[1 << u3a_page];
|
||||||
|
Loading…
Reference in New Issue
Block a user