00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "stdafx.h"
00037 #include "DelayedDelete.h"
00038
00039 #include "OSManager.h"
00040 #include "GenericCriticalSection.h"
00041 #include "PeriodicThread.h"
00042
00043 #ifdef _MEMORY_DEBUG
00044 #define new DEBUG_NEW
00045 #define malloc DEBUG_MALLOC
00046 static char THIS_FILE[] = __FILE__;
00047 #endif
00048
00049 KOMODIA_NAMESPACE_START
00050
00051 CDelayedDelete::CDelayedDelete()
00052 {
00053
00054 m_pCS=COSManager::CreateCriticalSection();
00055
00056
00057 m_pThread=new CPeriodicThread(DeleteThreadProc);
00058 m_pThread->Start(1000,
00059 (LPVOID)this);
00060 }
00061
00062 CDelayedDelete::~CDelayedDelete()
00063 {
00064
00065 delete m_pThread;
00066
00067
00068 DeleteAll();
00069
00070
00071 delete m_pCS;
00072 }
00073
00074 BOOL CDelayedDelete::DeleteThreadProc(LPVOID lpParam)
00075 {
00076
00077 CDelayedDelete* pClass;
00078 pClass=(CDelayedDelete*)lpParam;
00079
00080
00081 DeleteVector aVec;
00082
00083 {
00084
00085 CCriticalAutoRelease aRelease(pClass->m_pCS);
00086
00087
00088 DeleteList::iterator aIterator;
00089 aIterator=pClass->m_aData.begin();
00090 while (aIterator!=pClass->m_aData.end())
00091
00092 if (GetTickCount()>=aIterator->dwExpireTime)
00093 {
00094
00095 aVec.push_back(*aIterator);
00096
00097
00098 aIterator=pClass->m_aData.erase(aIterator);
00099 }
00100 else
00101 ++aIterator;
00102 }
00103
00104
00105 for (int iCount=0;
00106 iCount<aVec.size();
00107 ++iCount)
00108
00109 (*(aVec[iCount].pProc))(aVec[iCount].lpItemToDelete);
00110
00111
00112 return TRUE;
00113 }
00114
00115 void CDelayedDelete::DeleteAll()
00116 {
00117
00118 DeleteVector aVec;
00119
00120 {
00121
00122 CCriticalAutoRelease aRelease(m_pCS);
00123
00124
00125 DeleteList::iterator aIterator;
00126 aIterator=m_aData.begin();
00127 while (aIterator!=m_aData.end())
00128 {
00129
00130 aVec.push_back(*aIterator);
00131
00132
00133 aIterator=m_aData.erase(aIterator);
00134 }
00135 }
00136
00137
00138 for (int iCount=0;
00139 iCount<aVec.size();
00140 ++iCount)
00141
00142 (*(aVec[iCount].pProc))(aVec[iCount].lpItemToDelete);
00143 }
00144
00145 void CDelayedDelete::AddItem(LPVOID lpItem,
00146 LPDeleteProc pProc,
00147 DWORD dwDeleteTimeout)
00148 {
00149
00150 if (!lpItem ||
00151 !pProc)
00152 return;
00153
00154
00155 DeleteStructure aData;
00156 aData.pProc=pProc;
00157 aData.lpItemToDelete=lpItem;
00158
00159
00160 CCriticalAutoRelease aRelease(m_pCS);
00161
00162
00163 aData.dwExpireTime=GetTickCount()+dwDeleteTimeout;
00164
00165
00166 m_aData.insert(m_aData.begin(),
00167 aData);
00168 }
00169
00170 KOMODIA_NAMESPACE_END