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

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

?? memp.c

?? stm32+ucos-ii
?? C
字號:
/**
 * @file
 * Dynamic pool memory manager
 *
 * lwIP has dedicated pools for many structures (netconn, protocol control blocks,
 * packet buffers, ...). All these pools are managed here.
 */

/*
 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
 * All rights reserved. 
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission. 
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 * OF SUCH DAMAGE.
 *
 * This file is part of the lwIP TCP/IP stack.
 * 
 * Author: Adam Dunkels <adam@sics.se>
 *
 */

#include "lwip/opt.h"

#include "lwip/memp.h"
#include "lwip/pbuf.h"
#include "lwip/udp.h"
#include "lwip/raw.h"
#include "lwip/tcp.h"
#include "lwip/igmp.h"
#include "lwip/api.h"
#include "lwip/api_msg.h"
#include "lwip/tcpip.h"
#include "lwip/sys.h"
#include "lwip/stats.h"
#include "netif/etharp.h"
#include "lwip/ip_frag.h"

#include <string.h>

#if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */

struct memp {
  struct memp *next;
#if MEMP_OVERFLOW_CHECK
  const char *file;
  int line;
#endif /* MEMP_OVERFLOW_CHECK */
};

#if MEMP_OVERFLOW_CHECK
/* if MEMP_OVERFLOW_CHECK is turned on, we reserve some bytes at the beginning
 * and at the end of each element, initialize them as 0xcd and check
 * them later. */
/* If MEMP_OVERFLOW_CHECK is >= 2, on every call to memp_malloc or memp_free,
 * every single element in each pool is checked!
 * This is VERY SLOW but also very helpful. */
/* MEMP_SANITY_REGION_BEFORE and MEMP_SANITY_REGION_AFTER can be overridden in
 * lwipopts.h to change the amount reserved for checking. */
#ifndef MEMP_SANITY_REGION_BEFORE
#define MEMP_SANITY_REGION_BEFORE  16
#endif /* MEMP_SANITY_REGION_BEFORE*/
#if MEMP_SANITY_REGION_BEFORE > 0
#define MEMP_SANITY_REGION_BEFORE_ALIGNED    LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE)
#else
#define MEMP_SANITY_REGION_BEFORE_ALIGNED    0
#endif /* MEMP_SANITY_REGION_BEFORE*/
#ifndef MEMP_SANITY_REGION_AFTER
#define MEMP_SANITY_REGION_AFTER   16
#endif /* MEMP_SANITY_REGION_AFTER*/
#if MEMP_SANITY_REGION_AFTER > 0
#define MEMP_SANITY_REGION_AFTER_ALIGNED     LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER)
#else
#define MEMP_SANITY_REGION_AFTER_ALIGNED     0
#endif /* MEMP_SANITY_REGION_AFTER*/

/* MEMP_SIZE: save space for struct memp and for sanity check */
#define MEMP_SIZE          (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED)
#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED)

#else /* MEMP_OVERFLOW_CHECK */

/* No sanity checks
 * We don't need to preserve the struct memp while not allocated, so we
 * can save a little space and set MEMP_SIZE to 0.
 */
#define MEMP_SIZE           0
#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x))

#endif /* MEMP_OVERFLOW_CHECK */

/** This array holds the first free element of each pool.
 *  Elements form a linked list. */
static struct memp *memp_tab[MEMP_MAX];

#else /* MEMP_MEM_MALLOC */

#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x))

#endif /* MEMP_MEM_MALLOC */

/** This array holds the element sizes of each pool. */
#if !MEM_USE_POOLS && !MEMP_MEM_MALLOC
static
#endif
const u16_t memp_sizes[MEMP_MAX] = {
#define LWIP_MEMPOOL(name,num,size,desc)  LWIP_MEM_ALIGN_SIZE(size),
#include "lwip/memp_std.h"
};

#if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */

/** This array holds the number of elements in each pool. */
static const u16_t memp_num[MEMP_MAX] = {
#define LWIP_MEMPOOL(name,num,size,desc)  (num),
#include "lwip/memp_std.h"
};

/** This array holds a textual description of each pool. */
#ifdef LWIP_DEBUG
static const char *memp_desc[MEMP_MAX] = {
#define LWIP_MEMPOOL(name,num,size,desc)  (desc),
#include "lwip/memp_std.h"
};
#endif /* LWIP_DEBUG */

/** This is the actual memory used by the pools. */
static u8_t memp_memory[MEM_ALIGNMENT - 1 
#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "lwip/memp_std.h"
];

