📄 mymutex_win32.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 + -