亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pbuf.c

?? 一個輕量tcpip協議在移植在ucOS2系統上運行
?? C
?? 第 1 頁 / 共 3 頁
字號:
    p->flags == PBUF_FLAG_REF || p->flags == PBUF_FLAG_POOL);

  count = 0;
  /* Since decrementing ref cannot be guaranteed to be a single machine operation
   * we must protect it. Also, the later test of ref must be protected.
   */
//丁一修改
#if SYS_LIGHTWEIGHT_PROT
  SYS_ARCH_PROTECT(old_level);
#else /* SYS_LIGHTWEIGHT_PROT */  
  sys_sem_wait(pbuf_pool_free_sem);
#endif /* SYS_LIGHTWEIGHT_PROT */  
//原本
//  SYS_ARCH_PROTECT(old_level);



  /* de-allocate all consecutive pbufs from the head of the chain that
   * obtain a zero reference count */
  while (p != NULL) {
    /* all pbufs in a chain are referenced at least once */
    LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
    p->ref--;
    /* this pbuf is no longer referenced to? */
    if (p->ref == 0) {
      /* remember next pbuf in chain for next iteration */
      q = p->next;
      /* is this a pbuf from the pool? */
      if (p->flags == PBUF_FLAG_POOL) {
        p->len = p->tot_len = PBUF_POOL_BUFSIZE;
        p->payload = (void *)((u8_t *)p + sizeof(struct pbuf));
        PBUF_POOL_FREE(p);
      /* a RAM/ROM referencing pbuf */
      } else if (p->flags == PBUF_FLAG_ROM || p->flags == PBUF_FLAG_REF) {
        memp_freep(MEMP_PBUF, p);
      /* pbuf with data */
      } else {
        mem_free(p);
      }
      count++;
      /* proceed to next pbuf */
      p = q;
    /* p->ref > 0, this pbuf is still referenced to */
    /* (so the remaining pbufs in chain as well)    */
    } else {
      /* stop walking through chain */
      p = NULL;
    }
  }
  
 //丁一修改  
#if SYS_LIGHTWEIGHT_PROT
  SYS_ARCH_UNPROTECT(old_level);
#else /* SYS_LIGHTWEIGHT_PROT */
  sys_sem_signal(pbuf_pool_free_sem);
#endif /* SYS_LIGHTWEIGHT_PROT */  
//原本  
//  SYS_ARCH_UNPROTECT(old_level);  

  pbuf_refresh();
  PERF_STOP("pbuf_free");
  /* return number of de-allocated pbufs */
  return count;
}

/**
 * Count number of pbufs in a chain
 *
 * @param p first pbuf of chain
 * @return the number of pbufs in a chain
 */

u8_t
pbuf_clen(struct pbuf *p)
{
  u8_t len;

  len = 0;  
  while (p != NULL) {
    ++len;
    p = p->next;
  }
  return len;
}
/**
 *
 * Increment the reference count of the pbuf.
 *
 * @param p pbuf to increase reference counter of
 *
 */
void
pbuf_ref(struct pbuf *p)
{
//丁一修改
#if SYS_LIGHTWEIGHT_PROT
  SYS_ARCH_DECL_PROTECT(old_level);
#endif /* SYS_LIGHTWEIGHT_PROT */  
//原本
//  SYS_ARCH_DECL_PROTECT(old_level);
  /* pbuf given? */  
  if (p != NULL) {
//丁一修改
#if SYS_LIGHTWEIGHT_PROT
  SYS_ARCH_PROTECT(old_level);
#else /* SYS_LIGHTWEIGHT_PROT */  
  sys_sem_wait(pbuf_pool_free_sem);
#endif /* SYS_LIGHTWEIGHT_PROT */  
//原本
//    SYS_ARCH_PROTECT(old_level);
    ++(p->ref);

//丁一修改  
#if SYS_LIGHTWEIGHT_PROT
  SYS_ARCH_UNPROTECT(old_level);
#else /* SYS_LIGHTWEIGHT_PROT */
  sys_sem_signal(pbuf_pool_free_sem);
#endif /* SYS_LIGHTWEIGHT_PROT */  
//原本  
//  SYS_ARCH_UNPROTECT(old_level);  

  }
}

/**
 *
 * Increment the reference count of all pbufs in a chain.
 *
 * @param p first pbuf of chain
 *
 */
