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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pbuf.c

?? MCS-51的一個Free小型操作系統(tǒng),在KeilC中下編譯工作
?? C
?? 第 1 頁 / 共 3 頁
字號:
           ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
    break;
  /* pbuf references existing (non-volatile static constant) ROM payload? */
  case PBUF_ROM:
  /* pbuf references existing (externally allocated) RAM payload? */
  case PBUF_REF:
    /* only allocate memory for the pbuf structure */
    p = memp_malloc(MEMP_PBUF);
    if (p == NULL) {
      LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n", flag == PBUF_ROM?"ROM":"REF"));
      return NULL;
    }
    /* caller must set this field properly, afterwards */
    p->payload = NULL;
    p->len = p->tot_len = length;
    p->next = NULL;
    p->flags = (flag == PBUF_ROM? PBUF_FLAG_ROM: PBUF_FLAG_REF);
    break;
  default:
    LWIP_ASSERT("pbuf_alloc: erroneous flag", 0);
    return NULL;
  }
  /* set reference count */
  p->ref = 1;
  LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 3, ("pbuf_alloc(length=%u) == %p\n", length, (void *)p));
  return p;
}


#if PBUF_STATS
#define DEC_PBUF_STATS do { --lwip_stats.pbuf.used; } while (0)
#else /* PBUF_STATS */
#define DEC_PBUF_STATS
#endif /* PBUF_STATS */

#define PBUF_POOL_FAST_FREE(p)  do {                                    \
                                  p->next = pbuf_pool;                  \
                                  pbuf_pool = p;                        \
                                  DEC_PBUF_STATS;                       \
                                } while (0)

#if SYS_LIGHTWEIGHT_PROT
#define PBUF_POOL_FREE(p)  do {                                         \
                                SYS_ARCH_DECL_PROTECT(old_level);       \
                                SYS_ARCH_PROTECT(old_level);            \
                                PBUF_POOL_FAST_FREE(p);                 \
                                SYS_ARCH_UNPROTECT(old_level);          \
                               } while (0)
#else /* SYS_LIGHTWEIGHT_PROT */
#define PBUF_POOL_FREE(p)  do {                                         \
                             sys_sem_wait(pbuf_pool_free_sem);          \
                             PBUF_POOL_FAST_FREE(p);                    \
                             sys_sem_signal(pbuf_pool_free_sem);        \
                           } while (0)
#endif /* SYS_LIGHTWEIGHT_PROT */

/**
 * Shrink a pbuf chain to a desired length.
 *
 * @param p pbuf to shrink.
 * @param new_len desired new length of pbuf chain
 *
 * Depending on the desired length, the first few pbufs in a chain might
 * be skipped and left unchanged. The new last pbuf in the chain will be
 * resized, and any remaining pbufs will be freed.
 *
 * @note If the pbuf is ROM/REF, only the ->tot_len and ->len fields are adjusted.
 * @note May not be called on a packet queue.
 *
 * @bug Cannot grow the size of a pbuf (chain) (yet).
 */
void
pbuf_realloc(struct pbuf *p, u16_t new_len)
{
  struct pbuf *q;
  u16_t rem_len; /* remaining length */
  s16_t grow;

  LWIP_ASSERT("pbuf_realloc: sane p->flags", p->flags == PBUF_FLAG_POOL ||
              p->flags == PBUF_FLAG_ROM ||
              p->flags == PBUF_FLAG_RAM ||
              p->flags == PBUF_FLAG_REF);

  /* desired length larger than current length? */
  if (new_len >= p->tot_len) {
    /* enlarging not yet supported */
    return;
  }

  /* the pbuf chain grows by (new_len - p->tot_len) bytes
   * (which may be negative in case of shrinking) */
  grow = new_len - p->tot_len;

  /* first, step over any pbufs that should remain in the chain */
  rem_len = new_len;
  q = p;
  /* should this pbuf be kept? */
  while (rem_len > q->len) {
    /* decrease remaining length by pbuf length */
    rem_len -= q->len;
    /* decrease total length indicator */
    q->tot_len += grow;
    /* proceed to next pbuf in chain */
    q = q->next;
  }
  /* we have now reached the new last pbuf (in q) */
  /* rem_len == desired length for pbuf q */

  /* shrink allocated memory for PBUF_RAM */
  /* (other types merely adjust their length fields */
  if ((q->flags == PBUF_FLAG_RAM) && (rem_len != q->len)) {
    /* reallocate and adjust the length of the pbuf that will be split */
    mem_realloc(q, (u8_t *)q->payload - (u8_t *)q + rem_len);
  }
  /* adjust length fields for new last pbuf */
  q->len = rem_len;
  q->tot_len = q->len;

  /* any remaining pbufs in chain? */
  if (q->next != NULL) {
    /* free remaining pbufs in chain */
    pbuf_free(q->next);
  }
  /* q is last packet in chain */
  q->next = NULL;

}

