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

📄 mymutex_win32.c

📁 sourceforge历史版本完整下载: http://sourceforge.net/project/showfiles.php?group_id=202044 提供了基于b树索引算法的文件数据数据
💻 C
字号:
/*
*
*mymutex_win32.c 互斥锁 lin shao chuan
*
*/


#include "mymutex.h"
#include <assert.h>
#include <windows.h>
#include "mylog.h"


typedef struct __mymutex_t_
{
	HANDLE hmtx;
	HMYMEMPOOL hm;
}mymutex_t;


/*
*
*创建互斥锁
*
*/
HMYMUTEX MyMutexConstruct(HMYMEMPOOL hm)
{
	mymutex_t * mt = MyMemPoolMalloc(hm, sizeof(*mt));
	if(NULL == mt)
		return NULL;

	mt->hm = hm;
	mt->hmtx = CreateMutex(NULL, FALSE, NULL);
	if(NULL == mt->hmtx)
	{
		LOG_WARN(("fail create mutex"));

		MyMemPoolFree(hm, mt);
		return NULL;
	}

	return (HMYMUTEX)mt;
}

/*
*
*锁毁互斥锁
*
*/
void MyMutexDestruct(HMYMUTEX hmx)
{
	mymutex_t * mt = (mymutex_t *)hmx;
	if(NULL == mt)
		return;

	assert(mt->hmtx);

	if(WAIT_TIMEOUT == WaitForSingleObject(mt->hmtx, 0))
		ReleaseMutex(mt->hmtx);

	CloseHandle(mt->hmtx);
	mt->hmtx = NULL;

	MyMemPoolFree(mt->hm, mt);
}

/*
*
*加锁 0:成功, -1:失败
*
*/
int MyMutexLock(HMYMUTEX hmx)
{
	DWORD ret = 0;
	mymutex_t * mt = (mymutex_t *)hmx;
	if(NULL == mt || NULL == mt->hmtx)
		return -1;

	ret = WaitForSingleObject(mt->hmtx, INFINITE);
	if(WAIT_OBJECT_0 == ret)
		return 0;

	return -1;
}

int MyMutexTryLock(HMYMUTEX hmx)
{
	DWORD ret = 0;
	mymutex_t * mt = (mymutex_t *)hmx;
	if(NULL == mt || NULL == mt->hmtx)
		return -1;

	ret = WaitForSingleObject(mt->hmtx, 0);
	if(WAIT_OBJECT_0 == ret)
		return 0;

	return -1;
}

/*
*
*解锁
*
*/
int MyMutexUnLock(HMYMUTEX hmx)
{
	mymutex_t * mt = (mymutex_t *)hmx;
	if(NULL == mt || NULL == mt->hmtx)
		return -1;

	return (ReleaseMutex(mt->hmtx)) ? (0): (-1);
}

#ifdef WIN32
/*
*
*获取句柄
*
*/
HANDLE MyMutexGetHandle(HMYMUTEX hmx)
{
	mymutex_t * mt = (mymutex_t *)hmx;
	if(NULL == mt)
		return NULL;

	return mt->hmtx;
}
#endif


















⌨️ 快捷键说明

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