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

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

?? gcptr.cpp

?? 《多任務(wù)下的數(shù)據(jù)結(jié)構(gòu)》隨書的源代碼。探討多任務(wù)下的常用數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)
?? CPP
字號(hào):
/*
 * Copyright (c) 2000-2008
 * Author: Weiming Zhou
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  
 */

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "CapiGlobal.h"
#include "HashTable.h"
#include "MTask.h"
#include "GCPtr.h"

#define     GC_COLLECT_ENUM_COUNT  1024
HASHTABLE   *g_pTable; //哈希表指針
HASHTABLE   *g_pMTable; //多任務(wù)哈希表指針
LOCK        g_lock; ////用來(lái)保護(hù)引用計(jì)數(shù)讀寫及哈希表操作的鎖
MTASK       *g_pMTask;


INT IntCompare(void *p1, void *p2)
{
    if ( (INT)p1 > (INT)p2 )
    {
        return 1;
    }
    else if ( (INT)p1 < (INT)p2 )
    {
        return -1;
    }
    else
    {
        return 0;
    }
}

/**	垃圾內(nèi)存收集算法的初始化函數(shù)

	@param	INT nBucketCount - 哈希表的桶的數(shù)量	
	@return	INT - CAPI_SUCCESS表示成功,CAPI_FAILED表示失敗	
*/
INT GC_Init(INT nBucketCount)
{
    g_pTable = HashTable_Create(nBucketCount);
    if ( g_pTable != NULL )
    {
        return CAPI_SUCCESS;
    }
    return CAPI_FAILED;
}

#ifdef _DEBUG

/**	垃圾內(nèi)存收集算法的內(nèi)存分配函數(shù)

	@param	size - 要分派的內(nèi)存大小,以字節(jié)為單位	
	@return	成功返回分配到的內(nèi)存地址,失敗返回NULL	
*/
#define GC_Malloc(size)\
{\
    void *p;\
    INT  *q;\
    char *psz;\
    \
    p = malloc( size + DOUBLE_INT_LEN + INT_LEN + strlen(__FILE__) + 1);\
    if ( p == NULL )\
{\
    GC_Collect();\
    p = malloc( size + DOUBLE_INT_LEN + INT_LEN + strlen(__FILE__) + 1);\
    if ( p == NULL )\
{\
    return NULL;\
}\
}\
    \
    HashTable_Insert( g_pTable, p, HashInt);\
    \
    *((INT *)p) = 0;\
    *((INT *)p + 1) = size;\
    \
    q = (INT *)((char *p) + size + DOUBLE_INT_LEN);\
    *q = __LINE__;\
    psz = (char *)p + size + DOUBLE_INT_LEN + INT_LEN;\
    strcpy(psz, __FILE__);\
    \
    return (void *)((char *)p + DOUBLE_INT_LEN);\
}

/**	垃圾內(nèi)存收集算法的內(nèi)存釋放函數(shù)

	@param	void *p - 要釋放的內(nèi)存地址	
	@return	void - 無(wú)	
*/
void GC_Free(void *p)
{
    void *pFree = (void *)((char *)p - DOUBLE_INT_LEN);
    free(pFree);
}

/**	垃圾內(nèi)存收集算法的內(nèi)存泄漏檢查函數(shù)

	@return	void -無(wú)	
*/
void GC_CheckMemoryLeak()
{
    void *p;
    
    HashTable_EnumBegin(g_pTable);
    
    while ( (p = HashTable_EnumNext(g_pTable)) != NULL )
    {
        INT *pRef;  
        INT *pSize;
        INT *pLine;
        char *pszFile;
        
        pRef = (INT *)p;
        pSize = pRef + 1;
        if ( *pRef  != 0 ) //判斷引用計(jì)數(shù)是否為0
        {
            pLine = (INT *)((char *)p + *pSize + DOUBLE_INT_LEN);
            pszFile = (char *)pLine + INT_LEN;
            printf("File: %s, Line: %d have memory leak.\n", pszFile, *pLine);
        }
    }
}

#else

/**	垃圾內(nèi)存收集算法的內(nèi)存分配函數(shù)

	@param	size - 要分派的內(nèi)存大小,以字節(jié)為單位	
	@return	成功返回分配到的內(nèi)存地址,失敗返回NULL	
*/
void *GC_Malloc(size_t size)
{
    void *p = malloc( size + INT_LEN );
    if ( p == NULL )
    {
        GC_Collect();
        p = malloc( size + INT_LEN );
        if ( p == NULL )
        {
            return NULL;
        }
    }

    HashTable_Insert( g_pTable, p, HashInt);

    *((INT *)p) = 0;

    return (void *)((char *)p+INT_LEN);
}

