Internal function used by zslDefrag */
| 202 | |
| 203 | /* Internal function used by zslDefrag */ |
| 204 | void zslUpdateNode(zskiplist *zsl, zskiplistNode *oldnode, zskiplistNode *newnode, zskiplistNode **update) { |
| 205 | int i; |
| 206 | for (i = 0; i < zsl->level; i++) { |
| 207 | if (update[i]->level(i)->forward == oldnode) |
| 208 | update[i]->level(i)->forward = newnode; |
| 209 | } |
| 210 | serverAssert(zsl->header!=oldnode); |
| 211 | if (newnode->level(0)->forward) { |
| 212 | serverAssert(newnode->level(0)->forward->backward==oldnode); |
| 213 | newnode->level(0)->forward->backward = newnode; |
| 214 | } else { |
| 215 | serverAssert(zsl->tail==oldnode); |
| 216 | zsl->tail = newnode; |
| 217 | } |
| 218 | } |
| 219 | |
| 220 | /* Defrag helper for sorted set. |
| 221 | * Update the robj pointer, defrag the skiplist struct and return the new score |