Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/**************************************************************************
  //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;
}
Exemplo n.º 3
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;
}