/**	垃圾內(nèi)存收集算法的內(nèi)存釋放函數(shù)

	@param	void *p - 要釋放的內(nèi)存地址	
	@return	void - 無(wú)	
*/
void GC_Free(void *p)
{
    void *pFree = (void *)((char *)p - INT_LEN);
    free(pFree);
}
#endif 

/**	垃圾內(nèi)存收集算法的手工釋放內(nèi)存函數(shù)

	@param	void *p - 要釋放的內(nèi)存地址	
	@return	void - 無(wú)	
*/
void GC_ManualFree(void *p)
{
    void *pFree = (void *)((char *)p - INT_LEN);
    
    HashTable_Delete(g_pTable, pFree, HashInt, IntCompare, NULL);

    free(pFree);
}

/**	垃圾收集函數(shù)
        遍歷哈希表,將所有引用計(jì)數(shù)為0的內(nèi)存釋放掉

	@return	void -無(wú)	
*/
void GC_Collect()
{
    void *p;
    HashTable_EnumBegin(g_pTable);
    while ( (p = HashTable_EnumNext(g_pTable)) != NULL )
    {
        INT *pRef = (INT *)p - 1;
        if ( *pRef == 0 )
        {
            HashTable_Delete(g_pTable, p, HashInt, IntCompare, NULL);
            GC_Free(p);
        }
    }
}



/**	多任務(wù)下的垃圾內(nèi)存收集算法的初始化函數(shù)

	@param	INT nBucketCount - 哈希表的桶的數(shù)量	
	@return	INT - 成功返回CAPI_SUCCESS,失敗返回CAPI_FAILED.	
*/
INT MGC_Init(INT nBucketCount)
{
    g_lock = LockCreate();
    if ( g_lock != NULL )
    {
        g_pMTable = HashTable_Create(nBucketCount);
        if ( g_pMTable != NULL )
        {
            g_pMTask = MTask_Create();
            if ( g_pMTask != NULL )
            {
                return CAPI_SUCCESS;
            }
            else
            {
                HashTable_Destroy(g_pMTable, NULL);
                LockClose(g_lock);
            }
        }
        else
        {
            LockClose(g_lock);
        }
    }

    return CAPI_FAILED;
}

/**	多任務(wù)下的垃圾內(nèi)存收集算法的內(nèi)存分配函數(shù)

	@param	size_t size - 要分配的內(nèi)存大小,以字節(jié)為單位	
	@return	void * - 成功返回分配到的內(nèi)存地址,失敗返回NULL	
*/
void *MGC_Malloc(size_t size)
{
    void *p = malloc( size + INT_LEN );
    if ( p == NULL )
    {
        MGC_Collect();
        p = malloc( size + INT_LEN );
        if ( p == NULL )
        {
            return NULL;
        }
    }
    Lock(g_lock);

    HashTable_Insert( g_pMTable, p, HashInt);
    
    *((INT *)p) = 0;

    Unlock(g_lock);
    
    return (void *)((char *)p + INT_LEN );
}


/**	多任務(wù)下的垃圾內(nèi)存收集算法的內(nèi)存釋放函數(shù)

	@param	void *p - 要釋放的內(nèi)存地址	
	@return	void - 無(wú)	
*/
void MGC_Free(void *p)
{
    void *pFree = (void *)((char *)p - INT_LEN);
    free(pFree);
}

/**	多任務(wù)下的垃圾內(nèi)存收集算法的手工釋放內(nèi)存函數(shù)

	@param	void *p - 要釋放的內(nèi)存地址	
	@return	void - 無(wú)	
*/
void MGC_ManualFree(void *p)
{
    void *pFree = (void *)((char *)p - INT_LEN);

    Lock(g_lock);
    HashTable_Delete(g_pMTable, pFree, HashInt, IntCompare, NULL);
    Unlock(g_lock);
    
    free(pFree);
}

