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.
|
|
//+------------------------------------------------------------------
//
// Copyright (C) 1991-1997 Microsoft Corporation.
//
// File: nottran.cxx
//
// Contents: Transaction object for notifications
//
// Classes: CNotificationTransaction
//
// History: 24-Feb-97 SitaramR Created
//
//-------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "notxact.hxx"
#include "resman.hxx"
//+---------------------------------------------------------------------------
//
// Member: CNotificationTransaction::CNotificationTransaction
//
// Synopsis: Constructor
//
// History: 24-Feb-97 SitaramR Created
//
// Notes: We initialize the array with a fairly size because we don't
// want a grow to fail due to low memory during the changelog
// transaction.
//
//----------------------------------------------------------------------------
CNotificationTransaction::CNotificationTransaction( CResManager *pResManager, CIndexNotificationTable *pNotifTable ) : _pResManager( pResManager ), _pNotifTable( pNotifTable ), _aCommittedWids(256), _aAbortedWidsToRemove(100) { }
//+-------------------------------------------------------------------------
//
// Method: CNotificationTransactoin::~CNotificationTransaction
//
// Synopsis: Destructor
//
// History: 24-Feb-1997 SitaramR Created
//
//--------------------------------------------------------------------------
CNotificationTransaction::~CNotificationTransaction() { if ( GetStatus() == CTransaction::XActCommit ) { //
// Commit the transaction which means commit the wids in the
// comitted and remove the wids in the aborted list.
//
//
// Commit outside resman lock to prevent a deadlock with the
// lock in the notification table.
//
if ( _pNotifTable ) _pNotifTable->CommitWids( _aCommittedWids );
CLock lock( _pResManager->GetMutex() ); for ( unsigned i=0; i<_aAbortedWidsToRemove.Count(); i++ ) { _pResManager->LokRemoveAbortedWid( _aAbortedWidsToRemove.Get(i)._wid, _aAbortedWidsToRemove.Get(i)._usn ); } } }
//+-------------------------------------------------------------------------
//
// Method: CNotificationTransaction::AddCommittedWid
//
// Synopsis: Adds a wid to the commited list
//
// Arguments: [wid] -- WORKID
//
// History: 24-Feb-1997 SitaramR Created
//
//--------------------------------------------------------------------------
void CNotificationTransaction::AddCommittedWid( WORKID wid ) { Win4Assert( wid != widInvalid );
_aCommittedWids.Add( wid, _aCommittedWids.Count() ); }
//+-------------------------------------------------------------------------
//
// Method: CNotificationTransaction::RemoveAbortedWid
//
// Synopsis: Adds a wid to the aborted-wids-to-remove list
//
// Arguments: [wid] -- WORKID
// [usn] -- USN
//
// History: 24-Feb-1997 SitaramR Created
//
//--------------------------------------------------------------------------
void CNotificationTransaction::RemoveAbortedWid( WORKID wid, USN usn ) { Win4Assert( wid != widInvalid ); Win4Assert( usn > 0 ); CAbortedWidEntry widEntry( wid, usn );
_aAbortedWidsToRemove.Add( widEntry, _aAbortedWidsToRemove.Count() ); }
|