197 lines
3.6 KiB
C++
197 lines
3.6 KiB
C++
|
//+-------------------------------------------------------------------------
|
|||
|
//
|
|||
|
// Microsoft Windows
|
|||
|
//
|
|||
|
// Copyright (C) Microsoft Corporation, 1994 - 1999
|
|||
|
//
|
|||
|
// File: delaytab.hxx
|
|||
|
//
|
|||
|
//--------------------------------------------------------------------------
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
delaytab.hxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
interface for DELAYED_ACTION_TABLE, which asynchronously calls
|
|||
|
functions after a specified delay.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jeff Roberts (jroberts) 2-Nov-1994
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
2-Nov-1994 jroberts
|
|||
|
|
|||
|
Created this module.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _DELAYTAB_HXX_
|
|||
|
#define _DELAYTAB_HXX_
|
|||
|
|
|||
|
|
|||
|
typedef void (*DELAYED_ACTION_FN)(void * Data);
|
|||
|
|
|||
|
|
|||
|
class DELAYED_ACTION_NODE
|
|||
|
{
|
|||
|
friend class DELAYED_ACTION_TABLE;
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
enum { DA_NodeFree = 0xffffffff,
|
|||
|
DA_NodeBusy = 0xfffffffe
|
|||
|
};
|
|||
|
|
|||
|
inline
|
|||
|
DELAYED_ACTION_NODE(
|
|||
|
DELAYED_ACTION_FN NewFn = 0,
|
|||
|
void * NewData = 0
|
|||
|
)
|
|||
|
{
|
|||
|
TriggerTime = DA_NodeFree;
|
|||
|
Initialize(NewFn, NewData);
|
|||
|
}
|
|||
|
|
|||
|
inline
|
|||
|
~DELAYED_ACTION_NODE(
|
|||
|
)
|
|||
|
{
|
|||
|
ASSERT(TriggerTime == DA_NodeFree);
|
|||
|
}
|
|||
|
|
|||
|
inline void
|
|||
|
Initialize(
|
|||
|
DELAYED_ACTION_FN NewFn,
|
|||
|
void * NewData
|
|||
|
)
|
|||
|
{
|
|||
|
Fn = NewFn;
|
|||
|
Data = NewData;
|
|||
|
}
|
|||
|
|
|||
|
inline BOOL
|
|||
|
IsActive(
|
|||
|
)
|
|||
|
{
|
|||
|
if (TriggerTime == DA_NodeFree)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
inline void
|
|||
|
Unlink(
|
|||
|
)
|
|||
|
{
|
|||
|
if (IsActive())
|
|||
|
{
|
|||
|
Next->Prev = Prev;
|
|||
|
Prev->Next = Next;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
long TriggerTime;
|
|||
|
DELAYED_ACTION_FN Fn;
|
|||
|
void * Data;
|
|||
|
DELAYED_ACTION_NODE * Prev;
|
|||
|
DELAYED_ACTION_NODE * Next;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
class DELAYED_ACTION_TABLE
|
|||
|
{
|
|||
|
public:
|
|||
|
|
|||
|
DELAYED_ACTION_TABLE(
|
|||
|
RPC_STATUS * pStatus
|
|||
|
);
|
|||
|
|
|||
|
~DELAYED_ACTION_TABLE(
|
|||
|
);
|
|||
|
|
|||
|
RPC_STATUS Add(
|
|||
|
DELAYED_ACTION_NODE * pNode,
|
|||
|
unsigned Delay,
|
|||
|
BOOL ForceUpdate
|
|||
|
);
|
|||
|
|
|||
|
BOOL Cancel(
|
|||
|
DELAYED_ACTION_NODE * pNode
|
|||
|
);
|
|||
|
|
|||
|
BOOL SearchForNode(
|
|||
|
DELAYED_ACTION_NODE * pNode
|
|||
|
);
|
|||
|
|
|||
|
void ThreadProc(
|
|||
|
);
|
|||
|
|
|||
|
void QueueLength(
|
|||
|
unsigned * pTotalCount,
|
|||
|
unsigned * pOverdueCount
|
|||
|
);
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
MUTEX Mutex;
|
|||
|
|
|||
|
DELAYED_ACTION_NODE ActiveList;
|
|||
|
|
|||
|
BOOL ThreadActive;
|
|||
|
long ThreadWakeupTime;
|
|||
|
|
|||
|
EVENT ThreadEvent;
|
|||
|
unsigned fExitThread;
|
|||
|
|
|||
|
BOOL fConstructorFinished;
|
|||
|
|
|||
|
#ifdef DEBUGRPC
|
|||
|
|
|||
|
unsigned NodeCount;
|
|||
|
DELAYED_ACTION_NODE * LastRemoved;
|
|||
|
DELAYED_ACTION_NODE * LastAdded;
|
|||
|
|
|||
|
#endif
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
inline BOOL
|
|||
|
DELAYED_ACTION_TABLE::Cancel(
|
|||
|
DELAYED_ACTION_NODE * pNode
|
|||
|
)
|
|||
|
{
|
|||
|
BOOL WasPending = FALSE;
|
|||
|
|
|||
|
CLAIM_MUTEX Lock(Mutex);
|
|||
|
|
|||
|
pNode->Unlink();
|
|||
|
|
|||
|
if (pNode->TriggerTime != DELAYED_ACTION_NODE::DA_NodeFree)
|
|||
|
{
|
|||
|
WasPending = TRUE;
|
|||
|
pNode->TriggerTime = DELAYED_ACTION_NODE::DA_NodeFree;
|
|||
|
|
|||
|
#ifdef DEBUGRPC
|
|||
|
--NodeCount;
|
|||
|
LastRemoved = pNode;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
return WasPending;
|
|||
|
}
|
|||
|
|
|||
|
#endif // _DELAYTAB_HXX_
|
|||
|
|