/**	支持多任務(wù)的垃圾收集函數(shù)
        遍歷哈希表,將所有引用計(jì)數(shù)為0的內(nèi)存釋放掉

	@return	void -無(wú)	
*/
void MGC_Collect()
{
    void *p;

    Lock(g_lock);
    HashTable_EnumBegin(g_pMTable);
    while ( (p = HashTable_EnumNext(g_pMTable)) != NULL )
    {
        INT *pRef = (INT *)((char *)p - INT_LEN);
        if ( *pRef == 0 )
        {
            HashTable_Delete(g_pMTable, p, HashInt, IntCompare, NULL);
            MGC_Free(p);
        }
    }
    Unlock(g_lock);
}

/**	支持多任務(wù)的垃圾收集函數(shù)
        遍歷哈希表,將所有引用計(jì)數(shù)為0的內(nèi)存釋放掉

	@return	void -無(wú)	
*/
void MGC_CollectTask()
{
    void *p;
    UINT i;

    MTask_EnterTask(g_pMTask);

    Lock(g_lock);
    HashTable_EnumBegin(g_pMTable);
    Unlock(g_lock);

    while (MTask_GetExitFlag(g_pMTask) == MTASK_NO_EXIT) 
    {
        Lock(g_lock);
        
        /* 為提高效率減少解鎖次數(shù),每次上鎖后循環(huán)一定次數(shù) */
        for ( i = 0; i < GC_COLLECT_ENUM_COUNT; i++ )
        {
            p = HashTable_EnumNext(g_pMTable);
            if ( p != NULL )
            {
                INT *pRef = (INT *)((char *)p - INT_LEN);
                if ( *pRef == 0 )
                {
                    HashTable_Delete(g_pMTable, p, HashInt, IntCompare, NULL);
                    MGC_Free(p);
                }
            }
            else
            {
                break;
            }
        }

        Unlock(g_lock);
        Sleep(100);
    }

    MTask_LeaveTask(g_pMTask);
    
    return;
}

