Files
common/Global/SimpleMutex.cpp
2026-06-12 23:18:12 +08:00

89 lines
1.6 KiB
C++

#include <windows.h>
//#include <process.h>
#include <stdio.h>
#include "SimpleMutex.h"
//#include "GlobalUnit.h"
////////////////////////////////////////////////////////////////////
//CSema
CSema::CSema(const char *sName, unsigned int nInit, bool bCreate)
{
m_bCreate = bCreate;
if (!m_bCreate)
return;
m_hSema = CreateSemaphore(NULL,nInit,0xffff,NULL);
if (!m_hSema){
char txt[256];
sprintf(txt, "Create semaphore error, errno=%d\n", errno);
OutputDebugStringA( txt );
}
}
CSema::~CSema()
{
if (!m_bCreate)
return;
if( !CloseHandle(m_hSema) ){
char txt[256];
sprintf(txt, "Close semaphore error, errno=%d\n", errno);
OutputDebugStringA( txt );
}
}
int CSema::ActP(DWORD dwTimeout)
{
if (!m_bCreate)
return -1;
int ret = WaitForSingleObject(m_hSema, dwTimeout);
if( ret==WAIT_TIMEOUT ){
OutputDebugStringA("WaitforSingleObject timeout!\n");
return 1;
}
else if( ret!=0 ){
char txt[256];
sprintf(txt, "sema wait error, errno=%d\n", errno);
OutputDebugStringA( txt );
}
return ret;
}
void CSema::ActV()
{
if (!m_bCreate)
return;
if (!ReleaseSemaphore(m_hSema,1,NULL)){
char txt[256];
sprintf(txt, "sema release error, errno=%d\n", errno);
OutputDebugStringA( txt );
}
}
////////////////////////////////////////////////////////////////////
//CMutextLock
CMutexLock::CMutexLock(bool bCreate)
{
m_psmMut = new CSema( NULL, 1, bCreate );
m_psmMut->ActP();
}
CMutexLock::CMutexLock(CSema * pSema, DWORD dwTimeOut)
{
m_psmMut = pSema;
m_psmMut->ActP(dwTimeOut);
}
CMutexLock::~CMutexLock()
{
if( m_psmMut!=NULL )
m_psmMut->ActV();
}
////////////////////////////////////////////////////////////////////