mirror of
https://github.com/ldematte/HostedPumpkin
synced 2026-06-08 15:25:15 +00:00
164 lines
4.5 KiB
C++
164 lines
4.5 KiB
C++
#include "SyncMgr.h"
|
|
|
|
#include "../Logger.h"
|
|
|
|
// Include all the memory objects created by this manager
|
|
#include "Crst.h"
|
|
#include "AutoEvent.h"
|
|
#include "ManualEvent.h"
|
|
#include "Semaphore.h"
|
|
|
|
SHSyncManager::SHSyncManager() {
|
|
m_cRef = 0;
|
|
m_pCLRSyncManager = NULL;
|
|
}
|
|
|
|
SHSyncManager::~SHSyncManager() {
|
|
m_pCLRSyncManager->Release();
|
|
}
|
|
|
|
// IUnknown functions
|
|
|
|
STDMETHODIMP_(DWORD) SHSyncManager::AddRef() {
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
|
|
STDMETHODIMP_(DWORD) SHSyncManager::Release() {
|
|
ULONG cRef = InterlockedDecrement(&m_cRef);
|
|
if (cRef == 0) {
|
|
delete this;
|
|
}
|
|
return cRef;
|
|
}
|
|
|
|
STDMETHODIMP SHSyncManager::QueryInterface(const IID &riid, void **ppvObject) {
|
|
if (riid == IID_IUnknown || riid == IID_IHostSyncManager) {
|
|
*ppvObject = this;
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
*ppvObject = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
// IHostSyncManager functions
|
|
|
|
STDMETHODIMP SHSyncManager::SetCLRSyncManager(/* in */ ICLRSyncManager *pManager) {
|
|
Logger::Info("In SyncManager::SetCLRSyncManager");
|
|
m_pCLRSyncManager = pManager;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP SHSyncManager::CreateCrst(/* out */ IHostCrst **ppCrst) {
|
|
Logger::Info("In SyncManager::CreateCrst");
|
|
|
|
IHostCrst* pCrst = new SHCrst;
|
|
if (!pCrst) {
|
|
Logger::Error("Failed to allocate a new Crst");
|
|
*ppCrst = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pCrst->QueryInterface(IID_IHostCrst, (void**) ppCrst);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP SHSyncManager::CreateCrstWithSpinCount(/* in */ DWORD dwSpinCount, /* out */ IHostCrst **ppCrst) {
|
|
Logger::Info("In SyncManager::CreateCrstWithSpinCount");
|
|
|
|
IHostCrst* pCrst = new SHCrst(dwSpinCount);
|
|
if (!pCrst) {
|
|
Logger::Error("Failed to allocate a new CrstWithSpinCount");
|
|
*ppCrst = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pCrst->QueryInterface(IID_IHostCrst, (void**) ppCrst);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP SHSyncManager::CreateAutoEvent(/* out */IHostAutoEvent **ppEvent) {
|
|
Logger::Info("In SyncManager::CreateAutoEvent");
|
|
|
|
SHAutoEvent* pEvent = new SHAutoEvent((SIZE_T)-1);
|
|
if (!pEvent) {
|
|
Logger::Error("Failed to allocate a new AutoEvent");
|
|
*ppEvent = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pEvent->QueryInterface(IID_IHostAutoEvent, (void**) ppEvent);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP SHSyncManager::CreateManualEvent(/* in */ BOOL bInitialState, /* out */ IHostManualEvent **ppEvent) {
|
|
Logger::Info("In SyncManager::CreateManualEvent");
|
|
|
|
SHManualEvent* pEvent = new SHManualEvent(bInitialState);
|
|
if (!pEvent) {
|
|
Logger::Error("Failed to allocate a new ManualEvent");
|
|
*ppEvent = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pEvent->QueryInterface(IID_IHostManualEvent, (void**) ppEvent);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP SHSyncManager::CreateMonitorEvent(/* in */ SIZE_T Cookie, /* out */ IHostAutoEvent **ppEvent) {
|
|
Logger::Info("In SyncManager::CreateMonitorEvent");
|
|
|
|
SHAutoEvent* pEvent = new SHAutoEvent(Cookie);
|
|
if (!pEvent) {
|
|
Logger::Error("Failed to allocate a new AutoEvent");
|
|
*ppEvent = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pEvent->QueryInterface(IID_IHostAutoEvent, (void**) ppEvent);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP SHSyncManager::CreateRWLockWriterEvent(/* in */ SIZE_T Cookie, /* out */ IHostAutoEvent **ppEvent) {
|
|
Logger::Info("In SyncManager::CreateRWLockWriterEvent");
|
|
|
|
SHAutoEvent* pEvent = new SHAutoEvent(Cookie);
|
|
if (!pEvent) {
|
|
Logger::Error("Failed to allocate a new AutoEvent");
|
|
*ppEvent = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pEvent->QueryInterface(IID_IHostAutoEvent, (void**) ppEvent);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP SHSyncManager::CreateRWLockReaderEvent(/* in */ BOOL bInitialState, /* in */ SIZE_T Cookie, /* out */ IHostManualEvent **ppEvent) {
|
|
Logger::Info("In SyncManager::CreateRWLockReaderEvent");
|
|
|
|
SHAutoEvent* pEvent = new SHAutoEvent(Cookie, bInitialState);
|
|
if (!pEvent) {
|
|
Logger::Error("Failed to allocate a new AutoEvent");
|
|
*ppEvent = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pEvent->QueryInterface(IID_IHostAutoEvent, (void**) ppEvent);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP SHSyncManager::CreateSemaphore(/* in */ DWORD dwInitial, /* in */ DWORD dwMax, /* out */ IHostSemaphore **ppSemaphore) {
|
|
Logger::Info("In SyncManager::CreateSemaphore");
|
|
|
|
SHSemaphore* pSemaphore = new SHSemaphore(dwInitial, dwMax);
|
|
if (!pSemaphore) {
|
|
Logger::Error("Failed to allocate a new Semaphore");
|
|
*ppSemaphore = NULL;
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pSemaphore->QueryInterface(IID_IHostSemaphore, (void**) ppSemaphore);
|
|
return S_OK;
|
|
}
|