#if MEMP_SANITY_CHECK
/**
 * Check that memp-lists don't form a circle
 */
static int
memp_sanity(void)
{
  s16_t i, c;
  struct memp *m, *n;

  for (i = 0; i < MEMP_MAX; i++) {
    for (m = memp_tab[i]; m != NULL; m = m->next) {
      c = 1;
      for (n = memp_tab[i]; n != NULL; n = n->next) {
        if (n == m && --c < 0) {
          return 0;
        }
      }
    }
  }
  return 1;
}
#endif /* MEMP_SANITY_CHECK*/
#if MEMP_OVERFLOW_CHECK
/**
 * Check if a memp element was victim of an overflow
 * (e.g. the restricted area after it has been altered)
 *
 * @param p the memp element to check
 * @param memp_size the element size of the pool p comes from
 */
static void
memp_overflow_check_element(struct memp *p, u16_t memp_size)
{
  u16_t k;
  u8_t *m;
#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0
  m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;
  for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) {
    if (m[k] != 0xcd) {
      LWIP_ASSERT("detected memp underflow!", 0);
    }
  }
#endif
#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0
  m = (u8_t*)p + MEMP_SIZE + memp_size;
  for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) {
    if (m[k] != 0xcd) {
      LWIP_ASSERT("detected memp overflow!", 0);
    }
  }
#endif
}

/**
 * Do an overflow check for all elements in every pool.
 *
 * @see memp_overflow_check_element for a description of the check
 */
static void
memp_overflow_check_all(void)
{
  u16_t i, j;
  struct memp *p;

  p = LWIP_MEM_ALIGN(memp_memory);
  for (i = 0; i < MEMP_MAX; ++i) {
    p = p;
    for (j = 0; j < memp_num[i]; ++j) {
      memp_overflow_check_element(p, memp_sizes[i]);
      p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED);
    }
  }
}

/**
 * Initialize the restricted areas of all memp elements in every pool.
 */
static void
memp_overflow_init(void)
{
  u16_t i, j;
  struct memp *p;
  u8_t *m;

  p = LWIP_MEM_ALIGN(memp_memory);
  for (i = 0; i < MEMP_MAX; ++i) {
    p = p;
    for (j = 0; j < memp_num[i]; ++j) {
#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0
      m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;
      memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED);
#endif
#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0
      m = (u8_t*)p + MEMP_SIZE + memp_sizes[i];
      memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED);
#endif
      p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED);
    }
  }
}
#endif /* MEMP_OVERFLOW_CHECK */

/**
 * Initialize this module.
 * 
 * Carves out memp_memory into linked lists for each pool-type.
 */
void
memp_init(void)
{
  struct memp *memp;
  u16_t i, j;

  for (i = 0; i < MEMP_MAX; ++i) {
    MEMP_STATS_AVAIL(used, i, 0);
    MEMP_STATS_AVAIL(max, i, 0);
    MEMP_STATS_AVAIL(err, i, 0);
    MEMP_STATS_AVAIL(avail, i, memp_num[i]);
  }

  memp = LWIP_MEM_ALIGN(memp_memory);
  /* for every pool: */
  for (i = 0; i < MEMP_MAX; ++i) {
    memp_tab[i] = NULL;
    /* create a linked list of memp elements */
    for (j = 0; j < memp_num[i]; ++j) {
      memp->next = memp_tab[i];
      memp_tab[i] = memp;
      memp = (struct memp *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
#if MEMP_OVERFLOW_CHECK
        + MEMP_SANITY_REGION_AFTER_ALIGNED
#endif
      );
    }
  }
#if MEMP_OVERFLOW_CHECK
  memp_overflow_init();
  /* check everything a first time to see if it worked */
  memp_overflow_check_all();
#endif /* MEMP_OVERFLOW_CHECK */
}

/**
 * Get an element from a specific pool.
 *
 * @param type the pool to get an element from
 *
 * the debug version has two more parameters:
 * @param file file name calling this function
 * @param line number of line where this function is called
 *
 * @return a pointer to the allocated memory or a NULL pointer on error
 */
void *
#if !MEMP_OVERFLOW_CHECK
memp_malloc(memp_t type)
#else
memp_malloc_fn(memp_t type, const char* file, const int line)
#endif
{
  struct memp *memp;
  SYS_ARCH_DECL_PROTECT(old_level);
 
  LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);

  SYS_ARCH_PROTECT(old_level);
