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: 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; } }
|