static int random_levels (skiplist_t *sl) { uint64_t r = nbd_rand(); int z = __builtin_ctz(r); int levels = (int)(z / 1.5); if (levels == 0) return 1; if (levels > sl->high_water) { levels = SYNC_ADD(&sl->high_water, 1); TRACE("s2", "random_levels: increased high water mark to %lld", sl->high_water, 0); } if (levels > MAX_LEVELS) { levels = MAX_LEVELS; } return levels; }
/************************************************************************** //Function: __AddNode //Description: 加入关键字节点 //Calls: //Called by: //Input: pNode 指向待加入节点的指针 //Output: //Return: 返回值 说明 0 成功 负值 失败 //Others: //Author: fanyh Email: [email protected] //Date: 2008-06-16 **************************************************************************/ static inline int __AddNode(CMiniCache *cache, CMiniCacheNode* pNode, bool readd) { size_t lPos; lPos = hashVal(pNode->tKey, cache->m_lHashSize); //放到hash位置 if(cache->m_ppHash[lPos]) { pNode->pDown = cache->m_ppHash[lPos]; pNode->pUp = NULL; cache->m_ppHash[lPos]->pUp = pNode; cache->m_ppHash[lPos] = pNode; } else { pNode->pDown = NULL; pNode->pUp = NULL; cache->m_ppHash[lPos] = pNode; } //使用链表,left是更加新的 if(cache->m_pEnd) { pNode->pRight = cache->m_pEnd; pNode->pLeft = NULL; cache->m_pEnd->pLeft = pNode; cache->m_pEnd = pNode; } else { pNode->pRight = NULL; pNode->pLeft = NULL; cache->m_pEnd = pNode; } if(!cache->m_pHead) cache->m_pHead = pNode; if (!readd) { SYNC_ADD(&cache->lDataSize, pNode->lDataSize); SYNC_ADD(&cache->lDataNum, 1); } return 0; }
/* 头格式 编码gbk Int 头大小 Int 内容大小 byte 静态页版本格式 0 or 1, 1:deadtime byte 是否有效 long 过期时间毫秒 long 生成时间毫秒 long 页号 byte 站类型 0 私有 1共享 >1 会员 int 关键词长度 byte[] 关键词 int ig号长度 byte[] ig Int 鉴权方式 0 不鉴权,1特殊页面鉴权,2php 特殊页面鉴权3,会员鉴权 int 额外参数的长度 byte[] 额外参数{PageAuth:{sid:,appid,authid:},GroupAuth:{sid,appid,authid}} byte[] 文件内容 */ page_t * file_read_path(char *path) { tbuf mt = {0, NULL}; if (tbuf_read(&mt, path)) { char *strpos; uint32_t strlen; stream_t s = {0, mt.len, (uint8_t*)mt.data}; size_t min = 2 * sizeof(uint32_t); if (mt.len < min) { tbuf_close(&mt); return NULL; } uint32_t hlen = readu32(&s); uint32_t blen = readu32(&s); if (mt.len != min+hlen+blen) { tbuf_close(&mt); return NULL; } /* |<-- page_t -->|<-- body data -->|<-- head strings -->| */ /* about 32 bytes in head is not for strings */ size_t plen = sizeof(page_t)+blen+hlen-32; page_t *page = (page_t*)smalloc(plen); page->page_len = plen; page->body_len = blen; page->body = (char*)page+sizeof(page_t); memcpy(page->body, mt.data+2*sizeof(uint32_t)+hlen, page->body_len); strpos = (char*)page->body + blen; page_head_t *head = &page->head; head->version = readu8(&s); switch(head->version) { case 0: head->valid = readu8(&s); head->time_expire = readu64(&s); head->time_create = readu64(&s); head->time_dead = head->time_expire+(uint64_t)24*3600*1000; head->page_no = readu64(&s); head->type = readu8(&s); strlen = readu32(&s); readarr(&s, strpos, strlen); *(strpos+strlen) = 0; head->keyword = strpos; strpos += strlen+1; strlen = readu32(&s); readarr(&s, strpos, strlen); *(strpos+strlen) = 0; head->ig = strpos; strpos += strlen+1; head->auth_type = readu32(&s); strlen = readu32(&s); readarr(&s, strpos, strlen); *(strpos+strlen) = 0; head->param = strpos; strpos += strlen+1; break; case 1: head->valid = readu8(&s); head->time_expire = readu64(&s); head->time_create = readu64(&s); head->time_dead = readu64(&s); head->page_no = readu64(&s); head->type = readu8(&s); strlen = readu32(&s); readarr(&s, strpos, strlen); *(strpos+strlen) = 0; head->keyword = strpos; strpos += strlen+1; strlen = readu32(&s); readarr(&s, strpos, strlen); *(strpos+strlen) = 0; head->ig = strpos; strpos += strlen+1; head->auth_type = readu32(&s); strlen = readu32(&s); readarr(&s, strpos, strlen); *(strpos+strlen) = 0; head->param = strpos; strpos += strlen+1; break; } tbuf_close(&mt); SYNC_ADD(&total_pages, 1); return page; } tbuf_close(&mt); return NULL; }