Internal function used by zslDefrag */
| 179 | |
| 180 | /* Internal function used by zslDefrag */ |
| 181 | void zslUpdateNode(zskiplist *zsl, zskiplistNode *oldnode, zskiplistNode *newnode, zskiplistNode **update) { |
| 182 | int i; |
| 183 | for (i = 0; i < zsl->level; i++) { |
| 184 | if (update[i]->level[i].forward == oldnode) |
| 185 | update[i]->level[i].forward = newnode; |
| 186 | } |
| 187 | serverAssert(zsl->header!=oldnode); |
| 188 | if (newnode->level[0].forward) { |
| 189 | serverAssert(newnode->level[0].forward->backward==oldnode); |
| 190 | newnode->level[0].forward->backward = newnode; |
| 191 | } else { |
| 192 | serverAssert(zsl->tail==oldnode); |
| 193 | zsl->tail = newnode; |
| 194 | } |
| 195 | } |
| 196 | |
| 197 | /* Defrag helper for sorted set. |
| 198 | * Update the robj pointer, defrag the skiplist struct and return the new score |