/**	垃圾收集的關(guān)閉函數(shù),必須在程序運(yùn)行的最后面執(zhí)行,建議調(diào)用atexit()
        函數(shù)來(lái)執(zhí)行這個(gè)函數(shù)

	@return	void -無(wú)	
*/
void MGC_Shutdown()
{

    MTask_Destroy(g_pMTask);

    Lock(g_lock);

    HashTable_Destroy(g_pTable, free);
    HashTable_Destroy(g_pMTable, free);

    LockClose(g_lock);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩不卡在线| 日韩激情一二三区| 欧美综合在线视频| 欧美午夜影院一区| 激情伊人五月天久久综合| 久久久精品免费观看| 在线区一区二视频| 国产91丝袜在线观看| 亚洲愉拍自拍另类高清精品| 91麻豆精品国产| 日本视频免费一区| 亚洲一区二区欧美激情| 久久综合狠狠综合久久综合88 | 亚洲bt欧美bt精品777| 欧美岛国在线观看| 在线观看av一区二区| 日本欧美大码aⅴ在线播放| 国产视频一区在线观看| 911精品国产一区二区在线| 国产一区二区三区视频在线播放| 亚洲精品视频自拍| 久久久久国产精品麻豆ai换脸| 成人免费看黄yyy456| 日本不卡一区二区三区| 亚洲日本青草视频在线怡红院 | 日本一区二区三区dvd视频在线| 成人av在线资源网站| 日本最新不卡在线| 亚洲人妖av一区二区| 久久久91精品国产一区二区精品| 欧美日本不卡视频| 色域天天综合网| 国产成人免费在线观看| 看电影不卡的网站| 亚洲自拍偷拍图区| 国产精品福利电影一区二区三区四区 | 成人av集中营| 亚洲18女电影在线观看| 最新中文字幕一区二区三区| 久久一留热品黄| 91精品婷婷国产综合久久竹菊| 91免费看视频| 成人性色生活片| 成人性生交大片免费 | 欧美日韩精品高清| 欧美一区二区大片| 精品剧情在线观看| 久久综合久久综合久久综合| 日韩午夜激情免费电影| 日韩欧美国产一区二区在线播放 | 午夜精品久久久久久| 亚洲r级在线视频| 日韩电影在线免费观看| 视频一区二区三区入口| 免费一区二区视频| 久久成人av少妇免费| 国产一区二三区好的| 国产成a人亚洲精品| jiyouzz国产精品久久| 99re热这里只有精品免费视频| 色欧美乱欧美15图片| 精品视频全国免费看| 7777精品伊人久久久大香线蕉经典版下载| 在线综合+亚洲+欧美中文字幕| 欧美videossexotv100| 久久久久国产精品厨房| 国产精品久99| 亚洲综合色成人| 日韩电影网1区2区| 狠狠久久亚洲欧美| 成人丝袜视频网| 在线欧美小视频| 精品乱人伦小说| 国产精品久久午夜夜伦鲁鲁| 亚洲黄色免费电影| 毛片一区二区三区| 成人网在线播放| 欧美精品视频www在线观看| 精品少妇一区二区三区在线播放 | 欧美精品一区二区三区四区| 国产精品欧美极品| 亚洲成人精品一区| 国产a精品视频| 欧美日本精品一区二区三区| 日本一区二区三区电影| 午夜一区二区三区在线观看| 国产综合成人久久大片91| 97国产一区二区| 日韩女同互慰一区二区| 中文字幕一区二区三区不卡 | 91精品国产综合久久久蜜臀粉嫩| 国产日韩欧美a| 视频精品一区二区| 97se亚洲国产综合自在线观| 日韩精品中午字幕| 亚洲日本一区二区三区| 狠狠色综合日日| 欧美性感一类影片在线播放| 2023国产精品自拍| 香蕉久久一区二区不卡无毒影院| 风间由美一区二区av101| 欧美一级片在线看| 亚洲女人****多毛耸耸8| 国产乱一区二区| 欧美区视频在线观看| 国产精品嫩草影院av蜜臀| 美女在线一区二区| 欧美专区亚洲专区| 国产精品电影院| 国产在线精品一区二区| 欧美日韩一区二区三区四区五区| 中文天堂在线一区| 国产乱理伦片在线观看夜一区| 精品视频资源站| 亚洲欧美一区二区久久| 国产69精品一区二区亚洲孕妇| 欧美电影免费观看高清完整版在线 | 国产又黄又大久久| 欧美一级精品在线| 午夜电影网亚洲视频| 色哟哟在线观看一区二区三区| 国产日韩精品久久久| 国产露脸91国语对白| 欧美成人三级电影在线| 日日夜夜免费精品视频| 欧美在线一二三| 亚洲欧美在线另类| 成人精品一区二区三区四区| 久久亚洲捆绑美女| 久久91精品国产91久久小草| 欧美一级在线视频| 蜜桃视频第一区免费观看| 欧美日韩国产欧美日美国产精品| 一区二区三区91| 色偷偷88欧美精品久久久| 亚洲日本va在线观看| 99精品久久久久久| **网站欧美大片在线观看| av动漫一区二区| 国产精品欧美一区二区三区| 成人av午夜电影| 亚洲欧洲av另类| www.66久久| 日韩久久一区二区| 91黄色激情网站| 亚洲在线观看免费| 在线综合视频播放| 捆绑变态av一区二区三区| 日韩午夜小视频| 国产精选一区二区三区| 国产喷白浆一区二区三区| 成人黄色软件下载| 亚洲主播在线观看| 欧美剧情片在线观看| 麻豆成人av在线| 久久亚洲精华国产精华液| 国产精品夜夜嗨| 国产精品久久久久久久久果冻传媒| a4yy欧美一区二区三区| 亚洲最快最全在线视频| 欧美精品久久久久久久久老牛影院| 日本中文字幕一区二区有限公司| www国产精品av| 99精品视频在线免费观看| 一区二区激情小说| 日韩视频在线永久播放| 国产精品一区在线观看你懂的| 中文字幕av在线一区二区三区| 91啪九色porn原创视频在线观看| 亚洲国产精品一区二区久久恐怖片 | 香蕉av福利精品导航| 日韩三级高清在线| 国产成人aaa| 一区二区三区四区中文字幕| 欧美一卡2卡3卡4卡| 福利电影一区二区三区| 亚洲一区二区三区影院| 日韩免费性生活视频播放| 99久久久久免费精品国产| 日韩影视精彩在线| 欧美国产日韩在线观看| 欧美日韩国产一级二级| 成人亚洲一区二区一| 午夜成人免费电影| 国产精品免费av| 91精品国产一区二区三区香蕉| 国产成人在线网站| 日韩成人午夜精品| 国产精品初高中害羞小美女文| 91麻豆精品久久久久蜜臀| 波多野结衣亚洲| 美女一区二区在线观看| 亚洲色图制服丝袜| 亚洲精品一区二区三区四区高清| 一本大道久久a久久精二百| 韩国精品主播一区二区在线观看| 亚洲欧美色图小说| 久久精品一区蜜桃臀影院| 欧美日韩国产高清一区二区| 成人免费视频网站在线观看|