121 int i1 = 0, i2 = 0;
122 const void *buffer[2 * LIST_NODE_NR];
123 int nbuf = 0;
124 struct ptr_list *newhead = b1;
125
126 // printf ("Merging %d blocks at %p with %d blocks at %p\n", n, b1, m, b2);
127
128 // Skip empty blocks in b2.
129 while (b2->nr == 0) {
130 BEEN_THERE('F');
131 b2 = b2->next;
132 if (--m == 0) {
133 BEEN_THERE('G');
134 return newhead;
135 }
136 }
137
138 // Do a quick skip in case entire blocks from b1 are
139 // already less than smallest element in b2.
140 while (b1->nr == 0 ||
141 cmp (PTR_ENTRY(b1, b1->nr - 1), PTR_ENTRY(b2,0)) < 0) {
142 // printf ("Skipping whole block.\n");
143 BEEN_THERE('H');
144 b1 = b1->next;
145 if (--n == 0) {
146 BEEN_THERE('I');
147 return newhead;
148 }
149 }
150
151 while (1) {
152 const void *d1 = PTR_ENTRY(b1,i1);
153 const void *d2 = PTR_ENTRY(b2,i2);
154
155 assert (i1 >= 0 && i1 < b1->nr);
156 assert (i2 >= 0 && i2 < b2->nr);
157 assert (b1 != b2);
158 assert (n > 0);
159 assert (m > 0);
160
161 if (cmp (d1, d2) <= 0) {
162 BEEN_THERE('J');
163 buffer[nbuf++] = d1;
164 // Element from b1 is smaller
165 if (++i1 >= b1->nr) {
166 BEEN_THERE('L');
167 FLUSH_TO(b1);
168 do {
169 b1 = b1->next;
170 if (--n == 0) {
171 BEEN_THERE('O');
172 while (b1 != b2) {
173 BEEN_THERE('P');
|
121 int i1 = 0, i2 = 0;
122 const void *buffer[2 * LIST_NODE_NR];
123 int nbuf = 0;
124 struct ptr_list *newhead = b1;
125
126 // printf ("Merging %d blocks at %p with %d blocks at %p\n", n, b1, m, b2);
127
128 // Skip empty blocks in b2.
129 while (b2->nr == 0) {
130 BEEN_THERE('F');
131 b2 = b2->next;
132 if (--m == 0) {
133 BEEN_THERE('G');
134 return newhead;
135 }
136 }
137
138 // Do a quick skip in case entire blocks from b1 are
139 // already less than smallest element in b2.
140 while (b1->nr == 0 ||
141 cmp (PTR_ENTRY_NOTAG(b1, b1->nr - 1), PTR_ENTRY_NOTAG(b2,0)) < 0) {
142 // printf ("Skipping whole block.\n");
143 BEEN_THERE('H');
144 b1 = b1->next;
145 if (--n == 0) {
146 BEEN_THERE('I');
147 return newhead;
148 }
149 }
150
151 while (1) {
152 const void *d1 = PTR_ENTRY_NOTAG(b1,i1);
153 const void *d2 = PTR_ENTRY_NOTAG(b2,i2);
154
155 assert (i1 >= 0 && i1 < b1->nr);
156 assert (i2 >= 0 && i2 < b2->nr);
157 assert (b1 != b2);
158 assert (n > 0);
159 assert (m > 0);
160
161 if (cmp (d1, d2) <= 0) {
162 BEEN_THERE('J');
163 buffer[nbuf++] = d1;
164 // Element from b1 is smaller
165 if (++i1 >= b1->nr) {
166 BEEN_THERE('L');
167 FLUSH_TO(b1);
168 do {
169 b1 = b1->next;
170 if (--n == 0) {
171 BEEN_THERE('O');
172 while (b1 != b2) {
173 BEEN_THERE('P');
|