Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

276 lines
5.4 KiB

/*++
Copyright (c) 2001 Microsoft Corporation
Abstract:
Implementation of helper classes.
Author:
Souren Aghajanyan (sourenag) 24-Sep-2001
Revision History:
<alias> <date> <comments>
--*/
#include "pch.h"
#include "log.h"
#include "log_man.h"
#include "functions.h"
BOOL
CMutualExclusionObject::Open(
IN PCWSTR pNameOfObject,
IN BOOL bInitialOwnership,
IN UINT SpinCount
)
{
m_hHandle = g_OpenMutex(pNameOfObject);
if(m_hHandle){
if(bInitialOwnership){
Acquiry();
}
return TRUE;
}
m_hHandle = g_CreateMutex(pNameOfObject, bInitialOwnership);
if(!m_hHandle){
return FALSE;
}
m_SpinCount = (g_GetProcessorsNumber() > 1)? SpinCount: 0;
return TRUE;
}
VOID
CMutualExclusionObject::Close(
VOID
)
{
if(!m_hHandle){
return;
}
g_CloseHandle(m_hHandle);
m_hHandle = NULL;
m_SpinCount = 0;
}
VOID
CMutualExclusionObject::Acquiry(
VOID
)
{
if(!m_hHandle){
ASSERT(m_hHandle);
return;
}
for(UINT i = 0; i < m_SpinCount; i++){
if(WAIT_TIMEOUT != g_WaitForSingleObject(m_hHandle, 0)){
return;
}
}
g_WaitForSingleObject(m_hHandle, INFINITE);
}
VOID
CMutualExclusionObject::Release(
VOID
)
{
if(!m_hHandle){
ASSERT(m_hHandle);
return;
}
g_ReleaseMutex(m_hHandle);
}
BOOL
CSharedMemory::Open(
IN PCWSTR pNameOfObject,
IN UINT uiInitialSizeOfMapView,
IN BOOL * pAlreadyExist OPTIONAL
)
{
m_hHandle = g_OpenSharedMemory(pNameOfObject);
if(m_hHandle){
if(pAlreadyExist){
*pAlreadyExist = TRUE;
}
}
else{
m_hHandle = g_CreateSharedMemory(uiInitialSizeOfMapView, pNameOfObject);
if(!m_hHandle){
return FALSE;
}
if(pAlreadyExist){
*pAlreadyExist = FALSE;
}
}
m_ViewOfSection = g_MapSharedMemory(m_hHandle);
if(!m_ViewOfSection){
Close();
return FALSE;
}
return TRUE;
}
VOID CSharedMemory::Close(
VOID
)
{
if(m_hHandle){
if(m_ViewOfSection){
g_UnMapSharedMemory(m_ViewOfSection);
m_ViewOfSection = NULL;
}
g_CloseHandle(m_hHandle);
m_hHandle = NULL;
}
}
PVOID
CBuffer::Allocate(
IN UINT uiSize
)
{
#define DEFAULT_SIZE (1<<12)
if(!m_pvBuffer){
UINT uiTempSize = uiSize? uiSize: DEFAULT_SIZE;
m_pvBuffer = MALLOC(uiSize);
if(!m_pvBuffer){
return FALSE;
}
m_uiSize = uiSize;
m_uiUsedSize = uiTempSize;
}
else
{
if(m_uiSize < uiSize){
FREE(m_pvBuffer);
m_pvBuffer = MALLOC(uiSize);
if(!m_pvBuffer){
m_uiUsedSize = m_uiSize = 0;
return FALSE;
}
m_uiUsedSize = m_uiSize = uiSize;
}
else{
m_uiUsedSize = uiSize;
}
}
return m_pvBuffer;
}
BOOL
CBuffer::PreAllocate(
IN UINT uiSize
)
{
if(Allocate(uiSize)){
Allocate(0);
return TRUE;
}
return FALSE;
}
PVOID
CBuffer::ReAllocate(
IN UINT uiSize
)
{
ASSERT(uiSize);
if(!m_pvBuffer){
return Allocate(uiSize);
}
if(m_uiSize < uiSize){
PVOID pvBuffer = REALLOC(m_pvBuffer, uiSize);
if(!pvBuffer){
return NULL;
}
m_pvBuffer = pvBuffer;
m_uiUsedSize = m_uiSize = uiSize;
}
else{
m_uiUsedSize = uiSize;
}
return m_pvBuffer;
}
BOOL
CSharedAccessFile::Open(
IN PCWSTR pFilePath,
IN BOOL SharedWriteAccess,
IN BOOL CreateAlwaysNewIfPossible,
IN BOOL bWriteThrough,
IN BOOL * pbAlreadyOpened
)
{
BOOL bAlreadyOpened = FALSE;
m_hHandle = g_CreateSharedFile(pFilePath, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL);
if(INVALID_HANDLE_VALUE != m_hHandle){
g_CloseHandle(m_hHandle);
bAlreadyOpened = FALSE;
}
else{
bAlreadyOpened = (ERROR_SHARING_VIOLATION == GetLastError());
}
if(pbAlreadyOpened){
*pbAlreadyOpened = bAlreadyOpened;
}
m_hHandle = g_CreateSharedFile(pFilePath,
SharedWriteAccess? FILE_SHARE_WRITE | FILE_SHARE_READ: 0,
(CreateAlwaysNewIfPossible && !bAlreadyOpened)? CREATE_ALWAYS: OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL | (bWriteThrough? FILE_FLAG_WRITE_THROUGH: 0));
if(INVALID_HANDLE_VALUE == m_hHandle){
return FALSE;
}
return TRUE;
}
VOID
CSharedAccessFile::Close()
{
if(INVALID_HANDLE_VALUE != m_hHandle){
g_CloseHandle(m_hHandle);
m_hHandle = INVALID_HANDLE_VALUE;
}
}
BOOL
CSharedAccessFile::Append(
IN PVOID pBuffer,
IN UINT Size
)
{
DWORD dwNumberOfBytesWritten;
ASSERT(pBuffer && Size);
g_SetFilePointer(m_hHandle, 0, FILE_END);
BOOL bResult = g_WriteFile(m_hHandle, pBuffer, Size, &dwNumberOfBytesWritten);
return bResult;
}