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

124 lines
3.8 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: abktize.hxx
//
// Contents: A class capable of doing asynchronous bucket->window
// expansion. It can be queued as a work item. For synchronous
// bucket->window conversions, it can be called from the client
// thread itself.
//
// Classes: CAsyncBucketExploder
//
// History: 5-25-95 srikants Created
//
//----------------------------------------------------------------------------
#pragma once
#include <worker.hxx>
#include <segmru.hxx>
class CLargeTable;
class CTableBucket;
class CQAsyncExecute;
const LONGLONG eSigCAsyncBucketExploder = 0x74656b6375424151i64; // "QABucket"
//+---------------------------------------------------------------------------
//
// Class: CAsyncBucketExploder
//
// Purpose: To co-ordinate the bucket->explosion between the query
// object and the large table. It can be a work item on the
// work queue.
//
// History: 5-25-95 srikants Created
//
// Notes: To prevent a deadlock, NEVER hold the lock on this object
// and then call into the large table methods.
//
//----------------------------------------------------------------------------
class CAsyncBucketExploder : INHERIT_VIRTUAL_UNWIND, public CDoubleLink, public PWorkItem
{
INLINE_UNWIND( CAsyncBucketExploder )
public:
CAsyncBucketExploder( CLargeTable & largeTable,
XPtr<CTableBucket>& xBucket,
WORKID widToPin,
BOOL fDoWidToPath );
virtual ~CAsyncBucketExploder();
//
// virtual methods from PWorkItem
//
void DoIt( CWorkThread * PThread );
void AddRef();
void Release();
//
// Called when the query is being aborted to release the workitem
// from the work queue.
//
void Abort();
//
// Giving the query object to use for bucket->window conversion.
//
void SetQuery( CQAsyncExecute * pQExecute );
//
// Called to add this item to query's work queue.
//
void AddToWorkQueue();
void WaitForCompletion()
{
_evt.Wait();
}
void SetOnLTList();
WORKID GetWorkIdToPin() const { return _widToPin; }
NTSTATUS GetStatus() const { return _status; }
# ifdef CIEXTMODE
void CiExtDump(void *ciExtSelf);
# endif
private:
CLargeTable & _largeTable; // LargeTable that is driving the
// bucket to window conversion.
CTableBucket * _pBucket; // The bucket to be expanded.
WORKID _widToPin; // WORKID that is pinned for this
// expansion.
BOOL _fDoWidToPath; // TRUE if Wid-to-path expansion needed
CQAsyncExecute * _pQueryExecute; // The query object that will be used
// to explode the bucket.
LONG _refCount;
CEventSem _evt; // Event for notifying the completion
// or abort of the conversion.
CMutexSem _mutex; // Mutex for serialization.
BOOL _fOnWorkQueue; // Set to TRUE when this object is on
// the work queue.
BOOL _fOnLTList; // Set to TRUE when this object is on
// the large table's list of exploding
// buckets.
NTSTATUS _status; // Status of the operation.
};
typedef class TDoubleList<CAsyncBucketExploder> CAsyncBucketsList;
typedef class TFwdListIter<CAsyncBucketExploder, CAsyncBucketsList> CFwdAsyncBktsIter;