/**
 * Adjusts the payload pointer to hide or reveal headers in the payload.
 *
 * Adjusts the ->payload pointer so that space for a header
 * (dis)appears in the pbuf payload.
 *
 * The ->payload, ->tot_len and ->len fields are adjusted.
 *
 * @param hdr_size_inc Number of bytes to increment header size which
 * increases the size of the pbuf. New space is on the front.
 * (Using a negative value decreases the header size.)
 * If hdr_size_inc is 0, this function does nothing and returns succesful.
 *
 * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so
 * the call will fail. A check is made that the increase in header size does
 * not move the payload pointer in front of the start of the buffer.
 * @return non-zero on failure, zero on success.
 *
 */
u8_t
pbuf_header(struct pbuf *p, s16_t header_size_increment)
{
  void *payload;

  LWIP_ASSERT("p != NULL", p != NULL);
  if ((header_size_increment == 0) || (p == NULL)) return 0;
 
  /* remember current payload pointer */
  payload = p->payload;

  /* pbuf types containing payloads? */
  if (p->flags == PBUF_FLAG_RAM || p->flags == PBUF_FLAG_POOL) {
    /* set new payload pointer */
    p->payload = (u8_t *)p->payload - header_size_increment;
    /* boundary check fails? */
    if ((u8_t *)p->payload < (u8_t *)p + sizeof(struct pbuf)) {
      LWIP_DEBUGF( PBUF_DEBUG | 2, ("pbuf_header: failed as %p < %p (not enough space for new header size)\n",
        (void *)p->payload,
        (void *)(p + 1)));\
      /* restore old payload pointer */
      p->payload = payload;
      /* bail out unsuccesfully */
      return 1;
    }
  /* pbuf types refering to external payloads? */
  } else if (p->flags == PBUF_FLAG_REF || p->flags == PBUF_FLAG_ROM) {
    /* hide a header in the payload? */
    if ((header_size_increment < 0) && (header_size_increment - p->len <= 0)) {
      /* increase payload pointer */
      p->payload = (u8_t *)p->payload - header_size_increment;
    } else {
      /* cannot expand payload to front (yet!)
       * bail out unsuccesfully */
      return 1;
    }
  }
  /* modify pbuf length fields */
  p->len += header_size_increment;
  p->tot_len += header_size_increment;

  LWIP_DEBUGF( PBUF_DEBUG, ("pbuf_header: old %p new %p (%d)\n",
    (void *)payload, (void *)p->payload, header_size_increment));

  return 0;
}

/**
 * Dereference a pbuf chain or queue and deallocate any no-longer-used
 * pbufs at the head of this chain or queue.
 *
 * Decrements the pbuf reference count. If it reaches zero, the pbuf is
 * deallocated.
 *
 * For a pbuf chain, this is repeated for each pbuf in the chain,
 * up to the first pbuf which has a non-zero reference count after
 * decrementing. So, when all reference counts are one, the whole
 * chain is free'd.
 *
 * @param pbuf The pbuf (chain) to be dereferenced.
 *
 * @return the number of pbufs that were de-allocated
 * from the head of the chain.
 *
 * @note MUST NOT be called on a packet queue (Not verified to work yet).
 * @note the reference counter of a pbuf equals the number of pointers
 * that refer to the pbuf (or into the pbuf).
 *
 * @internal examples:
 *
 * Assuming existing chains a->b->c with the following reference
 * counts, calling pbuf_free(a) results in:
 * 
 * 1->2->3 becomes ...1->3
 * 3->3->3 becomes 2->3->3
 * 1->1->2 becomes ......1
 * 2->1->1 becomes 1->1->1
 * 1->1->1 becomes .......
 *
 */
