23 , m_dwNextCookie(0), m_dwAdviseCount(0)
24 , m_pAdviseCache(0), m_dwCacheCount(0)
27 head.m_dwAdviseCookie = z.m_dwAdviseCookie = 0;
35 CAdvisePacket * p = m_pAdviseCache;
38 CAdvisePacket *
const p_next = p->m_next;
43 ASSERT( m_dwAdviseCount == 0 );
45 if ( m_dwAdviseCount > 0 )
48 while ( !head.m_next->IsZ() )
58 ASSERT( m_dwAdviseCount == 0 );
68 return m_dwAdviseCount;
74 return head.m_next->m_rtEventTime;
78 (
const REFERENCE_TIME & time1
79 ,
const REFERENCE_TIME & time2
94 m_pAdviseCache = p->m_next;
99 p =
new CAdvisePacket();
103 p->m_rtEventTime = time1; p->m_rtPeriod = time2;
104 p->m_hNotify = h; p->m_bPeriodic = periodic;
105 Result = AddAdvisePacket( p );
109 m_Serialize.Unlock();
116 HRESULT
hr = S_FALSE;
117 CAdvisePacket * p_prev = &head;
120 while ( p_n = p_prev->Next() )
122 if ( p_n->m_dwAdviseCookie == dwAdviseCookie )
124 Delete( p_prev->RemoveNext() );
129 while (p_n = p_prev->Next())
131 ASSERT(p_n->m_dwAdviseCookie != dwAdviseCookie);
145 REFERENCE_TIME rtNextTime;
146 CAdvisePacket * pAdvise;
158 while ( rtTime >= (rtNextTime = (pAdvise=head.m_next)->m_rtEventTime) &&
161 ASSERT(pAdvise->m_dwAdviseCookie);
165 if (pAdvise->m_bPeriodic == TRUE)
167 ReleaseSemaphore(pAdvise->m_hNotify,1,
NULL);
168 pAdvise->m_rtEventTime += pAdvise->m_rtPeriod;
173 ASSERT( pAdvise->m_bPeriodic == FALSE );
176 Delete( head.RemoveNext() );
182 TEXT(
"CAMSchedule::Advise() Next time stamp: %lu ms, for advise %lu."),
192 ASSERT(pPacket->m_rtEventTime >= 0 && pPacket->m_rtEventTime <
MAX_TIME);
195 CAdvisePacket * p_prev = &head;
198 const DWORD_PTR Result = pPacket->m_dwAdviseCookie = ++m_dwNextCookie;
202 p_n = p_prev->m_next;
203 if ( p_n->m_rtEventTime >= pPacket->m_rtEventTime )
break;
205 p_prev->InsertAfter( pPacket );
208 DbgLog((
LOG_TIMING, 2, TEXT(
"Added advise %lu, for thread 0x%02X, scheduled at %lu"),
209 pPacket->m_dwAdviseCookie, GetCurrentThreadId(), (pPacket->m_rtEventTime / (
UNITS /
MILLISECONDS)) ));
212 if ( p_prev == &head ) SetEvent( m_ev );
217 void CAMSchedule::Delete( __inout CAdvisePacket * pPacket )
219 if ( m_dwCacheCount >= dwCacheMax )
delete pPacket;
223 pPacket->m_next = m_pAdviseCache;
224 m_pAdviseCache = pPacket;
232 void CAMSchedule::ShuntHead()
234 CAdvisePacket * p_prev = &head;
238 CAdvisePacket *
const pPacket = head.m_next;
248 p_n = p_prev->m_next;
249 if ( p_n->m_rtEventTime > pPacket->m_rtEventTime )
break;
252 if (p_prev != pPacket)
254 head.m_next = pPacket->m_next;
255 (p_prev->m_next = pPacket)->m_next = p_n;
270 DbgLog((
LOG_TIMING, 1, TEXT(
"CAMSchedule::DumpLinkedList() this = 0x%p"),
this));
271 for ( CAdvisePacket * p = &head
273 ; p = p->m_next , i++