Windows NT 4.0 source code leak
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.

137 lines
3.1 KiB

4 years ago
  1. // RefCnt.cpp -- Implementation of CRCObject semantics
  2. #include "stdafx.h"
  3. #include "RefCnt.h"
  4. #include <stdio.h>
  5. #ifdef _DEBUG
  6. void CRCObject::StoreImage(CPersist *pDiskImage)
  7. {
  8. ASSERT(FALSE);
  9. }
  10. void CRCObject::ConnectImage(CPersist *pDiskImage)
  11. {
  12. ASSERT(FALSE);
  13. }
  14. void CRCObject::SkipImage(CPersist *pDiskImage)
  15. {
  16. ASSERT(FALSE);
  17. }
  18. CObjectCounter::CObjectCounter()
  19. {
  20. m_prcObjectFirst = NULL;
  21. m_crcObject = 0;
  22. m_crcObjRef = 0;
  23. }
  24. CObjectCounter::~CObjectCounter()
  25. {
  26. #ifdef _DEBUG // Turn this code on whenever the assertions below fail. It will dump
  27. // useful diagnostic info to stdout.
  28. if (m_crcObjRef)
  29. {
  30. CRCObject *prcObj;
  31. char acDebugBuff[256];
  32. for (prcObj= m_prcObjectFirst; prcObj; prcObj= prcObj->m_prcObjNext)
  33. {
  34. wsprintf(acDebugBuff, "0x%08x \"%s\":\n", UINT(prcObj), prcObj->m_pszTypeName);
  35. OutputDebugString(acDebugBuff);
  36. POwnerLink pol;
  37. for (pol= prcObj->m_pol; pol; pol= pol->polNext)
  38. wsprintf(acDebugBuff, " 0x%08x 0x%08x\n", UINT(pol->pvClass), UINT(pol->pprcObj));
  39. OutputDebugString(acDebugBuff);
  40. }
  41. }
  42. #endif // _DEBUG
  43. ASSERT(!m_crcObjRef);
  44. ASSERT(!m_crcObject);
  45. ASSERT(!m_prcObjectFirst);
  46. }
  47. BOOL CObjectCounter::ObjectRecorded(CRCObject *prcObj)
  48. {
  49. CRCObject *prcOb;
  50. BOOL fFound= FALSE;
  51. for (prcOb= m_prcObjectFirst; prcOb; prcOb= prcOb->m_prcObjNext)
  52. if (prcOb == prcObj) { fFound= TRUE; break; }
  53. return fFound;
  54. }
  55. void CObjectCounter::ObjectBirth (CRCObject *prcObj)
  56. {
  57. ASSERT(!ObjectRecorded(prcObj));
  58. ++m_crcObject;
  59. prcObj->m_prcObjNext = m_prcObjectFirst;
  60. prcObj->m_pprcObjLast = &m_prcObjectFirst;
  61. if (m_prcObjectFirst)
  62. m_prcObjectFirst->m_pprcObjLast= &(prcObj->m_prcObjNext);
  63. m_prcObjectFirst = prcObj;
  64. }
  65. void CObjectCounter::ObjectDeath (CRCObject *prcObj)
  66. {
  67. ASSERT(ObjectRecorded(prcObj));
  68. --m_crcObject;
  69. if (prcObj->m_prcObjNext)
  70. prcObj->m_prcObjNext->m_pprcObjLast= prcObj->m_pprcObjLast;
  71. *(prcObj->m_pprcObjLast)= prcObj->m_prcObjNext;
  72. }
  73. void CObjectCounter::AddReference(CRCObject *prcObj)
  74. {
  75. ASSERT(ObjectRecorded(prcObj));
  76. ++m_crcObjRef;
  77. }
  78. void CObjectCounter::SubReference(CRCObject *prcObj)
  79. {
  80. ASSERT(m_crcObjRef);
  81. ASSERT(ObjectRecorded(prcObj));
  82. --m_crcObjRef;
  83. }
  84. CObjectAccountant::CObjectAccountant(int cObjDelta, int cRefDelta)
  85. {
  86. m_cObjStarting= int(ObjectCounter.m_crcObject);
  87. m_cRefStarting= int(ObjectCounter.m_crcObjRef);
  88. m_cObjDelta = cObjDelta;
  89. m_cRefDelta = cRefDelta;
  90. ASSERT(m_cObjStarting >= 0);
  91. ASSERT(m_cRefStarting >= 0);
  92. ASSERT(m_cObjStarting + m_cObjDelta >= 0);
  93. ASSERT(m_cRefStarting + m_cRefDelta >= 0);
  94. }
  95. CObjectAccountant::~CObjectAccountant()
  96. {
  97. ASSERT(int(ObjectCounter.m_crcObject) == m_cObjStarting + m_cObjDelta);
  98. ASSERT(int(ObjectCounter.m_crcObjRef) == m_cRefStarting + m_cRefDelta);
  99. }
  100. CObjectCounter ObjectCounter;
  101. #endif // _DEBUG