blob: 5f5c3e6148917bc4719a7335509647ae2e005d8f [file]
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
/*++
Module Name:
palobjbase.hpp
Abstract:
PAL object base class
--*/
#ifndef _PALOBJBASE_HPP_
#define _PALOBJBASE_HPP_
#include "pal/corunix.hpp"
#include "pal/cs.hpp"
#include "pal/thread.hpp"
namespace CorUnix
{
class CSimpleDataLock : IDataLock
{
private:
CRITICAL_SECTION m_cs;
bool m_fInitialized;
public:
CSimpleDataLock()
:
m_fInitialized(FALSE)
{
};
virtual ~CSimpleDataLock()
{
if (m_fInitialized)
{
InternalDeleteCriticalSection(&m_cs);
}
};
PAL_ERROR
Initialize(
void
)
{
PAL_ERROR palError = NO_ERROR;
InternalInitializeCriticalSection(&m_cs);
m_fInitialized = TRUE;
return palError;
};
void
AcquireLock(
CPalThread *pthr,
IDataLock **pDataLock
)
{
InternalEnterCriticalSection(pthr, &m_cs);
*pDataLock = static_cast<IDataLock*>(this);
};
virtual
void
ReleaseLock(
CPalThread *pthr,
bool fDataChanged
)
{
InternalLeaveCriticalSection(pthr, &m_cs);
};
};
class CPalObjectBase : public IPalObject
{
template <class T> friend void InternalDelete(T *p);
protected:
LONG m_lRefCount;
VOID *m_pvImmutableData;
VOID *m_pvLocalData;
CObjectType *m_pot;
CObjectAttributes m_oa;
CSimpleDataLock m_sdlLocalData;
//
// The thread that initiated object cleanup
//
CPalThread *m_pthrCleanup;
virtual ~CPalObjectBase();
virtual
void
AcquireObjectDestructionLock(
CPalThread *pthr
) = 0;
virtual
bool
ReleaseObjectDestructionLock(
CPalThread *pthr,
bool fDestructionPending
) = 0;
public:
CPalObjectBase(
CObjectType *pot
)
:
m_lRefCount(1),
m_pvImmutableData(NULL),
m_pvLocalData(NULL),
m_pot(pot),
m_pthrCleanup(NULL)
{
};
virtual
PAL_ERROR
Initialize(
CPalThread *pthr,
CObjectAttributes *poa
);
//
// IPalObject routines
//
virtual
CObjectType *
GetObjectType(
VOID
);
virtual
CObjectAttributes *
GetObjectAttributes(
VOID
);
virtual
PAL_ERROR
GetImmutableData(
void **ppvImmutableData // OUT
);
virtual
PAL_ERROR
GetProcessLocalData(
CPalThread *pthr, // IN, OPTIONAL
LockType eLockRequest,
IDataLock **ppDataLock, // OUT
void **ppvProcessLocalData // OUT
);
virtual
DWORD
AddReference(
void
);
virtual
DWORD
ReleaseReference(
CPalThread *pthr
);
};
}
#endif // _PALOBJBASE_HPP_