u8_t
pbuf_free(struct pbuf *p)
{
  struct pbuf *q;
  u8_t count;
  SYS_ARCH_DECL_PROTECT(old_level);

  LWIP_ASSERT("p != NULL", p != NULL);
  /* if assertions are disabled, proceed with debug output */
  if (p == NULL) {
    LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_free(p == NULL) was called.\n"));
    return 0;
  }
  LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 3, ("pbuf_free(%p)\n", (void *)p));

  PERF_START;

  LWIP_ASSERT("pbuf_free: sane flags",
    p->flags == PBUF_FLAG_RAM || p->flags == PBUF_FLAG_ROM ||
    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.
   */
  SYS_ARCH_PROTECT(old_level);
  /* de-allocate all consecutive pbufs from the head of the chain that
   * obtain a zero reference count after decrementing*/
  while (p != NULL) {
    /* all pbufs in a chain are referenced at least once */
    LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
    /* decrease reference count (number of pointers to pbuf) */
    p->ref--;
    /* this pbuf is no longer referenced to? */
    if (p->ref == 0) {
      /* remember next pbuf in chain for next iteration */
      q = p->next;
      LWIP_DEBUGF( PBUF_DEBUG | 2, ("pbuf_free: deallocating %p\n", (void *)p));
      /* 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);
      /* is this a ROM or RAM referencing pbuf? */
      } else if (p->flags == PBUF_FLAG_ROM || p->flags == PBUF_FLAG_REF) {
        memp_free(MEMP_PBUF, p);
      /* p->flags == PBUF_FLAG_RAM */
      } else {
        mem_free(p);
      }
      count++;
      /* proceed to next pbuf */
      p = q;
    /* p->ref > 0, this pbuf is still referenced to */
    /* (and so the remaining pbufs in chain as well) */
    } else {
      LWIP_DEBUGF( PBUF_DEBUG | 2, ("pbuf_free: %p has ref %u, ending here.\n", (void *)p, (unsigned int)p->ref));
      /* stop walking through the chain */
      p = NULL;
    }
  }
  SYS_ARCH_UNPROTECT(old_level);
  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

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合中文字幕国产 | 色综合一个色综合亚洲| 日韩欧美中文字幕公布| 又紧又大又爽精品一区二区| 国产激情视频一区二区在线观看| 国产精品嫩草99a| 欧美一区二区三区在线视频| 亚洲欧洲日韩av| 激情都市一区二区| 欧美日韩一区中文字幕| 国产精品久久免费看| 精品一区二区精品| 欧美狂野另类xxxxoooo| 亚洲欧美激情一区二区| 国产一区二区看久久| 6080午夜不卡| 亚洲男人天堂av| 国产成人午夜视频| 欧美r级在线观看| 亚洲gay无套男同| 日本韩国视频一区二区| 国产精品免费视频一区| 国产成人av电影在线观看| 精品久久人人做人人爱| 丝袜美腿成人在线| 欧美日韩在线免费视频| 亚洲综合色婷婷| 色综合久久88色综合天天6| 国产精品久久一级| 成人午夜免费av| 久久精子c满五个校花| 国产一区在线视频| 精品国产3级a| 狠狠色综合日日| 精品国产伦理网| 精品一区二区三区免费播放| 精品区一区二区| 精品在线免费观看| 欧美精品一区二区久久久| 久久精品国产亚洲5555| 日韩片之四级片| 精品一区二区免费看| 精品久久99ma| 国产精品911| 亚洲国产成人私人影院tom | 日日夜夜精品视频天天综合网| 色婷婷亚洲精品| 怡红院av一区二区三区| 色av综合在线| 亚洲一区电影777| 欧美日韩国产一二三| 午夜精品久久久久久久| 91精品久久久久久久99蜜桃 | 亚洲乱码国产乱码精品精可以看| 色综合天天视频在线观看 | 久久久夜色精品亚洲| 国产盗摄一区二区三区| 中文字幕一区二区三区在线观看 | 热久久免费视频| 日韩精品中文字幕一区二区三区| 久久精品国产免费| 久久久国产午夜精品| 97久久精品人人爽人人爽蜜臀| 亚洲男女毛片无遮挡| 欧美日本在线视频| 久久国产麻豆精品| 欧美国产国产综合| 日本电影欧美片| 免费日韩伦理电影| 国产欧美精品国产国产专区| 91免费版在线| 日韩精品欧美精品| 久久精品亚洲乱码伦伦中文| heyzo一本久久综合| 亚洲成av人**亚洲成av**| 精品少妇一区二区三区在线视频| 国产精品99久久久久久宅男| 1024成人网| 在线综合+亚洲+欧美中文字幕| 精品在线免费视频| 亚洲欧美日韩在线| 91精品国产91综合久久蜜臀| 国产精品白丝jk白祙喷水网站| 亚洲欧美另类图片小说| 日韩免费电影一区| 成熟亚洲日本毛茸茸凸凹| 亚洲一区二区视频在线观看| 精品国产一二三区| 国产美女一区二区三区| 欧美精品一区二区三区一线天视频 | 一区二区三区在线观看欧美| 91麻豆精品国产91久久久久久| 国产精品白丝av| 亚洲成人先锋电影| 欧美韩国日本不卡| 欧美日韩一区小说| 高清在线不卡av| 视频在线观看国产精品| 国产免费观看久久| 在线不卡欧美精品一区二区三区| 成人综合婷婷国产精品久久蜜臀| 亚洲成人动漫一区| 日本一区二区不卡视频| 欧美一区二区三区公司| 91亚洲精品一区二区乱码| 日韩欧美一级精品久久| 成人激情免费网站| 日本中文字幕一区二区有限公司| 欧美激情中文不卡| 欧美一区二区三区影视| 色婷婷综合五月| 国产精品 日产精品 欧美精品| 亚洲电影一区二区三区| 国产精品网站在线观看| 日韩一级视频免费观看在线| 色婷婷综合久色| 成a人片国产精品| 激情综合网av| 视频一区在线播放| 一区二区三区在线视频播放| 久久精品视频免费观看| 欧美一级日韩免费不卡| 91福利小视频| 91片在线免费观看| 国产精品1区2区3区| 裸体一区二区三区| 亚欧色一区w666天堂| 亚洲丝袜美腿综合| 亚洲国产精品高清| 久久久不卡网国产精品一区| 精品少妇一区二区三区日产乱码 | 国产夜色精品一区二区av| 欧美片网站yy| 色悠久久久久综合欧美99| 国产成人在线网站| 韩国毛片一区二区三区| 久久激情五月激情| 蜜桃精品视频在线| 蜜臀av一区二区在线观看| 日韩一区精品字幕| 日韩有码一区二区三区| 亚洲超丰满肉感bbw| 亚洲成国产人片在线观看| 伊人性伊人情综合网| 亚洲欧美日韩在线| 亚洲码国产岛国毛片在线| 国产精品白丝在线| 国产精品护士白丝一区av| 欧美经典一区二区三区| 久久精品无码一区二区三区| 久久久噜噜噜久久中文字幕色伊伊| 欧美videos中文字幕| 337p日本欧洲亚洲大胆精品| 日韩精品专区在线影院重磅| 精品奇米国产一区二区三区| 精品日韩在线观看| 久久色在线视频| 久久先锋影音av| 国产日韩欧美一区二区三区综合| 久久久亚洲欧洲日产国码αv| 久久久久国产成人精品亚洲午夜| 久久美女艺术照精彩视频福利播放| 国产调教视频一区| 国产精品嫩草99a| 亚洲色图视频网| 亚洲永久免费av| 天天亚洲美女在线视频| 日本视频在线一区| 精品一区二区日韩| 懂色av一区二区在线播放| 99久久久久久99| 在线看日韩精品电影| 欧美精品欧美精品系列| 欧美一级片在线看| 国产视频一区在线播放| 亚洲婷婷综合色高清在线| 亚洲在线观看免费视频| 日本女人一区二区三区| 国产一区二区成人久久免费影院| 成人综合婷婷国产精品久久免费| 色综合一个色综合亚洲| 欧美肥妇bbw| 精品少妇一区二区三区免费观看| 中文乱码免费一区二区| 一区二区三区在线免费视频| 青草国产精品久久久久久| 国模娜娜一区二区三区| 99re这里都是精品| 欧美精品在线观看播放| 亚洲精品一区在线观看| 国产精品麻豆网站| 亚洲国产精品久久久久秋霞影院| 另类调教123区| 成人黄色电影在线| 欧美日韩国产色站一区二区三区| 精品区一区二区| 99re成人在线| 欧美午夜精品一区| 日韩你懂的在线观看| 国产欧美精品一区aⅴ影院|