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.
204 lines
3.4 KiB
204 lines
3.4 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
lockio.cpp
|
|
|
|
Abstract:
|
|
|
|
This module implements the lockable IoHandler class.
|
|
|
|
The purpose of this class is to provide a means for a seamless switchable
|
|
IoHandler so that I/O can be turned off/on when appropriate.
|
|
|
|
For instance, when the IoHandler is locked, the client I/O
|
|
can be redirected to a NULL IoHandler which effectively turns
|
|
off I/O for the client, but the client doesn't have to be notified
|
|
of this event.
|
|
|
|
Author:
|
|
|
|
Brian Guarraci (briangu), 2001
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "lockio.h"
|
|
|
|
CLockableIoHandler::CLockableIoHandler(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
{
|
|
|
|
//
|
|
// Initilize the locked Io Handler
|
|
//
|
|
myLockedIoHandler = NULL;
|
|
|
|
//
|
|
// Initilize the unlocked IoHandler
|
|
//
|
|
myUnlockedIoHandler = NULL;
|
|
|
|
}
|
|
|
|
CLockableIoHandler::CLockableIoHandler(
|
|
IN CIoHandler* LockedIoHandler,
|
|
IN CIoHandler* UnlockedIoHandler
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor
|
|
|
|
Arguments:
|
|
|
|
LockedIoHandler - the IoHandler to use when locked
|
|
UnlockedIoHandler - the IoHandler to use when unlocked
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
{
|
|
|
|
//
|
|
// Initilize the locked Io Handler
|
|
//
|
|
myLockedIoHandler = LockedIoHandler;
|
|
|
|
//
|
|
// Initilize the unlocked IoHandler
|
|
//
|
|
myUnlockedIoHandler = UnlockedIoHandler;
|
|
|
|
}
|
|
|
|
CLockableIoHandler::~CLockableIoHandler()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Destructor
|
|
|
|
Arguments:
|
|
|
|
N/A
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Cleanup allocated Io Handlers
|
|
//
|
|
if (myUnlockedIoHandler) {
|
|
delete myUnlockedIoHandler;
|
|
}
|
|
if (myLockedIoHandler) {
|
|
delete myLockedIoHandler;
|
|
}
|
|
}
|
|
|
|
void
|
|
CLockableIoHandler::Lock(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Lock:
|
|
|
|
When the IoHandler is locked, the read and write routines
|
|
do not send data. If they are called, they return TRUE,
|
|
but no data is sent. To prevent accidental loss of data,
|
|
routines that use the IoHandler should call the IsLocked()
|
|
method to determine the status before hand.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
InterlockedExchangePointer((PVOID*)&myIoHandler, (PVOID)myLockedIoHandler);
|
|
}
|
|
|
|
void
|
|
CLockableIoHandler::Unlock(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine unlocks the IoHandler.
|
|
|
|
When the IoHandler is unlocked, the read and write routines
|
|
are enabled and routines that use the IoHandler can succesfully
|
|
perform I/O.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
InterlockedExchangePointer((PVOID*)&myIoHandler, (PVOID)myUnlockedIoHandler);
|
|
}
|
|
|
|
BOOL
|
|
CLockableIoHandler::IsLocked(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine determines of the IoHandler is locked.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE - if IoHandler is locked
|
|
FALSE - if IoHandler is not locked
|
|
|
|
--*/
|
|
{
|
|
return(myIoHandler == myLockedIoHandler);
|
|
}
|
|
|
|
|