Windows2003-3790/inetsrv/query/h/shardbuf.hxx
2020-09-30 16:53:55 +02:00

141 lines
3.4 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: shardbuf.hxx
//
// Contents: A shared buffer used by the bigtable code to create temporary
// variants. Rather than allocate memory each time, this will
// facilitate usage of a single buffer.
//
// Classes: CSharedBuffer and XUseSharedBuffer
//
// Functions:
//
// History: 5-22-95 srikants Created
//
//----------------------------------------------------------------------------
#pragma once
#include <tableseg.hxx>
//+---------------------------------------------------------------------------
//
// Class: CSharedBuffer
//
// Purpose: A Shared buffer used by the table to do temporary alloocations
// for variant creation.
//
// History: 5-22-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CSharedBuffer
{
friend class XUseSharedBuffer;
public:
CSharedBuffer() : _fInUse(FALSE) {}
BOOL IsInUse() const { return _fInUse; }
private:
BOOL _fInUse;
// this is an array of LONGLONGs to force 8-byte alignment
LONGLONG _abBuffer[ ( TBL_MAX_DATA + sizeof PROPVARIANT ) /
sizeof LONGLONG ];
BYTE * _GetBuffer()
{
Win4Assert( 0 == ( sizeof _abBuffer & ( sizeof(LONGLONG) - 1 ) ) );
return (BYTE *) &_abBuffer;
}
void _SetInUse()
{
Win4Assert( !_fInUse );
_fInUse = TRUE;
}
void _Release()
{
Win4Assert( _fInUse );
_fInUse = FALSE;
}
};
//+---------------------------------------------------------------------------
//
// Class: XUseSharedBuffer
//
// Purpose: Used to access the shared buffer and make sure that there
// are no two simultaneous users of the shared buffer.
//
// History: 5-22-95 srikants Created
//
// Notes: It is assumed that the shared buffer is being accessed under
// a larger lock like the bigtable lock.
//
//----------------------------------------------------------------------------
class XUseSharedBuffer
{
public:
XUseSharedBuffer( CSharedBuffer & sharedBuf,
BOOL fAcquire = TRUE ) : _sharedBuf(sharedBuf),
_fAcquired(FALSE)
{
if ( fAcquire )
{
Win4Assert( !_sharedBuf.IsInUse() );
if ( _sharedBuf.IsInUse() )
{
THROW( CException( STATUS_CONFLICTING_ADDRESSES ) );
}
_sharedBuf._SetInUse();
_fAcquired = TRUE;
}
}
~XUseSharedBuffer()
{
if ( _fAcquired )
{
_sharedBuf._Release();
}
}
void LokAcquire()
{
Win4Assert( !_fAcquired );
_sharedBuf._SetInUse();
_fAcquired = TRUE;
}
BYTE * LokGetBuffer()
{
Win4Assert( _fAcquired );
return _sharedBuf._GetBuffer();
}
unsigned LokGetSize() const { return sizeof(_sharedBuf._abBuffer); }
BOOL IsAcquired() const { return _fAcquired; }
private:
CSharedBuffer & _sharedBuf;
BOOL _fAcquired;
};