mirror of
https://github.com/fluencelabs/redis
synced 2025-03-18 16:40:50 +00:00
Set p to its new offset before modifying it
This commit is contained in:
parent
5117c20ab5
commit
3cc2904e3e
@ -500,12 +500,13 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig
|
||||
totlen = p-first.p;
|
||||
if (totlen > 0) {
|
||||
if (p[0] != ZIP_END) {
|
||||
/* Tricky: storing the prevlen in this entry might reduce or
|
||||
* increase the number of bytes needed, compared to the current
|
||||
* prevlen. Note that we can always store this length because
|
||||
* it was previously stored by an entry that is being deleted. */
|
||||
/* Storing `prevrawlen` in this entry may increase or decrease the
|
||||
* number of bytes required compare to the current `prevrawlen`.
|
||||
* There always is room to store this, because it was previously
|
||||
* stored by an entry that is now being deleted. */
|
||||
nextdiff = zipPrevLenByteDiff(p,first.prevrawlen);
|
||||
zipPrevEncodeLength(p-nextdiff,first.prevrawlen);
|
||||
p -= nextdiff;
|
||||
zipPrevEncodeLength(p,first.prevrawlen);
|
||||
|
||||
/* Update offset for tail */
|
||||
ZIPLIST_TAIL_OFFSET(zl) =
|
||||
@ -521,8 +522,8 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig
|
||||
}
|
||||
|
||||
/* Move tail to the front of the ziplist */
|
||||
memmove(first.p,p-nextdiff,
|
||||
intrev32ifbe(ZIPLIST_BYTES(zl))-(p-zl)-1+nextdiff);
|
||||
memmove(first.p,p,
|
||||
intrev32ifbe(ZIPLIST_BYTES(zl))-(p-zl)-1);
|
||||
} else {
|
||||
/* The entire tail was deleted. No need to move memory. */
|
||||
ZIPLIST_TAIL_OFFSET(zl) =
|
||||
|
Loading…
x
Reference in New Issue
Block a user