void
pbuf_ref_chain(struct pbuf *p)
{
//丁一修改
#if SYS_LIGHTWEIGHT_PROT
  SYS_ARCH_DECL_PROTECT(old_level);
  SYS_ARCH_PROTECT(old_level);
#else /* SYS_LIGHTWEIGHT_PROT */  
  sys_sem_wait(pbuf_pool_free_sem);
#endif /* SYS_LIGHTWEIGHT_PROT */  
//原本
//  SYS_ARCH_DECL_PROTECT(old_level);
//  SYS_ARCH_PROTECT(old_level);
    
  while (p != NULL) {
    ++p->ref;
    p = p->next;
  }
  
//丁一修改  
#if SYS_LIGHTWEIGHT_PROT
  SYS_ARCH_UNPROTECT(old_level);
#else /* SYS_LIGHTWEIGHT_PROT */
  sys_sem_signal(pbuf_pool_free_sem);
#endif /* SYS_LIGHTWEIGHT_PROT */  
//原本  
//  SYS_ARCH_UNPROTECT(old_level);  

}


/**
 *
 * Link two pbufs (or chains) together.
 *
 * @param h head pbuf (chain)
 * @param t tail pbuf (chain)
 * 
 * The ->tot_len field of the first pbuf (h) is adjusted.
 */
void
pbuf_chain(struct pbuf *h, struct pbuf *t)
{
  struct pbuf *p;

  LWIP_ASSERT("h != NULL", h != NULL);
  LWIP_ASSERT("t != NULL", t != NULL);
  
  /* proceed to last pbuf of chain */
  for (p = h; p->next != NULL; p = p->next) {
    /* add total length of second chain to all totals of first chain */
    p->tot_len += t->tot_len;
  }
  /* p is last pbuf of first h chain */
  /* add total length of second chain to last pbuf total of first chain */
  p->tot_len += t->tot_len;
  /* chain last pbuf of h chain (p) with first of tail (t) */
  p->next = t;
  /* t is now referenced to one more time */
  pbuf_ref(t);
  DEBUGF(PBUF_DEBUG | DBG_FRESH | 2, ("pbuf_chain: referencing tail %p\n", (void *) t));
}

/**
 * Dechains the first pbuf from its succeeding pbufs in the chain.
 *
 * Makes p->tot_len field equal to p->len.
 * @param p pbuf to dechain
 * @return remainder of the pbuf chain, or NULL if it was de-allocated.
 */
struct pbuf *
pbuf_dechain(struct pbuf *p)
{
  struct pbuf *q;
  u8_t tail_gone = 1;
  /* tail */  
  q = p->next;
  /* pbuf has successor in chain? */
  if (q != NULL) {
    /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */
    LWIP_ASSERT("p->tot_len == p->len + q->tot_len", q->tot_len == p->tot_len - p->len);
    /* enforce invariant if assertion is disabled */
    q->tot_len = p->tot_len - p->len;
    /* decouple pbuf from remainder */
    p->next = NULL;
    /* total length of pbuf p is its own length only */
    p->tot_len = p->len;
    /* q is no longer referenced by p, free it */
    DEBUGF(PBUF_DEBUG | DBG_STATE, ("pbuf_dechain: unreferencing %p\n", (void *) q));
    tail_gone = pbuf_free(q);
    /* return remaining tail or NULL if deallocated */
  }
  /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */
  LWIP_ASSERT("p->tot_len == p->len", p->tot_len == p->len);
  return (tail_gone > 0? NULL: q);
}

/**
 *
 * Create PBUF_POOL (or PBUF_RAM) copies of PBUF_REF pbufs.
 *
 * Go through a pbuf chain and replace any PBUF_REF buffers
 * with PBUF_POOL (or PBUF_RAM) pbufs, each taking a copy of
 * the referenced data.
 *
 * @note You MUST explicitly use p = pbuf_take(p);
 * The pbuf you give as argument, may have been replaced
 * by pbuf_take()!
 *
 * @note Any replaced pbufs will be freed through pbuf_free().
 *
 * Used to queue packets on behalf of the lwIP stack, such as
 * ARP based queueing.
 *
 * @param p Head of pbuf chain to process
 *
 * @return Pointer to new head of pbuf chain 
 */
