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

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

?? heapmin.c

?? C標準庫源代碼,能提高對C的理解,不錯的哦
?? C
字號:
/***
*heapmin.c - Minimize the heap
*
*       Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*       Minimize the heap freeing as much memory as possible back
*       to the OS.
*
*******************************************************************************/


#ifdef WINHEAP


#include <cruntime.h>
#include <windows.h>
#include <errno.h>
#include <malloc.h>
#include <mtdll.h>
#include <stdlib.h>
#include <winheap.h>

/***
*_heapmin() - Minimize the heap
*
*Purpose:
*       Minimize the heap freeing as much memory as possible back
*       to the OS.
*
*Entry:
*       (void)
*
*Exit:
*
*        0 = no error has occurred
*       -1 = an error has occurred (errno is set)
*
*Exceptions:
*
*******************************************************************************/

int __cdecl _heapmin(void)
{
        /*
         * Minimize the small-block heap by calling _sbh_decommit_pages()
         * with a big enough count to ensure every page which can be
         * decommitted, is.
         */
        _mlock(_HEAP_LOCK);
        __sbh_heapmin();
        _munlock(_HEAP_LOCK);

        if ( HeapCompact( _crtheap, 0 ) == 0 ) {

            if ( GetLastError() == ERROR_CALL_NOT_IMPLEMENTED ) {
                _doserrno = ERROR_CALL_NOT_IMPLEMENTED;
                errno = ENOSYS;
            }
            return -1;
        }
        else {
            return 0;
        }
}

#else  /* WINHEAP */


#include <cruntime.h>
#include <heap.h>
#include <malloc.h>
#include <mtdll.h>
#include <stdlib.h>

#if defined (_M_MPPC) || defined (_M_M68K)
#include <macos\memory.h>        // Mac OS interface header
#else  /* defined (_M_MPPC) || defined (_M_M68K) */
#include <windows.h>
#endif  /* defined (_M_MPPC) || defined (_M_M68K) */

static int __cdecl _heapmin_region(int, void *, _PBLKDESC);
static void __cdecl _free_partial_region(_PBLKDESC, unsigned, int);

#if defined (_M_MPPC) || defined (_M_M68K)
extern Handle hHeapRegions;
extern int _heap_region_table_cur;
#endif  /* defined (_M_MPPC) || defined (_M_M68K) */

/***
*_heapmin() - Minimize the heap
*
*Purpose:
*   Minimize the heap freeing as much memory as possible back
*   to the OS.
*
*Entry:
*   (void)
*
*Exit:
*    0 = no error has occurred
*   -1 = an error has occurred (errno is set)
*
*Exceptions:
*
*******************************************************************************/

