Attempt to merge ziplists within two nodes on either side of 'center'. * * We attempt to merge: * - (center->prev->prev, center->prev) * - (center->next, center->next->next) * - (center->prev, center) * - (center, center->next) */
| 754 | * - (center, center->next) |
| 755 | */ |
| 756 | REDIS_STATIC void _quicklistMergeNodes(quicklist *quicklist, |
| 757 | quicklistNode *center) { |
| 758 | int fill = quicklist->fill; |
| 759 | quicklistNode *prev, *prev_prev, *next, *next_next, *target; |
| 760 | prev = prev_prev = next = next_next = target = NULL; |
| 761 | |
| 762 | if (center->prev) { |
| 763 | prev = center->prev; |
| 764 | if (center->prev->prev) |
| 765 | prev_prev = center->prev->prev; |
| 766 | } |
| 767 | |
| 768 | if (center->next) { |
| 769 | next = center->next; |
| 770 | if (center->next->next) |
| 771 | next_next = center->next->next; |
| 772 | } |
| 773 | |
| 774 | /* Try to merge prev_prev and prev */ |
| 775 | if (_quicklistNodeAllowMerge(prev, prev_prev, fill)) { |
| 776 | _quicklistZiplistMerge(quicklist, prev_prev, prev); |
| 777 | prev_prev = prev = NULL; /* they could have moved, invalidate them. */ |
| 778 | } |
| 779 | |
| 780 | /* Try to merge next and next_next */ |
| 781 | if (_quicklistNodeAllowMerge(next, next_next, fill)) { |
| 782 | _quicklistZiplistMerge(quicklist, next, next_next); |
| 783 | next = next_next = NULL; /* they could have moved, invalidate them. */ |
| 784 | } |
| 785 | |
| 786 | /* Try to merge center node and previous node */ |
| 787 | if (_quicklistNodeAllowMerge(center, center->prev, fill)) { |
| 788 | target = _quicklistZiplistMerge(quicklist, center->prev, center); |
| 789 | center = NULL; /* center could have been deleted, invalidate it. */ |
| 790 | } else { |
| 791 | /* else, we didn't merge here, but target needs to be valid below. */ |
| 792 | target = center; |
| 793 | } |
| 794 | |
| 795 | /* Use result of center merge (or original) to merge with next node. */ |
| 796 | if (_quicklistNodeAllowMerge(target, target->next, fill)) { |
| 797 | _quicklistZiplistMerge(quicklist, target, target->next); |
| 798 | } |
| 799 | } |
| 800 | |
| 801 | /* Split 'node' into two parts, parameterized by 'offset' and 'after'. |
| 802 | * |
no test coverage detected