Skip to content

Commit dc85535

Browse files
committed
Its much closer to a working state now, but still not quite there. Probably just a small thing
1 parent c16de40 commit dc85535

File tree

1 file changed

+50
-22
lines changed

1 file changed

+50
-22
lines changed

_delta_apply.c

+50-22
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ void TSI_init(ToplevelStreamInfo* info)
5757

5858
void TSI_destroy(ToplevelStreamInfo* info)
5959
{
60+
fprintf(stderr, "TSI_destroy: %p\n", info);
6061
if (info->parent_object){
6162
Py_DECREF(info->parent_object);
6263
info->parent_object = 0;
@@ -164,6 +165,12 @@ ull DC_rbound(const DeltaChunk* dc)
164165
return dc->to + dc->ts;
165166
}
166167

168+
inline
169+
void DC_print(const DeltaChunk* dc, const char* prefix)
170+
{
171+
fprintf(stderr, "%s-dc: to = %i, ts = %i, so = %i, data = %p\n", prefix, (int)dc->to, dc->ts, dc->so, dc->data);
172+
}
173+
167174
// Apply
168175
inline
169176
void DC_apply(const DeltaChunk* dc, const uchar* base, PyObject* writer, PyObject* tmpargs)
@@ -179,6 +186,8 @@ void DC_apply(const DeltaChunk* dc, const uchar* base, PyObject* writer, PyObjec
179186
assert(0);
180187
}
181188

189+
DC_print(dc, "DC_apply");
190+
182191
// tuple steals reference, and will take care about the deallocation
183192
PyObject_Call(writer, tmpargs, NULL);
184193

@@ -233,14 +242,14 @@ ushort DC_count_encode_bytes(const DeltaChunk* dc)
233242
ull so = dc->so;
234243

235244
// offset
236-
c += so & 0x000000FF;
237-
c += so & 0x0000FF00;
238-
c += so & 0x00FF0000;
239-
c += so & 0xFF000000;
245+
c += (so & 0x000000FF) > 0;
246+
c += (so & 0x0000FF00) > 0;
247+
c += (so & 0x00FF0000) > 0;
248+
c += (so & 0xFF000000) > 0;
240249

241250
// size - max size is 0x10000, its encoded with 0 size bits
242-
c += ts & 0x000000FF;
243-
c += ts & 0x0000FF00;
251+
c += (ts & 0x000000FF) > 0;
252+
c += (ts & 0x0000FF00) > 0;
244253

245254
return c;
246255
}
@@ -413,7 +422,7 @@ void DIV_destroy(DeltaInfoVector* vec)
413422
{
414423
if (vec->mem){
415424
#ifdef DEBUG
416-
fprintf(stderr, "Freeing %p\n", (void*)vec->mem);
425+
fprintf(stderr, "DIV_destroy: %p\n", (void*)vec->mem);
417426
#endif
418427
PyMem_Free(vec->mem);
419428
vec->size = 0;
@@ -494,22 +503,20 @@ uint DIV_count_slice_bytes(const DeltaInfoVector* src, uint ofs, uint size)
494503
uint num_bytes = 0;
495504
DeltaInfo* cdi = DIV_closest_chunk(src, ofs);
496505

497-
498-
499506
DeltaChunk dc;
500507
DC_init(&dc, 0, 0, 0, NULL);
501508

502509
// partial overlap
503510
if (cdi->to != ofs) {
504511
const ull relofs = ofs - cdi->to;
505512
const uint cdisize = DIV_info_size(src, cdi);
506-
const uint actual_size = cdisize - relofs < size ? cdisize - relofs : size;
507-
size -= actual_size;
513+
const uint max_size = cdisize - relofs < size ? cdisize - relofs : size;
514+
size -= max_size;
508515

509516
// get the size in bytes the info would have
510517
next_delta_info(src->dstream + cdi->dso, &dc);
511518
dc.so += relofs;
512-
dc.ts = actual_size;
519+
dc.ts = max_size;
513520
num_bytes += DC_count_encode_bytes(&dc);
514521

515522
cdi += 1;
@@ -547,27 +554,32 @@ uint DIV_count_slice_bytes(const DeltaInfoVector* src, uint ofs, uint size)
547554
inline
548555
uint DIV_copy_slice_to(const DeltaInfoVector* src, uchar* dest, ull tofs, uint size)
549556
{
557+
fprintf(stderr, "copy slice: ofs = %i, size = %i\n", (int)tofs, size);
550558
assert(DIV_lbound(src) <= tofs);
551-
assert((tofs + size) <= DIV_last(src)->to + src->di_last_size);
559+
assert((tofs + size) <= DIV_info_rbound(src, DIV_last(src)));
552560

553561
DeltaChunk dc;
554562
DC_init(&dc, 0, 0, 0, NULL);
555563

556564
DeltaInfo* cdi = DIV_closest_chunk(src, tofs);
557565
uint num_chunks = 0;
558566

567+
#ifdef DEBUG
568+
const uchar* deststart = dest;
569+
#endif
570+
559571
// partial overlap
560572
if (cdi->to != tofs) {
561573
const uint relofs = tofs - cdi->to;
562574
next_delta_info(src->dstream + cdi->dso, &dc);
563575
const uint cdisize = dc.ts;
564-
const uint actual_size = cdisize - relofs < size ? cdisize - relofs : size;
576+
const uint max_size = cdisize - relofs < size ? cdisize - relofs : size;
565577

566-
size -= actual_size;
578+
size -= max_size;
567579

568580
// adjust dc proportions
569581

570-
DC_encode_to(&dc, &dest, relofs, actual_size);
582+
DC_encode_to(&dc, &dest, relofs, max_size);
571583

572584
num_chunks += 1;
573585
cdi += 1;
@@ -580,6 +592,7 @@ uint DIV_copy_slice_to(const DeltaInfoVector* src, uchar* dest, ull tofs, uint s
580592
const DeltaInfo* vecend = DIV_end(src);
581593
for( ;cdi < vecend; ++cdi)
582594
{
595+
fprintf(stderr, "copy slice: cdi: to = %i, dso = %i\n", (int)cdi->to, (int)cdi->dso);
583596
num_chunks += 1;
584597
next_delta_info(src->dstream + cdi->dso, &dc);
585598
if (dc.ts < size) {
@@ -595,6 +608,10 @@ uint DIV_copy_slice_to(const DeltaInfoVector* src, uchar* dest, ull tofs, uint s
595608
}
596609
}
597610

611+
#ifdef DEBUG
612+
fprintf(stderr, "copy slice: Wrote %i bytes\n", (int)(dest - deststart));
613+
#endif
614+
598615
assert(size == 0);
599616
return num_chunks;
600617
}
@@ -619,6 +636,7 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
619636

620637
OffsetInfo* pofs = offset_array;
621638
uint num_addbytes = 0;
639+
uint dofs = 0;
622640

623641
const uchar* data = TSI_first(tsi);
624642
const uchar* prev_data = data;
@@ -627,16 +645,19 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
627645
DeltaChunk dc;
628646
DC_init(&dc, 0, 0, 0, NULL);
629647

648+
630649
// OFFSET RUN
631650
for (;data < dend; pofs++, prev_data = data)
632651
{
633-
634652
pofs->bofs = num_addbytes;
635-
pofs->dofs = (uint)(prev_data - data);
636-
637-
// Data chunks don't need processing
638653
data = next_delta_info(data, &dc);
654+
pofs->dofs = dofs;
655+
dofs += (uint)(data-prev_data);
656+
657+
fprintf(stderr, "pofs->bofs = %i, ->dofs = %i\n", pofs->bofs, pofs->dofs);
658+
DC_print(&dc, "count-run");
639659

660+
// Data chunks don't need processing
640661
if (dc.data){
641662
continue;
642663
}
@@ -646,6 +667,8 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
646667
num_addbytes += DIV_count_slice_bytes(div, dc.so, dc.ts) - (data - prev_data);
647668
}
648669

670+
fprintf(stderr, "num_addbytes = %i\n", num_addbytes);
671+
assert(DC_rbound(&dc) == tsi->target_size);
649672

650673

651674
// reserve enough memory to hold all the new chunks
@@ -655,6 +678,7 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
655678
uchar* ds; // pointer into the delta stream
656679
const uchar* nds; // next pointer, used for size retrieving the size
657680
uint num_addchunks = 0; // total amount of chunks added
681+
DC_init(&dc, 0, 0, 0, NULL);
658682

659683
// Insert slices, from the end to the beginning, which allows memcpy
660684
// to be used, with a little help of the offset array
@@ -682,6 +706,7 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
682706
num_addchunks -= 1;
683707
}
684708

709+
fprintf(stderr, "num_addchunks = %i\n", num_addchunks);
685710
tsi->num_chunks += num_addchunks;
686711

687712
PyMem_Free(offset_array);
@@ -860,6 +885,8 @@ const uchar* next_delta_info(const uchar* data, DeltaChunk* dc)
860885
dc->data = data;
861886
dc->ts = cmd;
862887
dc->so = 0;
888+
889+
data += cmd;
863890
} else {
864891
PyErr_SetString(PyExc_RuntimeError, "Encountered an unsupported delta cmd: 0");
865892
return NULL;
@@ -993,8 +1020,8 @@ static PyObject* connect_deltas(PyObject *self, PyObject *dstreams)
9931020
DIV_reserve_memory(&div, compute_chunk_count(data, dend, 0));
9941021

9951022
// parse command stream
996-
DeltaChunk dc;
9971023
DeltaInfo* di = 0; // temporary pointer
1024+
DeltaChunk dc;
9981025
DC_init(&dc, 0, 0, 0, NULL);
9991026

10001027
assert(data < dend);
@@ -1019,7 +1046,9 @@ static PyObject* connect_deltas(PyObject *self, PyObject *dstreams)
10191046
}
10201047

10211048
#ifdef DEBUG
1049+
fprintf(stderr, "------------ Stream %i --------\n ", (int)dsi);
10221050
fprintf(stderr, "Before Connect: tdsinfo->num_chunks = %i, tdsinfo->bytelen = %i\n", (int)tdsinfo.num_chunks, (int)tdsinfo.tdslen);
1051+
fprintf(stderr, "div->num_chunks = %i, div->reserved_size = %i, div->bytelen=%i\n", (int)div.size, (int)div.reserved_size, (int)dlen);
10231052
#endif
10241053

10251054
if (!DIV_connect_with_base(&tdsinfo, &div)){
@@ -1028,7 +1057,6 @@ static PyObject* connect_deltas(PyObject *self, PyObject *dstreams)
10281057

10291058
#ifdef DEBUG
10301059
fprintf(stderr, "after connect: tdsinfo->num_chunks = %i, tdsinfo->bytelen = %i\n", (int)tdsinfo.num_chunks, (int)tdsinfo.tdslen);
1031-
fprintf(stderr, "div->num_chunks = %i, div->reserved_size = %i, div->bytelen=%i\n", (int)div.size, (int)div.reserved_size, (int)dlen);
10321060
#endif
10331061

10341062
// destroy members, but keep memory

0 commit comments

Comments
 (0)