Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
这个其实是一个线程安全的int mapper

void alThunkInit(void);
void alThunkExit(void);
ALuint alThunkAddEntry(ALvoid 
* ptr);
void alThunkRemoveEntry(ALuint index);
ALvoid 
*alThunkLookupEntry(ALuint index);


typedef 
struct {
    ALvoid 
*ptr;
    ALboolean InUse;
} ThunkEntry;

static ThunkEntry *g_ThunkArray;
static ALuint      g_ThunkArraySize;

static CRITICAL_SECTION g_ThunkLock;

void alThunkInit(void)
{
    InitializeCriticalSection(
&g_ThunkLock);
    g_ThunkArraySize 
= 1;
    g_ThunkArray 
= calloc(1, g_ThunkArraySize * sizeof(ThunkEntry));
}

void alThunkExit(void)
{
    free(g_ThunkArray);
    g_ThunkArray 
= NULL;
    g_ThunkArraySize 
= 0;
    DeleteCriticalSection(
&g_ThunkLock);
}

ALuint alThunkAddEntry(ALvoid 
*ptr)
{
    ALuint index;

    EnterCriticalSection(
&g_ThunkLock);

    
for(index = 0;index < g_ThunkArraySize;index++)
    {
        
if(g_ThunkArray[index].InUse == AL_FALSE)
            
break;
    }

    
if(index == g_ThunkArraySize)
    {
        ThunkEntry 
*NewList;

        NewList 
= realloc(g_ThunkArray, g_ThunkArraySize*2 * sizeof(ThunkEntry));
        
if(!NewList)
        {
            LeaveCriticalSection(
&g_ThunkLock);
            
return 0;
        }
        memset(
&NewList[g_ThunkArraySize], 0, g_ThunkArraySize*sizeof(ThunkEntry));
        g_ThunkArraySize 
*= 2;
        g_ThunkArray 
= NewList;
    }

    g_ThunkArray[index].ptr 
= ptr;
    g_ThunkArray[index].InUse 
= AL_TRUE;

    LeaveCriticalSection(
&g_ThunkLock);

    
return index+1;
}

void alThunkRemoveEntry(ALuint index)
{
    EnterCriticalSection(
&g_ThunkLock);

    
if(index > 0 && index <= g_ThunkArraySize)
        g_ThunkArray[index
-1].InUse = AL_FALSE;

    LeaveCriticalSection(
&g_ThunkLock);
}

ALvoid 
*alThunkLookupEntry(ALuint index)
{
    ALvoid 
*ptr = NULL;

    EnterCriticalSection(
&g_ThunkLock);

    
if(index > 0 && index <= g_ThunkArraySize)
        ptr 
= g_ThunkArray[index-1].ptr;

    LeaveCriticalSection(
&g_ThunkLock);

    
return ptr;
}
用途比较广
posted on 2015-06-29 13:24 ccsdu2009 阅读(300) 评论(0)  编辑 收藏 引用 所属分类: 编程基础

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理