#if MEMP_OVERFLOW_CHECK >= 2
  memp_overflow_check_all();
#endif /* MEMP_OVERFLOW_CHECK >= 2 */

  memp = memp_tab[type];
  
  if (memp != NULL) {
    memp_tab[type] = memp->next;
#if MEMP_OVERFLOW_CHECK
    memp->next = NULL;
    memp->file = file;
    memp->line = line;
#endif /* MEMP_OVERFLOW_CHECK */
    MEMP_STATS_INC_USED(used, type);
    LWIP_ASSERT("memp_malloc: memp properly aligned",
                ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0);
    memp = (struct memp*)((u8_t*)memp + MEMP_SIZE);
  } else {
    LWIP_DEBUGF(MEMP_DEBUG | 2, ("memp_malloc: out of memory in pool %s\n", memp_desc[type]));
    MEMP_STATS_INC(err, type);
  }

  SYS_ARCH_UNPROTECT(old_level);

  return memp;
}

/**
 * Put an element back into its pool.
 *
 * @param type the pool where to put mem
 * @param mem the memp element to free
 */
void
memp_free(memp_t type, void *mem)
{
  struct memp *memp;
  SYS_ARCH_DECL_PROTECT(old_level);

  if (mem == NULL) {
    return;
  }
  LWIP_ASSERT("memp_free: mem properly aligned",
                ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);

  memp = (struct memp *)((u8_t*)mem - MEMP_SIZE);

  SYS_ARCH_PROTECT(old_level);
#if MEMP_OVERFLOW_CHECK
#if MEMP_OVERFLOW_CHECK >= 2
  memp_overflow_check_all();
#else
  memp_overflow_check_element(memp, memp_sizes[type]);
#endif /* MEMP_OVERFLOW_CHECK >= 2 */
#endif /* MEMP_OVERFLOW_CHECK */

  MEMP_STATS_DEC(used, type); 
  
  memp->next = memp_tab[type]; 
  memp_tab[type] = memp;

#if MEMP_SANITY_CHECK
  LWIP_ASSERT("memp sanity", memp_sanity());
#endif /* MEMP_SANITY_CHECK */

  SYS_ARCH_UNPROTECT(old_level);
}

