Source code of Windows XP (NT5)
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.
|
|
//+---------------------------------------------------------------------------
//
// 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; };
|