Redis-壓縮表-ziplistPrev詳解

/* 返回p指向的結點的前置結點
如果p指向的壓縮表是空表,返回NULL,
如果p指向壓縮表的表頭結點,返回NULL */
unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p) {
    zlentry entry;

    /*p指向壓縮表的表尾,則p的前置結點就是壓縮表的最後一個結點 */
    if (p[0] == ZIP_END) {
        p = ZIPLIST_ENTRY_TAIL(zl); /* 獲得壓縮表的最後一個結點*/
        /* 如果獲得的最後一個結點指向壓縮表的表尾,說明壓縮表爲空,返回NULL,否則返回p */
        return (p[0] == ZIP_END) ? NULL : p;

    } else if (p == ZIPLIST_ENTRY_HEAD(zl)) { /* 如果p指向壓縮表的第一個結點,則前置結點爲空 */
        return NULL;

    } else {
        entry = zipEntry(p); /* 獲得p指向的結點信息 */
        assert(entry.prevrawlen > 0); /* p的前置結點的長度大於0,即p有前置結點,程序繼續,否則程序中斷 */
        return p - entry.prevrawlen; /* 返回p指向的前置結點的指針 */
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章