#endif /* MEMP_MEM_MALLOC */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲第一在线综合网站| 午夜激情综合网| 久久综合色综合88| 日韩欧美国产wwwww| 日韩欧美不卡一区| 欧美xxxxx牲另类人与| 久久亚洲综合色| 久久亚洲二区三区| 中文字幕五月欧美| 一区二区不卡在线播放| 日韩电影一区二区三区| 视频一区在线播放| 精东粉嫩av免费一区二区三区| 日本不卡123| 国产在线一区二区综合免费视频| 狠狠色狠狠色综合日日91app| 国产在线观看一区二区| 国产91清纯白嫩初高中在线观看| 成人妖精视频yjsp地址| 欧美日韩国产成人在线免费| 欧美亚洲国产一卡| 精品欧美乱码久久久久久| 久久久久久久久99精品| 亚洲日本va在线观看| 亚洲成人一区在线| 国产美女精品一区二区三区| www.亚洲人| 在线电影一区二区三区| 欧美videos大乳护士334| 日本一区二区高清| 亚洲国产美女搞黄色| 久久精品免费观看| av电影天堂一区二区在线观看| 一本久道久久综合中文字幕| 欧美视频一区二区三区四区| 精品久久久久一区| 亚洲欧美日韩一区二区三区在线观看| 日本伊人精品一区二区三区观看方式| 极品尤物av久久免费看| 一本大道久久a久久精品综合| 欧美一区二区在线观看| 中国av一区二区三区| 日韩综合一区二区| 99国产欧美久久久精品| 欧美videossexotv100| 樱花影视一区二区| 成人午夜视频福利| 日韩一区二区三区在线| 亚洲精品日韩综合观看成人91| 国产真实乱对白精彩久久| 色欧美日韩亚洲| 国产欧美日韩精品一区| 免费观看30秒视频久久| 欧洲国内综合视频| 国产精品区一区二区三区| 美国十次了思思久久精品导航| 成人app在线观看| 久久婷婷一区二区三区| 蜜桃视频第一区免费观看| 欧美亚洲精品一区| 亚洲日本va在线观看| 成人一区二区三区视频在线观看| 日韩欧美中文字幕公布| 日本不卡一二三| 在线观看日产精品| 亚洲人成在线观看一区二区| 国产高清亚洲一区| 久久精品男人天堂av| 久久国产生活片100| 在线视频欧美区| 亚洲精品视频在线观看网站| 成人h版在线观看| 久久久91精品国产一区二区三区| 久久国产精品99精品国产 | 日韩一区二区三区在线视频| 亚洲一区二区三区小说| 色综合天天天天做夜夜夜夜做| 国产精品视频一区二区三区不卡| 国产精品原创巨作av| 久久亚洲精品国产精品紫薇| 国产大陆精品国产| 中文字幕一区二区视频| 成人看片黄a免费看在线| 欧美国产精品专区| av网站免费线看精品| 亚洲欧美另类久久久精品| 91毛片在线观看| 午夜精品成人在线视频| 欧美一级片在线观看| 国模冰冰炮一区二区| 久久综合九色综合欧美就去吻| 黄一区二区三区| 最新中文字幕一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 国精产品一区一区三区mba视频| 国产性做久久久久久| av亚洲精华国产精华| 亚洲成人精品影院| 2020国产精品久久精品美国| 成人在线综合网站| 亚洲一区二区三区三| 精品国产区一区| 97久久人人超碰| 日本中文字幕不卡| 国产亚洲福利社区一区| 在线观看国产一区二区| 久88久久88久久久| 1区2区3区国产精品| 正在播放亚洲一区| www.av亚洲| 日韩av一区二区三区四区| 国产欧美精品一区二区色综合朱莉 | 中文字幕亚洲电影| 91精品国产一区二区三区蜜臀| 高清国产一区二区| 午夜精品一区在线观看| 国产女主播一区| 欧美老人xxxx18| 日韩一区二区在线播放| av在线不卡观看免费观看| 美女mm1313爽爽久久久蜜臀| 亚洲蜜桃精久久久久久久| 久久综合九色综合欧美亚洲| 欧美性猛交xxxx乱大交退制版| 高清视频一区二区| 久久99精品久久久| 亚洲电影一区二区三区| 国产精品看片你懂得| 日韩欧美国产三级| 欧美日韩电影在线播放| 91偷拍与自偷拍精品| 国产一区二区毛片| 美女视频第一区二区三区免费观看网站| 日韩理论电影院| 国产欧美日韩一区二区三区在线观看| 91精品国产黑色紧身裤美女| 色婷婷激情久久| 福利一区二区在线观看| 国产乱人伦偷精品视频不卡| 九色|91porny| 黑人精品欧美一区二区蜜桃| 日本欧美大码aⅴ在线播放| 亚洲小说春色综合另类电影| 亚洲欧美偷拍卡通变态| 国产精品日产欧美久久久久| 久久精品视频在线看| 欧美精品一区二区三| 精品福利视频一区二区三区| 67194成人在线观看| 欧美日韩一区二区三区不卡| 色综合一个色综合亚洲| 色爱区综合激月婷婷| 久久久久九九视频| 精品久久国产字幕高潮| 欧美一二三在线| 日韩欧美一区二区视频| 欧美成人女星排行榜| 精品国产一区二区精华| 久久久久亚洲蜜桃| 亚洲国产高清在线| 亚洲欧美福利一区二区| 亚洲自拍偷拍网站| 日韩成人av影视| 国内精品久久久久影院色| 国产精品自拍av| 成人免费视频一区二区| 91美女在线观看| 欧美男男青年gay1069videost| 91.麻豆视频| 久久精品欧美日韩| 亚洲婷婷综合色高清在线| 亚洲伊人伊色伊影伊综合网| 偷窥少妇高潮呻吟av久久免费| 九九久久精品视频| 不卡的av电影| 欧美人与禽zozo性伦| 精品理论电影在线| 亚洲天堂福利av| 午夜精品福利一区二区三区蜜桃| 另类小说视频一区二区| 成人av在线播放网站| 欧美日韩一区二区欧美激情| 日韩女优制服丝袜电影| 中文字幕一区二区三区色视频| 一个色在线综合| 麻豆精品国产91久久久久久| 国产精品中文字幕日韩精品 | 一本一本大道香蕉久在线精品| 日本道色综合久久| 欧美xxxxxxxx| 亚洲曰韩产成在线| 韩国视频一区二区| 欧美视频一区在线| 亚洲国产精品99久久久久久久久| 亚洲尤物视频在线| 国产91富婆露脸刺激对白| 91精品国产欧美一区二区 | 在线观看视频一区二区欧美日韩| 在线不卡中文字幕播放| 亚洲欧洲三级电影|