struct pbuf *
pbuf_take(struct pbuf *p)
{
  struct pbuf *q , *prev, *head;
  LWIP_ASSERT("pbuf_take: p != NULL\n", p != NULL);
  DEBUGF(PBUF_DEBUG | DBG_TRACE | 3, ("pbuf_take(%p)\n", (void*)p));

  prev = NULL;
  head = p;
  /* iterate through pbuf chain */
  do
  {
    /* pbuf is of type PBUF_REF? */
    if (p->flags == PBUF_FLAG_REF) {
      DEBUGF(PBUF_DEBUG | DBG_TRACE, ("pbuf_take: encountered PBUF_REF %p\n", (void *)p));
      /* allocate a pbuf (w/ payload) fully in RAM */
      /* PBUF_POOL buffers are faster if we can use them */
      if (p->len <= PBUF_POOL_BUFSIZE) {
        q = pbuf_alloc(PBUF_RAW, p->len, PBUF_POOL);
        if (q == NULL) DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_take: Could not allocate PBUF_POOL\n"));
      } else {
      	/* no replacement pbuf yet */
        q = NULL;
        DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_take: PBUF_POOL too small to replace PBUF_REF\n"));
      }
      /* no (large enough) PBUF_POOL was available? retry with PBUF_RAM */
      if (q == NULL) {
        q = pbuf_alloc(PBUF_RAW, p->len, PBUF_RAM);
        if (q == NULL) DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_take: Could not allocate PBUF_RAM\n"));
      }
      /* replacement pbuf could be allocated? */
      if (q != NULL)
      {
        /* copy p to q */  
        /* copy successor */
        q->next = p->next;
        /* remove linkage from original pbuf */
        p->next = NULL;
        /* remove linkage to original pbuf */
        if (prev != NULL) {
          /* prev->next == p at this point */
          LWIP_ASSERT("prev->next == p", prev->next == p);
          /* break chain and insert new pbuf instead */
          prev->next = q;
        /* prev == NULL, so we replaced the head pbuf of the chain */
        } else {
          head = q;
        }
        /* copy pbuf payload */
        memcpy(q->payload, p->payload, p->len);
        q->tot_len = p->tot_len;
        q->len = p->len;
        /* in case p was the first pbuf, it is no longer refered to by
         * our caller, as the caller MUST do p = pbuf_take(p);
         * in case p was not the first pbuf, it is no longer refered to
         * by prev. we can safely free the pbuf here.
         * (note that we have set p->next to NULL already so that
         * we will not free the rest of the chain by accident.)
         */
        pbuf_free(p);
        /* do not copy ref, since someone else might be using the old buffer */
        DEBUGF(PBUF_DEBUG, ("pbuf_take: replaced PBUF_REF %p with %p\n", (void *)p, (void *)q));
        p = q;
      } else {
        /* deallocate chain */
        pbuf_free(head);
        DEBUGF(PBUF_DEBUG | 2, ("pbuf_take: failed to allocate replacement pbuf for %p\n", (void *)p));
        return NULL;
      }
    /* p->flags != PBUF_FLAG_REF */
    } else {
      DEBUGF(PBUF_DEBUG | DBG_TRACE | 1, ("pbuf_take: skipping pbuf not of type PBUF_REF\n"));
    }
    /* remember this pbuf */
    prev = p;
    /* proceed to next pbuf in original chain */
    p = p->next;
  } while (p);
  DEBUGF(PBUF_DEBUG | DBG_TRACE | 1, ("pbuf_take: end of chain reached.\n"));
  
  return head;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级中文字幕| 92国产精品观看| 亚洲精品欧美在线| 中文字幕一区在线观看视频| 国产亚洲精品精华液| 亚洲精品一线二线三线无人区| 欧美在线观看你懂的| 色欧美片视频在线观看 | 亚洲成人免费观看| 亚洲一区二区三区四区在线观看 | 国产色婷婷亚洲99精品小说| 精品毛片乱码1区2区3区| 欧美tk—视频vk| 国产欧美视频在线观看| 欧美国产一区二区在线观看| 亚洲欧洲精品一区二区三区不卡| 中文字幕在线不卡| 亚洲电影第三页| 精品一区二区三区久久久| 国内精品免费在线观看| av在线不卡免费看| 欧美三级视频在线观看| 精品区一区二区| 中文字幕av在线一区二区三区| 国产精品久久久久三级| 亚洲国产精品一区二区久久 | 日韩一级黄色片| 久久久久青草大香线综合精品| 国产精品久久久久精k8| 日韩激情中文字幕| 高清不卡在线观看av| 91传媒视频在线播放| 精品国产制服丝袜高跟| 中文字幕制服丝袜成人av | 日韩欧美一级二级三级久久久| 精品久久久久久久久久久院品网| 国产精品久久久久一区| 日韩av中文字幕一区二区三区| 国产精品影音先锋| 欧美日本韩国一区| 成人欧美一区二区三区黑人麻豆| 三级欧美在线一区| 91视频观看免费| 久久综合色8888| 午夜视频在线观看一区二区| av不卡一区二区三区| 欧美成人艳星乳罩| 一区二区在线免费观看| 国产美女娇喘av呻吟久久| 欧美亚洲国产怡红院影院| 欧美国产精品中文字幕| 蜜臂av日日欢夜夜爽一区| 在线影视一区二区三区| 国产精品色眯眯| 国产精品一区不卡| 欧美xxxxx牲另类人与| 日韩精品一二区| 欧美无乱码久久久免费午夜一区| 国产欧美视频一区二区| 久久av资源站| 在线综合视频播放| 亚洲亚洲人成综合网络| 色先锋久久av资源部| 国产精品国产三级国产普通话蜜臀 | 国产精品综合二区| 日韩欧美中文一区二区| 亚洲成人免费影院| 精品视频在线看| 亚洲成人免费视频| 欧美日韩一级二级| 午夜一区二区三区视频| 欧美性大战久久久| 亚洲成人动漫在线观看| 欧美日韩精品久久久| 亚洲精品视频在线| 色偷偷88欧美精品久久久| 亚洲色图欧美在线| 色婷婷久久久亚洲一区二区三区 | 中文字幕av一区二区三区| 国内成+人亚洲+欧美+综合在线| 日韩欧美一区二区久久婷婷| 麻豆成人久久精品二区三区红| 欧美一级欧美一级在线播放| 日本亚洲视频在线| 精品国产免费人成在线观看| 国产主播一区二区三区| 国产亚洲欧美中文| 91一区在线观看| 一级女性全黄久久生活片免费| 欧美无乱码久久久免费午夜一区 | 天堂久久久久va久久久久| 欧美日韩国产首页| 美日韩一区二区| 中文字幕成人av| 欧美午夜片在线看| 蜜臀av性久久久久蜜臀aⅴ流畅| 精品精品国产高清a毛片牛牛| 国产一区二区视频在线| 中文一区在线播放| 欧美日韩综合不卡| 久久成人精品无人区| 国产精品视频一二三| 在线观看日韩国产| 紧缚捆绑精品一区二区| 国产精品免费视频网站| 在线观看日韩电影| 国产精品996| 亚洲午夜久久久久久久久电影网 | 亚洲成人自拍一区| 精品噜噜噜噜久久久久久久久试看| 国产精品一卡二| 夜夜揉揉日日人人青青一国产精品 | 欧美三级视频在线播放| 精品中文字幕一区二区| 最近日韩中文字幕| 日韩三区在线观看| 99精品国产91久久久久久| 日韩黄色小视频| 中国色在线观看另类| 日韩欧美视频一区| 99re这里只有精品首页| 久久99精品国产91久久来源| 亚洲精选在线视频| 中文字幕精品在线不卡| 欧美一区二区免费视频| 91美女福利视频| 国产伦理精品不卡| 日韩精品一级二级| 亚洲尤物视频在线| 最新热久久免费视频| 久久久精品中文字幕麻豆发布| 欧美做爰猛烈大尺度电影无法无天| 国产精品资源网站| 麻豆高清免费国产一区| 亚洲成人激情社区| 亚洲女同一区二区| 国产精品天干天干在线综合| 欧美成人性福生活免费看| 3d成人动漫网站| 日本久久精品电影| 色综合视频一区二区三区高清| 国产另类ts人妖一区二区| 美女在线观看视频一区二区| 一个色在线综合| 亚洲国产美国国产综合一区二区| 亚洲蜜臀av乱码久久精品蜜桃| 国产欧美日韩卡一| 国产午夜精品一区二区三区四区| 日韩免费电影一区| 日韩精品在线网站| 日韩丝袜情趣美女图片| 欧美一级欧美一级在线播放| 欧美电影一区二区三区| 欧美日韩国产首页| 日韩一区国产二区欧美三区| 欧美日韩mp4| 91精品国产91久久综合桃花| 欧美一区二区三区日韩| 在线成人av影院| 日韩午夜在线观看| 国产亚洲一区二区三区| 国产欧美一区二区三区在线老狼| 国产精品全国免费观看高清| 最新中文字幕一区二区三区| 一区二区三区在线视频观看58| 一区二区在线观看免费| 亚洲成人一二三| 久久国产婷婷国产香蕉| 国产综合久久久久影院| a级高清视频欧美日韩| 色视频一区二区| 日韩视频免费观看高清完整版在线观看 | 夜夜嗨av一区二区三区中文字幕 | 一区二区三区四区五区视频在线观看| 亚洲欧美电影一区二区| 日本网站在线观看一区二区三区| 国产综合色产在线精品| 99精品偷自拍| 欧美一级爆毛片| 国产目拍亚洲精品99久久精品| 亚洲精品免费在线播放| 日韩精品电影一区亚洲| 国产成人精品免费视频网站| 欧美综合天天夜夜久久| 日韩片之四级片| 亚洲欧美视频在线观看| 毛片基地黄久久久久久天堂| 国产盗摄一区二区三区| 欧美精品日韩一区| 亚洲国产高清在线观看视频| 亚洲图片欧美色图| 国产一区在线不卡| 在线看日韩精品电影| 久久久久久电影| 日韩激情中文字幕| 91蝌蚪porny九色| 久久久久久久一区| 日韩二区三区四区| 色悠久久久久综合欧美99| 欧美大片国产精品|