windows-nt/Source/XPSP1/NT/inetsrv/query/bigtable/abktize.cxx
2020-09-26 16:20:57 +08:00

295 lines
7.1 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: abktize.cxx
//
// Contents: Asynchronous Bucket->Window Conversion.
//
// Classes:
//
// Functions:
//
// History: 5-25-95 srikants Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <bigtable.hxx>
#include <execute.hxx>
#include "tblbuket.hxx"
#include "tabledbg.hxx"
//+---------------------------------------------------------------------------
//
// Function: CAsyncBucketExploder ~ctor
//
// Arguments: [largeTable] -- LargeTable driving the bucket->window
// conversion.
// [pBucket] -- The bucket to expand into a window.
// [widToPin] -- WORKID to pin.
// [fDoWidToPath] -- TRUE if table holds 'fake' wids, and bucket
// must convert fake wid to path.
//
// History: 5-25-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
CAsyncBucketExploder::CAsyncBucketExploder( CLargeTable & largeTable,
XPtr<CTableBucket> & xBucket,
WORKID widToPin,
BOOL fDoWidToPath )
: PWorkItem(eSigCAsyncBucketExploder),
_largeTable(largeTable),
_pBucket(0),
_widToPin(widToPin),
_fDoWidToPath( fDoWidToPath ),
_pQueryExecute(0),
_refCount(1),
_fOnWorkQueue(FALSE),
_fOnLTList(FALSE),
_status(STATUS_SUCCESS)
{
Close(); // Initialize the links to point to self.
_pBucket = xBucket.Acquire();
Win4Assert( 0 != _pBucket );
END_CONSTRUCTION( CAsyncBucketExploder );
}
//+---------------------------------------------------------------------------
//
// Function: CAsyncBucketExploder
//
// Synopsis: ~dtor
//
// History: 5-25-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
CAsyncBucketExploder::~CAsyncBucketExploder()
{
Win4Assert( 0 == _refCount );
Win4Assert( IsSingle() ); // Is not linked in the list
Win4Assert( !_fOnWorkQueue );
Win4Assert( !_fOnLTList );
if ( 0 != _pQueryExecute )
{
_pQueryExecute->Release();
}
delete _pBucket;
}
//+---------------------------------------------------------------------------
//
// Function: DoIt
//
// Synopsis: The main method called by the worker thread .
//
// Arguments: [pThread] -- Thread executing request.
//
// History: 5-25-95 srikants Created
//
// Notes: At the end, if this object in the LargeTable's list, it will
// be removed from the large table list. While doing that,
// DO NOT hold the mutex because there LT can call into this
// object with its lock held. We don't want to deadlock.
//
//----------------------------------------------------------------------------
void CAsyncBucketExploder::DoIt( CWorkThread * pThread )
{
{
CLock lock(_mutex);
Win4Assert( 0 != _pBucket );
Win4Assert( 0 != _pQueryExecute );
_fOnWorkQueue = FALSE;
}
AddRef();
//
// None of these calls throw
//
CBucketRowIter bktIter( *_pBucket, _fDoWidToPath );
_pQueryExecute->Update( bktIter );
//
// If it is on the large table queue, remove it from the lt queue.
//
if ( _fOnLTList )
{
_fOnLTList = FALSE;
_largeTable._RemoveFromExplodeList(this);
}
_evt.Set();
Release();
}
//+---------------------------------------------------------------------------
//
// Function: SetQuery
//
// Synopsis: Sets the query object to be used for bucket->window conversion.
//
// Arguments: [pQExecute] - The Query object to use for bucket->window
// conversion.
//
// History: 5-25-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CAsyncBucketExploder::SetQuery( CQAsyncExecute * pQExecute )
{
CLock lock(_mutex);
Win4Assert( 0 == _pQueryExecute && 0 != pQExecute );
_pQueryExecute = pQExecute;
_pQueryExecute->AddRef();
}
//+---------------------------------------------------------------------------
//
// Function: SetOnLTList
//
// Synopsis: Sets the internal state that it is on the large table's
// list also.
//
// History: 5-31-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CAsyncBucketExploder::SetOnLTList()
{
CLock lock(_mutex);
Win4Assert( !_fOnLTList );
_fOnLTList = TRUE;
}
//+---------------------------------------------------------------------------
//
// Function: AddToWorkQueue
//
// Synopsis: Adds this item to the work queue.
//
// History: 5-31-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CAsyncBucketExploder::AddToWorkQueue()
{
CLock lock(_mutex);
Win4Assert( !_fOnWorkQueue );
_fOnWorkQueue = TRUE;
TheWorkQueue.Add(this);
}
//+---------------------------------------------------------------------------
//
// Function: Abort
//
// Synopsis: Aborts the work item by removing it from the work queue
// (if present). It also releases the query object.
//
// History: 5-31-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CAsyncBucketExploder::Abort()
{
CLock lock(_mutex);
Win4Assert( IsSingle() ); // Must not be on any list at this stage
_fOnLTList = FALSE;
if ( _fOnWorkQueue )
{
TheWorkQueue.Remove(this);
_fOnWorkQueue = FALSE;
}
if ( 0 != _pQueryExecute )
{
_pQueryExecute->Release();
_pQueryExecute = 0;
}
_evt.Set(); // Wake up any thread waiting on us
}
//+---------------------------------------------------------------------------
//
// Function: AddRef
//
// Synopsis:
//
// Returns:
//
// Modifies:
//
// History: 5-31-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CAsyncBucketExploder::AddRef()
{
InterlockedIncrement(&_refCount);
}
//+---------------------------------------------------------------------------
//
// Function: Release
//
// Synopsis:
//
// Returns:
//
// Modifies:
//
// History: 5-31-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CAsyncBucketExploder::Release()
{
Win4Assert( _refCount > 0 );
if ( InterlockedDecrement(&_refCount) <= 0 )
{
delete this;
}
}