⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtree.c

📁 操作系统中的一个例子
💻 C
字号:
/*
 * 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.  
 */

#ifdef _WIN32
#include <windows.h>
#endif 

#include "CapiGlobal.h"
#include "MTask.h"
#include "BinTree.h"
#include "RBTree.h"
#include "MTree.h"

typedef struct MTREE_st {
    RBTREE      *pRBTree;
    RBTREENODE  *pCursor;
    MTASK       *pMTask;
} MTREE;



/**	多任务树的创建函数

	@param	void - 无	
	@return	HANDLE - 成功返回多任务树的句柄,失败返回NULL	
*/
HANDLE MTree_Create(void)
{
    MTREE   *pTree;

    pTree = (MTREE *)malloc(sizeof(MTREE));
    if ( pTree != NULL )
    {
        pTree->pMTask = MTask_Create();
        if ( pTree->pMTask != NULL )
        {
            pTree->pRBTree = RBTree_Create();
            if ( pTree->pRBTree != NULL )
            {
                pTree->pCursor = NULL;
            }
            else
            {
                free( pTree->pMTask);
                free( pTree );
                pTree = NULL;
            }
        }
        else
        {
            free( pTree );
            pTree = NULL;
        }
    }
    return (HANDLE)pTree;
}


/**	多任务树的释放函数

	@param	HANDLE hTree - 多任务树的句柄	
	@param	DESTROYFUNC DestroyFunc - 数据释放回调函数	
	@return	void - 无	
*/
void MTree_Destroy(HANDLE hTree, DESTROYFUNC DestroyFunc)
{
    MTREE   *pTree;

    pTree = (MTREE *)hTree;
    if ( pTree == NULL )
    {
        return;
    }

    MTask_Destroy(pTree->pMTask);

    RBTree_Destroy( pTree->pRBTree, DestroyFunc );

    free( pTree );
}


/**	多任务树的设置退出标志函数

	@param	HANDLE hTree - 多任务树句柄	
    @param	UINT uExitFlag - 退出标志,MTASK_NO_EXIT表示不退出任务,
                    MTASK_EXIT表示退出任务。	
	@return	void - 无	
*/
void MTree_SetExitFlag(HANDLE hTree, UINT uExitFlag )
{
    MTREE   *pTree;

    pTree = (MTREE *)hTree;
    
    MTask_SetExitFlag(pTree->pMTask, uExitFlag);
}


/**	多任务树的获取退出标志函数

	@param	HANDLE hTree - 多任务树句柄	
    @return	UINT - 返回获取到的退出标志,MTASK_NO_EXIT表示不退出任务,
                    MTASK_EXIT表示退出任务。
	
*/
UINT MTree_GetExitFlag(HANDLE hTree )
{
    MTREE   *pTree;

    pTree = (MTREE *)hTree;
    
    return MTask_GetExitFlag(pTree->pMTask);
}


/**	多任务树的进入任务函数

	@param	HANDLE hTree - 多任务树的句柄	
	@return	void - 无	
*/
void MTree_EnterTask(HANDLE hTree )
{
    MTREE   *pTree;

    pTree = (MTREE *)hTree;

    MTask_EnterTask(pTree->pMTask);
}


/**	多任务树的离开任务函数

	@param	HANDLE hTree - 多任务树的句柄	
	@return	void - 无	
*/
void MTree_LeaveTask(HANDLE hTree )
{
    MTREE   *pTree;

    pTree = (MTREE *)hTree;

    MTask_LeaveTask(pTree->pMTask);
}



/**	多任务树的数据插入函数

	@param	HANDLE hTree - 多任务树的句柄	
	@param	void *pData - 要插入的数据指针	
	@param	COMPAREFUNC CompareFunc - 数据比较函数	
	@return	INT - 和RBTree_Insert()函数的返回值相同	
*/
INT MTree_Insert(HANDLE hTree, void *pData, COMPAREFUNC CompareFunc)
{
    MTREE   *pTree;
    INT     nRet;

    pTree = (MTREE *)hTree;
    
    MTask_Lock(pTree->pMTask);

    nRet = RBTree_Insert(pTree->pRBTree, pData, CompareFunc);

    MTask_Unlock(pTree->pMTask);

    return nRet;
}


/**	多任务树的删除数据函数

	@param	HANDLE hTree - 多任务树的句柄	
	@param	void *pData - 要删除的数据指针	
	@param	COMPAREFUNC CompareFunc - 数据比较回调函数	
	@param	DESTROYFUNC DestroyFunc - 数据释放回调函数	
	@return	INT - 同RBTree_Delete()函数	
*/
INT MTree_Delete(HANDLE hTree, void *pData, COMPAREFUNC CompareFunc, 
                 DESTROYFUNC DestroyFunc)
{
    MTREE   *pTree;
    INT     nRet;

    pTree = (MTREE *)hTree;

    MTask_Lock(pTree->pMTask);

    nRet = RBTree_Delete(pTree->pRBTree, pData, CompareFunc, DestroyFunc);

    MTask_Unlock(pTree->pMTask);

    return nRet;
}


/**	多任务树的枚举开始函数

	@param	HANDLE hTree - 多任务树句柄	
	@return	void - 无	
*/
void MTree_EnumBegin(HANDLE hTree)
{
    MTREE   *pTree;

    pTree = (MTREE *)hTree;
    MTask_Lock(pTree->pMTask);

    RBTree_EnumBegin(pTree->pRBTree);

    MTask_Unlock(pTree->pMTask);

}


/**	多任务树的枚举下一个并拷贝节点函数

	@param	HANDLE hTree - 多任务树的句柄	
	@param	COPYFUNC CopyFunc - 数据拷贝回调函数	
	@return	void * - 返回拷贝的数据	
*/
void * MTree_EnumNextCopy(HANDLE hTree, COPYFUNC CopyFunc)
{
    MTREE   *pTree;
    void    *pData;

    pTree = (MTREE *)hTree;

    MTask_Lock(pTree->pMTask);

    pData = RBTree_EnumNext(pTree->pRBTree);

    pData = (*CopyFunc)(pData);

    MTask_Unlock(pTree->pMTask);

    return pData;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -