Leaked source code of windows server 2003
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.

196 lines
3.7 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1994 - 1999
  6. //
  7. // File: delaytab.hxx
  8. //
  9. //--------------------------------------------------------------------------
  10. /*++
  11. Module Name:
  12. delaytab.hxx
  13. Abstract:
  14. interface for DELAYED_ACTION_TABLE, which asynchronously calls
  15. functions after a specified delay.
  16. Author:
  17. Jeff Roberts (jroberts) 2-Nov-1994
  18. Revision History:
  19. 2-Nov-1994 jroberts
  20. Created this module.
  21. --*/
  22. #ifndef _DELAYTAB_HXX_
  23. #define _DELAYTAB_HXX_
  24. typedef void (*DELAYED_ACTION_FN)(void * Data);
  25. class DELAYED_ACTION_NODE
  26. {
  27. friend class DELAYED_ACTION_TABLE;
  28. public:
  29. enum { DA_NodeFree = 0xffffffff,
  30. DA_NodeBusy = 0xfffffffe
  31. };
  32. inline
  33. DELAYED_ACTION_NODE(
  34. DELAYED_ACTION_FN NewFn = 0,
  35. void * NewData = 0
  36. )
  37. {
  38. TriggerTime = DA_NodeFree;
  39. Initialize(NewFn, NewData);
  40. }
  41. inline
  42. ~DELAYED_ACTION_NODE(
  43. )
  44. {
  45. ASSERT(TriggerTime == DA_NodeFree);
  46. }
  47. inline void
  48. Initialize(
  49. DELAYED_ACTION_FN NewFn,
  50. void * NewData
  51. )
  52. {
  53. Fn = NewFn;
  54. Data = NewData;
  55. }
  56. inline BOOL
  57. IsActive(
  58. )
  59. {
  60. if (TriggerTime == DA_NodeFree)
  61. {
  62. return FALSE;
  63. }
  64. else
  65. {
  66. return TRUE;
  67. }
  68. }
  69. inline void
  70. Unlink(
  71. )
  72. {
  73. if (IsActive())
  74. {
  75. Next->Prev = Prev;
  76. Prev->Next = Next;
  77. }
  78. }
  79. private:
  80. long TriggerTime;
  81. DELAYED_ACTION_FN Fn;
  82. void * Data;
  83. DELAYED_ACTION_NODE * Prev;
  84. DELAYED_ACTION_NODE * Next;
  85. };
  86. class DELAYED_ACTION_TABLE
  87. {
  88. public:
  89. DELAYED_ACTION_TABLE(
  90. RPC_STATUS * pStatus
  91. );
  92. ~DELAYED_ACTION_TABLE(
  93. );
  94. RPC_STATUS Add(
  95. DELAYED_ACTION_NODE * pNode,
  96. unsigned Delay,
  97. BOOL ForceUpdate
  98. );
  99. BOOL Cancel(
  100. DELAYED_ACTION_NODE * pNode
  101. );
  102. BOOL SearchForNode(
  103. DELAYED_ACTION_NODE * pNode
  104. );
  105. void ThreadProc(
  106. );
  107. void QueueLength(
  108. unsigned * pTotalCount,
  109. unsigned * pOverdueCount
  110. );
  111. private:
  112. MUTEX Mutex;
  113. DELAYED_ACTION_NODE ActiveList;
  114. BOOL ThreadActive;
  115. long ThreadWakeupTime;
  116. EVENT ThreadEvent;
  117. unsigned fExitThread;
  118. BOOL fConstructorFinished;
  119. #ifdef DEBUGRPC
  120. unsigned NodeCount;
  121. DELAYED_ACTION_NODE * LastRemoved;
  122. DELAYED_ACTION_NODE * LastAdded;
  123. #endif
  124. };
  125. inline BOOL
  126. DELAYED_ACTION_TABLE::Cancel(
  127. DELAYED_ACTION_NODE * pNode
  128. )
  129. {
  130. BOOL WasPending = FALSE;
  131. CLAIM_MUTEX Lock(Mutex);
  132. pNode->Unlink();
  133. if (pNode->TriggerTime != DELAYED_ACTION_NODE::DA_NodeFree)
  134. {
  135. WasPending = TRUE;
  136. pNode->TriggerTime = DELAYED_ACTION_NODE::DA_NodeFree;
  137. #ifdef DEBUGRPC
  138. --NodeCount;
  139. LastRemoved = pNode;
  140. #endif
  141. }
  142. return WasPending;
  143. }
  144. #endif // _DELAYTAB_HXX_