int __cdecl _heapmin(void)
{
    REG1 int index;
    _PBLKDESC pdesc;
    REG2 _PBLKDESC pdesc2;
    void * regend;
    int region_min_count = 0;
#if defined (_M_MPPC) || defined (_M_M68K)
    struct _heap_region_ *pHeapRegions;
#endif  /* defined (_M_MPPC) || defined (_M_M68K) */
    /*
     * Lock the heap
     */

    _mlock(_HEAP_LOCK);

    /*
     * Coalesce the heap (should return NULL)
     */

    if ( _heap_search((unsigned)_HEAP_COALESCE) != NULL )
        _heap_abort();

    /*
     * Loop through the region descriptor table freeing as much
     * memory to the OS as possible.
     */

#if defined (_M_MPPC) || defined (_M_M68K)

    for ( index=0 ; index < _heap_region_table_cur ; index++ ) {

        pHeapRegions = (struct _heap_region_ *)(*hHeapRegions);
        if ( (pHeapRegions + index)->_regbase == NULL )
            continue;       /* region entry is empty */

        /*
         * Get the entry that contains the last address of
         * the region (allocated so far, that is).
         */

        regend = (char *) ( (pHeapRegions + index)->_regbase) +
                 (pHeapRegions + index)->_currsize - 1;

#else  /* defined (_M_MPPC) || defined (_M_M68K) */

    for ( index=0 ; index < _HEAP_REGIONMAX ; index++ ) {

        if ( _heap_regions[index]._regbase == NULL )
            continue;    /* region entry is empty */

        /*
         * Get the entry that contains the last address of
         * the region (allocated so far, that is).
         */

        regend = (char *) _heap_regions[index]._regbase +
                 _heap_regions[index]._currsize - 1;

#endif  /* defined (_M_MPPC) || defined (_M_M68K) */

        if ( _heap_findaddr(regend, &pdesc) != _HEAPFIND_WITHIN )
            _heap_abort();  /* last address not within a block */

        /*
         * See if the containing block is free
         */

        if ( !(_IS_FREE(pdesc)) )
            continue;    /* block is not free */


        /*
         * Region ends with a free block, go free as much mem
         * as possible.
         */

        region_min_count += _heapmin_region(index, regend, pdesc);


    }  /* region loop */

    /*
     * By minimizing the heap, we've likely invalidated the rover and
     * may have produced contiguous dummy blocks so:
     *
     *  (1) reset the rover
     *  (2) coalesce contiguous dummy blocks
     */

    if ( region_min_count ) {

        /*
         * Set proverdesc to pfirstdesc
         */

        _heap_desc.proverdesc = _heap_desc.pfirstdesc;

        for ( pdesc = _heap_desc.pfirstdesc ; pdesc !=
            &_heap_desc.sentinel ; pdesc = pdesc->pnextdesc ) {

            /*
             * Check and remove consecutive dummy blocks
             */

            if ( _IS_DUMMY(pdesc) ) {

                for ( pdesc2 = pdesc->pnextdesc ;
                    _IS_DUMMY(pdesc2) ;
                    pdesc2 = pdesc->pnextdesc ) {

                    /*
                     * coalesce the dummy blocks
                     */

                    pdesc->pnextdesc = pdesc2->pnextdesc;
                    _PUTEMPTY(pdesc2);

                }  /* dummy loop */

            }  /* if */

        }  /* heap loop */

    }  /* region_min_count */

    /*
     * Good return
     */

    /* goodrtn:   unreferenced label to be removed */
    /*
     * Release the heap lock
     */

    _munlock(_HEAP_LOCK);
    return(0);
}


/***
*_heapmin_region() - Minimize a region
*
*Purpose:
*   Free as much of a region back to the OS as possible.
*
*Entry:
*   int index = index of the region in the region table
*   void * regend = last valid address in region
*   pdesc = pointer to the last block of memory in the region
*       (it has already been determined that this block is free)
*
*Exit:
*   int 1 = minimized region
*       0 = no change to region
*
*Exceptions:
*
*******************************************************************************/

static int __cdecl _heapmin_region (
    int index,
    void * regend,
    REG1 _PBLKDESC pdesc
    )
{
    unsigned size;
    REG2 _PBLKDESC pnew;
#if defined (_M_MPPC) || defined (_M_M68K)
    struct _heap_region_ *pHeapRegions;
#endif  /* defined (_M_MPPC) || defined (_M_M68K) */

    /*
     * Init some variables
     *
     * regend = 1st address AFTER region
     * size = amount of free memory at end of current region
     */

    regend = (char *) regend + 1;   /* "regend++" give compiler error... */
    size = ((char *)regend - (char *)_ADDRESS(pdesc));


    /*
     * See if there's enough free memory to release to the OS.
     * (NOTE:  Need more than a page since we may need a back pointer.)
     */

    if ( size <= _PAGESIZE_ )
        return(0);      /* 0 = no change to region */

    /*
     * We're going to free some memory to the OS.  See if the
     * free block crosses the end of the region and, if so,
     * split up the block appropriately.
     */

    if ( (_MEMSIZE(pdesc) - size) != 0 ) {

        /*
         * The free block spans the end of the region.
         * Divide it up.
         */

        /*
         * Get an empty descriptor
         */

        if ( (pnew = __getempty()) == NULL )
            return(0);

        pnew->pblock = regend;        /* init block pointer */
        * (_PBLKDESC*)regend = pnew;  /* init back pointer */
        _SET_FREE(pnew);              /* set the block free */

        pnew->pnextdesc = pdesc->pnextdesc; /* link it in */
        pdesc->pnextdesc = pnew;

    }


    /*
     * At this point, we have a free block of memory that goes
     * up to (but not exceeding) the end of the region.
     *
     * pdesc = descriptor of the last free block in region
     * size = amount of free mem at end of region (i.e., _MEMSIZE(pdesc))
     * regend = 1st address AFTER end of region
     */


    /*
     * See if we should return the whole region of only part of it.
     */
#if defined (_M_MPPC) || defined (_M_M68K)
    pHeapRegions = (struct _heap_region_ *)(*hHeapRegions);
    if ( _ADDRESS(pdesc) == (pHeapRegions + index)->_regbase ) {
#else  /* defined (_M_MPPC) || defined (_M_M68K) */
    if ( _ADDRESS(pdesc) == _heap_regions[index]._regbase ) {
#endif  /* defined (_M_MPPC) || defined (_M_M68K) */

        /*
         * Whole region is free, return it to OS
         */

        _heap_free_region(index);

        /*
         * Put a dummy block in the heap to hold space for
         * the memory we just freed up.
         */

        _SET_DUMMY(pdesc);

    }

    else {

        /*
         * Whole region is NOT free, return part of it to OS
         */
#if !defined (_M_MPPC) && !defined (_M_M68K)
         _free_partial_region(pdesc, size, index);
#endif  /* !defined (_M_MPPC) && !defined (_M_M68K) */
    }

    /*
     * Exit paths
     */

    return(1);  /* 1 = minimized region */

}


/***
*_free_partial_region() - Free part of a region to the OS
*
*Purpose:
*   Free a portion of a region to the OS
*
*Entry:
*   pdesc = descriptor of last free block in region
*   size = amount of free mem at end of region (i.e., _MEMSIZE(pdesc))
*   index = index of region
*
*Exit:
*
*Exceptions:
*
*******************************************************************************/

static void __cdecl _free_partial_region (
    REG1 _PBLKDESC pdesc,
    unsigned size,
    int index
    )
{
    unsigned left;
    void * base;
    REG2 _PBLKDESC pnew;
#if defined (_M_MPPC) || defined (_M_M68K)
    struct _heap_region_ *pHeapRegions;
#endif  /* defined (_M_MPPC) || defined (_M_M68K) */

    /*
     * Init a few variables.
     */

    left = (size & (_PAGESIZE_-1));
    base = (char *)_ADDRESS(pdesc);

    /*
     * We return memory to the OS in page multiples.  If the
     * free block is not page aligned, we'll insert a new free block
     * to fill in the difference.
     */

    if ( left != 0 ) {

        /*
         * The block is not a multiple of pages so we need
         * to adjust variables accordingly.
         */

        size -= left;
        base = (char *)base + left;
    }


    /*
     * Return the free pages to the OS.
     */

#if defined (_M_MPPC) || defined (_M_M68K)

    if (base)
    {
        DisposePtr(base);
    }

    /*
     * Adjust the region table entry
     */

    pHeapRegions = (struct _heap_region_ *)(*hHeapRegions);
    (pHeapRegions + index)->_currsize -= size;

#else  /* defined (_M_MPPC) || defined (_M_M68K) */

        if (!VirtualFree(base, size, MEM_DECOMMIT))
         _heap_abort();

    /*
     * Adjust the region table entry
     */

    _heap_regions[index]._currsize -= size;

#endif  /* defined (_M_MPPC) || defined (_M_M68K) */

    /*
     * Adjust the heap according to whether we released the whole
     * free block or not. (Don't worry about consecutive dummies,
     * we'll coalesce them later.)
     *
     * base = address of block we just gave back to OS
     * size = size of block we gave back to OS
     * left = size of block we did NOT give back to OS
     */

    if ( left == 0 ) {

        /*
         * The free block was released to the OS in its
         * entirety.  Make the free block a dummy place holder.
         */

        _SET_DUMMY(pdesc);

    }

    else {

        /*
         * Did NOT release the whole free block to the OS.
         * There's a block of free memory we want to leave
         * in the heap.  Insert a dummy entry after it.
         */

        if ( (pnew = __getempty()) == NULL )
            _heap_abort();

        pnew->pblock = (char *)base;
        _SET_DUMMY(pnew);

        pnew->pnextdesc = pdesc->pnextdesc;
        pdesc->pnextdesc = pnew;

    }

}


#endif  /* WINHEAP */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人一区二区三区| 99国产一区二区三精品乱码| 欧美午夜精品理论片a级按摩| 亚洲乱码国产乱码精品精可以看| 欧美午夜精品久久久久久孕妇| 国产成人av电影在线| 亚洲伦在线观看| 欧美日韩一区不卡| 国产福利精品导航| 日韩精品欧美精品| 日韩一区在线免费观看| 91精品婷婷国产综合久久性色| 成人免费视频播放| av中文字幕不卡| 国产一区二区三区免费看| 亚洲成人午夜影院| 国产精品第一页第二页第三页| 日韩美一区二区三区| 欧美午夜精品一区二区三区| 91成人国产精品| 99视频一区二区| 色八戒一区二区三区| 欧美日韩在线不卡| 精品国产免费视频| 日韩欧美中文字幕一区| 欧美日韩mp4| 欧美日韩亚洲综合| 精品国产伦理网| 亚洲伦理在线免费看| 裸体健美xxxx欧美裸体表演| 国产欧美精品一区| 精品盗摄一区二区三区| 国产亚洲精品免费| 欧美激情一区在线| 国产农村妇女精品| 亚洲高清免费在线| 亚洲不卡在线观看| 国产精品一二三| 国产一区999| 91极品美女在线| 精品国产乱码久久久久久久久| 亚洲日本va午夜在线电影| 一区视频在线播放| 狠狠色伊人亚洲综合成人| 国产一区二区调教| 欧美午夜电影网| 中文天堂在线一区| 亚洲精品乱码久久久久久久久 | 欧美精品一区二| 日韩欧美一级精品久久| 国产精品成人一区二区艾草| 久久精品99国产国产精| 欧美这里有精品| 91精品婷婷国产综合久久性色| 中文字幕高清不卡| 国内偷窥港台综合视频在线播放| 欧美性一区二区| 国产精品久久二区二区| 国产呦萝稀缺另类资源| 欧美成人一区二区三区片免费 | 国产福利一区二区| 日韩欧美精品三级| 午夜精品一区二区三区免费视频| 免费成人av资源网| 成人午夜视频网站| 久久久精品2019中文字幕之3| 欧美国产日产图区| 国产精品一区二区免费不卡| 欧美电影一区二区| 久久毛片高清国产| 久久se这里有精品| 日韩欧美在线综合网| 日韩福利视频网| 99久久精品国产观看| 亚洲国产精品精华液2区45| 国产成人av电影在线| 欧美激情艳妇裸体舞| 国产精品一区二区久久不卡| 久久综合999| 国产成人亚洲综合色影视| 久久久精品国产99久久精品芒果| 国产精品综合视频| 国产精品无圣光一区二区| 国产不卡免费视频| 亚洲欧洲日本在线| 欧美优质美女网站| 免费国产亚洲视频| 久久久亚洲国产美女国产盗摄| 国产成人在线观看| 亚洲欧美中日韩| 在线国产亚洲欧美| 日韩国产欧美在线视频| 日韩精品一区二区三区老鸭窝 | 久久激情五月婷婷| 久久精品一区八戒影视| 成人sese在线| 精品国产电影一区二区| 成人动漫一区二区在线| 亚洲精品伦理在线| 日韩女优视频免费观看| 国产乱国产乱300精品| 亚洲欧洲制服丝袜| 欧美日韩aaaaaa| 国模冰冰炮一区二区| 国产精品久99| 日韩视频一区在线观看| 99精品热视频| 蜜臀久久99精品久久久久宅男 | 亚洲成人黄色影院| 欧美精品一区二区三区一线天视频| 国产一区二区三区四区五区入口| 中文字幕中文字幕一区| 欧美一区二区三区婷婷月色| 亚洲精品国产精华液| 日韩欧美成人激情| 欧洲一区在线观看| 国产成人综合在线观看| 亚洲综合av网| 欧美三级日本三级少妇99| 激情偷乱视频一区二区三区| 综合色中文字幕| 精品对白一区国产伦| 欧美日韩色一区| av亚洲精华国产精华精华| 麻豆精品视频在线观看| 亚洲综合免费观看高清在线观看| 欧美精品一区二区三区蜜桃| 欧美日韩国产片| 91一区二区三区在线观看| 一区二区理论电影在线观看| 欧美中文字幕一二三区视频| 国产成人亚洲精品青草天美| 蜜桃av一区二区| 亚洲国产日韩精品| 一区二区三区在线高清| 国产欧美日韩在线观看| 久久中文娱乐网| 日韩视频一区在线观看| 欧美日韩黄色一区二区| 91麻豆精东视频| 成人av资源网站| 国产成人av电影| 国产成人精品aa毛片| 国产乱码精品一区二区三区av | 国产精品入口麻豆九色| 亚洲精品一区二区三区蜜桃下载 | 日本精品视频一区二区三区| 韩国欧美国产1区| 男男视频亚洲欧美| 日本sm残虐另类| 亚洲va欧美va天堂v国产综合| 亚洲欧洲三级电影| 国产精品网站导航| 欧美国产激情二区三区| 国产无人区一区二区三区| 国产亚洲欧美在线| 欧美极品美女视频| 国产精品剧情在线亚洲| 最新久久zyz资源站| 亚洲欧美日韩国产手机在线| 亚洲欧美在线视频观看| 一区二区三区av电影| 亚洲高清视频的网址| 日韩高清不卡在线| 国产一区二区三区香蕉| av中文字幕不卡| 色婷婷精品久久二区二区蜜臂av| 久久精品理论片| 国产精品18久久久久久久久| 不卡av免费在线观看| 99国产麻豆精品| 欧美日韩一二区| 久久美女高清视频| 亚洲欧洲av在线| 亚洲一区二区三区美女| 免费在线看成人av| 韩国av一区二区三区| 99v久久综合狠狠综合久久| 欧美视频中文字幕| 精品粉嫩aⅴ一区二区三区四区| 中文av字幕一区| 亚洲6080在线| 国产福利一区二区| 欧美色大人视频| 国产欧美精品区一区二区三区| 亚洲久草在线视频| 精品一区二区综合| 蜜桃av噜噜一区| 99久久精品免费| 91精品国产综合久久精品| 中文字幕不卡在线播放| 婷婷丁香久久五月婷婷| 国产盗摄女厕一区二区三区| 欧美午夜精品一区二区三区| 久久―日本道色综合久久| 亚洲综合男人的天堂| 国产成人亚洲综合a∨婷婷图片 | 日本伊人色综合网| 成人aa视频在线观看| 日韩午夜在线播放|