blob: c218ee419d183300d20cd1dd648d073d1188a897 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2006 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
reed@android.com8a1c16f2008-12-17 15:59:43 +00008
Hal Canary20de6152017-02-23 13:24:49 -05009#include "SkDOM.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#include "SkEvent.h"
11
reed@google.com87fac4a2011-08-04 13:50:17 +000012void SkEvent::initialize(const char* type, size_t typeLen,
13 SkEventSinkID targetID) {
halcanary96fcdcc2015-08-27 07:41:13 -070014 fType = nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +000015 setType(type, typeLen);
16 f32 = 0;
reed@google.com87fac4a2011-08-04 13:50:17 +000017 fTargetID = targetID;
halcanary96fcdcc2015-08-27 07:41:13 -070018 fTargetProc = nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +000019#ifdef SK_DEBUG
reed@android.com8a1c16f2008-12-17 15:59:43 +000020 fTime = 0;
halcanary96fcdcc2015-08-27 07:41:13 -070021 fNextEvent = nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +000022#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +000023}
24
25SkEvent::SkEvent()
26{
reed@google.com87fac4a2011-08-04 13:50:17 +000027 initialize("", 0, 0);
reed@android.com8a1c16f2008-12-17 15:59:43 +000028}
29
30SkEvent::SkEvent(const SkEvent& src)
31{
32 *this = src;
33 if (((size_t) fType & 1) == 0)
34 setType(src.fType);
35}
36
reed@google.com87fac4a2011-08-04 13:50:17 +000037SkEvent::SkEvent(const SkString& type, SkEventSinkID targetID)
reed@android.com8a1c16f2008-12-17 15:59:43 +000038{
reed@google.com87fac4a2011-08-04 13:50:17 +000039 initialize(type.c_str(), type.size(), targetID);
reed@android.com8a1c16f2008-12-17 15:59:43 +000040}
41
reed@google.com87fac4a2011-08-04 13:50:17 +000042SkEvent::SkEvent(const char type[], SkEventSinkID targetID)
reed@android.com8a1c16f2008-12-17 15:59:43 +000043{
44 SkASSERT(type);
reed@google.com87fac4a2011-08-04 13:50:17 +000045 initialize(type, strlen(type), targetID);
reed@android.com8a1c16f2008-12-17 15:59:43 +000046}
47
48SkEvent::~SkEvent()
49{
50 if (((size_t) fType & 1) == 0)
51 sk_free((void*) fType);
52}
53
54static size_t makeCharArray(char* buffer, size_t compact)
55{
56 size_t bits = (size_t) compact >> 1;
57 memcpy(buffer, &bits, sizeof(compact));
58 buffer[sizeof(compact)] = 0;
59 return strlen(buffer);
60}
61
rmistry@google.comd6176b02012-08-23 18:14:13 +000062void SkEvent::getType(SkString* str) const
63{
64 if (str)
reed@android.com8a1c16f2008-12-17 15:59:43 +000065 {
66 if ((size_t) fType & 1) // not a pointer
67 {
68 char chars[sizeof(size_t) + 1];
69 size_t len = makeCharArray(chars, (size_t) fType);
70 str->set(chars, len);
71 }
72 else
73 str->set(fType);
74 }
75}
76
rmistry@google.comd6176b02012-08-23 18:14:13 +000077bool SkEvent::isType(const SkString& str) const
reed@android.com8a1c16f2008-12-17 15:59:43 +000078{
rmistry@google.comd6176b02012-08-23 18:14:13 +000079 return this->isType(str.c_str(), str.size());
reed@android.com8a1c16f2008-12-17 15:59:43 +000080}
81
rmistry@google.comd6176b02012-08-23 18:14:13 +000082bool SkEvent::isType(const char type[], size_t typeLen) const
83{
reed@android.com8a1c16f2008-12-17 15:59:43 +000084 if (typeLen == 0)
85 typeLen = strlen(type);
86 if ((size_t) fType & 1) { // not a pointer
87 char chars[sizeof(size_t) + 1];
88 size_t len = makeCharArray(chars, (size_t) fType);
89 return len == typeLen && strncmp(chars, type, typeLen) == 0;
90 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000091 return strncmp(fType, type, typeLen) == 0 && fType[typeLen] == 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +000092}
93
94void SkEvent::setType(const char type[], size_t typeLen)
95{
96 if (typeLen == 0)
97 typeLen = strlen(type);
98 if (typeLen <= sizeof(fType)) {
99 size_t slot = 0;
100 memcpy(&slot, type, typeLen);
101 if (slot << 1 >> 1 != slot)
102 goto useCharStar;
103 slot <<= 1;
104 slot |= 1;
105 fType = (char*) slot;
106 } else {
107useCharStar:
108 fType = (char*) sk_malloc_throw(typeLen + 1);
109 SkASSERT(((size_t) fType & 1) == 0);
110 memcpy(fType, type, typeLen);
111 fType[typeLen] = 0;
112 }
113}
114
115void SkEvent::setType(const SkString& type)
116{
117 setType(type.c_str());
118}
119
120////////////////////////////////////////////////////////////////////////////
121
122#include "SkParse.h"
123
124void SkEvent::inflate(const SkDOM& dom, const SkDOM::Node* node)
125{
126 const char* name = dom.findAttr(node, "type");
127 if (name)
128 this->setType(name);
129
130 const char* value;
halcanary96fcdcc2015-08-27 07:41:13 -0700131 if ((value = dom.findAttr(node, "fast32")) != nullptr)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000132 {
133 int32_t n;
134 if (SkParse::FindS32(value, &n))
135 this->setFast32(n);
136 }
137
138 for (node = dom.getFirstChild(node); node; node = dom.getNextSibling(node))
139 {
140 if (strcmp(dom.getName(node), "data"))
141 {
142 SkDEBUGCODE(SkDebugf("SkEvent::inflate unrecognized subelement <%s>\n", dom.getName(node));)
143 continue;
144 }
145
146 name = dom.findAttr(node, "name");
halcanary96fcdcc2015-08-27 07:41:13 -0700147 if (name == nullptr)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000148 {
149 SkDEBUGCODE(SkDebugf("SkEvent::inflate missing required \"name\" attribute in <data> subelement\n");)
150 continue;
151 }
152
halcanary96fcdcc2015-08-27 07:41:13 -0700153 if ((value = dom.findAttr(node, "s32")) != nullptr)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000154 {
155 int32_t n;
156 if (SkParse::FindS32(value, &n))
157 this->setS32(name, n);
158 }
halcanary96fcdcc2015-08-27 07:41:13 -0700159 else if ((value = dom.findAttr(node, "scalar")) != nullptr)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000160 {
161 SkScalar x;
162 if (SkParse::FindScalar(value, &x))
163 this->setScalar(name, x);
164 }
halcanary96fcdcc2015-08-27 07:41:13 -0700165 else if ((value = dom.findAttr(node, "string")) != nullptr)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000166 this->setString(name, value);
167#ifdef SK_DEBUG
168 else
169 {
170 SkDebugf("SkEvent::inflate <data name=\"%s\"> subelement missing required type attribute [S32 | scalar | string]\n", name);
171 }
172#endif
173 }
174}
175
176#ifdef SK_DEBUG
177
178 #ifndef SkScalarToFloat
179 #define SkScalarToFloat(x) ((x) / 65536.f)
180 #endif
181
182 void SkEvent::dump(const char title[])
183 {
184 if (title)
185 SkDebugf("%s ", title);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000186
reed@android.com8a1c16f2008-12-17 15:59:43 +0000187 SkString etype;
188 this->getType(&etype);
189 SkDebugf("event<%s> fast32=%d", etype.c_str(), this->getFast32());
190
191 const SkMetaData& md = this->getMetaData();
192 SkMetaData::Iter iter(md);
193 SkMetaData::Type mtype;
194 int count;
195 const char* name;
rmistry@google.comd6176b02012-08-23 18:14:13 +0000196
halcanary96fcdcc2015-08-27 07:41:13 -0700197 while ((name = iter.next(&mtype, &count)) != nullptr)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000198 {
199 SkASSERT(count > 0);
200
201 SkDebugf(" <%s>=", name);
202 switch (mtype) {
203 case SkMetaData::kS32_Type: // vector version???
204 {
205 int32_t value;
206 md.findS32(name, &value);
207 SkDebugf("%d ", value);
208 }
209 break;
210 case SkMetaData::kScalar_Type:
211 {
halcanary96fcdcc2015-08-27 07:41:13 -0700212 const SkScalar* values = md.findScalars(name, &count, nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000213 SkDebugf("%f", SkScalarToFloat(values[0]));
214 for (int i = 1; i < count; i++)
215 SkDebugf(", %f", SkScalarToFloat(values[i]));
216 SkDebugf(" ");
217 }
218 break;
219 case SkMetaData::kString_Type:
220 {
221 const char* value = md.findString(name);
222 SkASSERT(value);
223 SkDebugf("<%s> ", value);
224 }
225 break;
226 case SkMetaData::kPtr_Type: // vector version???
227 {
228 void* value;
229 md.findPtr(name, &value);
230 SkDebugf("%p ", value);
231 }
232 break;
233 case SkMetaData::kBool_Type: // vector version???
234 {
235 bool value;
236 md.findBool(name, &value);
237 SkDebugf("%s ", value ? "true" : "false");
238 }
239 break;
240 default:
tomhudson@google.com0c00f212011-12-28 14:59:50 +0000241 SkDEBUGFAIL("unknown metadata type returned from iterator");
reed@android.com8a1c16f2008-12-17 15:59:43 +0000242 break;
243 }
244 }
245 SkDebugf("\n");
246 }
247#endif
248
249///////////////////////////////////////////////////////////////////////////////////////
250
251#ifdef SK_DEBUG
252// #define SK_TRACE_EVENTSx
253#endif
254
255#ifdef SK_TRACE_EVENTS
256 static void event_log(const char s[])
257 {
258 SkDEBUGF(("%s\n", s));
259 }
260
261 #define EVENT_LOG(s) event_log(s)
262 #define EVENT_LOGN(s, n) do { SkString str(s); str.append(" "); str.appendS32(n); event_log(str.c_str()); } while (0)
263#else
264 #define EVENT_LOG(s)
265 #define EVENT_LOGN(s, n)
266#endif
267
mtklein1b249332015-07-07 12:21:21 -0700268#include "SkMutex.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +0000269#include "SkTime.h"
270
reed@google.com9998c662011-11-17 22:09:47 +0000271class SkEvent_Globals {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000272public:
reed@google.com9998c662011-11-17 22:09:47 +0000273 SkEvent_Globals() {
halcanary96fcdcc2015-08-27 07:41:13 -0700274 fEventQHead = nullptr;
275 fEventQTail = nullptr;
276 fDelayQHead = nullptr;
reed@google.com9998c662011-11-17 22:09:47 +0000277 SkDEBUGCODE(fEventCounter = 0;)
278 }
279
reed@android.com8a1c16f2008-12-17 15:59:43 +0000280 SkMutex fEventMutex;
281 SkEvent* fEventQHead, *fEventQTail;
282 SkEvent* fDelayQHead;
283 SkDEBUGCODE(int fEventCounter;)
284};
285
reed@google.com9998c662011-11-17 22:09:47 +0000286static SkEvent_Globals& getGlobals() {
287 // leak this, so we don't incure any shutdown perf hit
288 static SkEvent_Globals* gGlobals = new SkEvent_Globals;
289 return *gGlobals;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000290}
291
reed@google.com87fac4a2011-08-04 13:50:17 +0000292///////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +0000293
reed@google.com87fac4a2011-08-04 13:50:17 +0000294void SkEvent::postDelay(SkMSec delay) {
295 if (!fTargetID && !fTargetProc) {
reed@google.comc514dde2011-08-03 19:41:24 +0000296 delete this;
reed@google.com87fac4a2011-08-04 13:50:17 +0000297 return;
298 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000299
reed@google.com87fac4a2011-08-04 13:50:17 +0000300 if (delay) {
benjaminwagnerec4d4d72016-03-25 12:59:53 -0700301 this->postTime(GetMSecsSinceStartup() + delay);
reed@google.com87fac4a2011-08-04 13:50:17 +0000302 return;
303 }
304
reed@google.com9998c662011-11-17 22:09:47 +0000305 SkEvent_Globals& globals = getGlobals();
reed@google.com87fac4a2011-08-04 13:50:17 +0000306
307 globals.fEventMutex.acquire();
308 bool wasEmpty = SkEvent::Enqueue(this);
309 globals.fEventMutex.release();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000310
reed@google.com87fac4a2011-08-04 13:50:17 +0000311 // call outside of us holding the mutex
312 if (wasEmpty) {
313 SkEvent::SignalNonEmptyQueue();
reed@google.comc514dde2011-08-03 19:41:24 +0000314 }
315}
316
reed@google.com87fac4a2011-08-04 13:50:17 +0000317void SkEvent::postTime(SkMSec time) {
318 if (!fTargetID && !fTargetProc) {
319 delete this;
320 return;
321 }
322
reed@google.com9998c662011-11-17 22:09:47 +0000323 SkEvent_Globals& globals = getGlobals();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000324
reed@google.com87fac4a2011-08-04 13:50:17 +0000325 globals.fEventMutex.acquire();
326 SkMSec queueDelay = SkEvent::EnqueueTime(this, time);
327 globals.fEventMutex.release();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000328
reed@google.com87fac4a2011-08-04 13:50:17 +0000329 // call outside of us holding the mutex
330 if ((int32_t)queueDelay != ~0) {
331 SkEvent::SignalQueueTimer(queueDelay);
332 }
333}
334
335bool SkEvent::Enqueue(SkEvent* evt) {
reed@google.com9998c662011-11-17 22:09:47 +0000336 SkEvent_Globals& globals = getGlobals();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000337 // gEventMutex acquired by caller
338
339 SkASSERT(evt);
340
halcanary96fcdcc2015-08-27 07:41:13 -0700341 bool wasEmpty = globals.fEventQHead == nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000342
343 if (globals.fEventQTail)
344 globals.fEventQTail->fNextEvent = evt;
345 globals.fEventQTail = evt;
halcanary96fcdcc2015-08-27 07:41:13 -0700346 if (globals.fEventQHead == nullptr)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000347 globals.fEventQHead = evt;
halcanary96fcdcc2015-08-27 07:41:13 -0700348 evt->fNextEvent = nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000349
350 SkDEBUGCODE(++globals.fEventCounter);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000351
352 return wasEmpty;
353}
354
reed@google.com87fac4a2011-08-04 13:50:17 +0000355SkEvent* SkEvent::Dequeue() {
reed@google.com9998c662011-11-17 22:09:47 +0000356 SkEvent_Globals& globals = getGlobals();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000357 globals.fEventMutex.acquire();
358
359 SkEvent* evt = globals.fEventQHead;
reed@google.com87fac4a2011-08-04 13:50:17 +0000360 if (evt) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000361 SkDEBUGCODE(--globals.fEventCounter);
362
reed@android.com8a1c16f2008-12-17 15:59:43 +0000363 globals.fEventQHead = evt->fNextEvent;
halcanary96fcdcc2015-08-27 07:41:13 -0700364 if (globals.fEventQHead == nullptr) {
365 globals.fEventQTail = nullptr;
reed@google.com87fac4a2011-08-04 13:50:17 +0000366 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000367 }
368 globals.fEventMutex.release();
369
reed@android.com8a1c16f2008-12-17 15:59:43 +0000370 return evt;
371}
372
reed@google.com87fac4a2011-08-04 13:50:17 +0000373bool SkEvent::QHasEvents() {
reed@google.com9998c662011-11-17 22:09:47 +0000374 SkEvent_Globals& globals = getGlobals();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000375
376 // this is not thread accurate, need a semaphore for that
halcanary96fcdcc2015-08-27 07:41:13 -0700377 return globals.fEventQHead != nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000378}
379
380#ifdef SK_TRACE_EVENTS
381 static int gDelayDepth;
382#endif
383
reed@google.com87fac4a2011-08-04 13:50:17 +0000384SkMSec SkEvent::EnqueueTime(SkEvent* evt, SkMSec time) {
reed@google.com9998c662011-11-17 22:09:47 +0000385 SkEvent_Globals& globals = getGlobals();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000386 // gEventMutex acquired by caller
387
388 SkEvent* curr = globals.fDelayQHead;
halcanary96fcdcc2015-08-27 07:41:13 -0700389 SkEvent* prev = nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000390
reed@google.com87fac4a2011-08-04 13:50:17 +0000391 while (curr) {
392 if (SkMSec_LT(time, curr->fTime)) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000393 break;
reed@google.com87fac4a2011-08-04 13:50:17 +0000394 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000395 prev = curr;
396 curr = curr->fNextEvent;
397 }
398
399 evt->fTime = time;
400 evt->fNextEvent = curr;
halcanary96fcdcc2015-08-27 07:41:13 -0700401 if (prev == nullptr) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000402 globals.fDelayQHead = evt;
reed@google.com87fac4a2011-08-04 13:50:17 +0000403 } else {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000404 prev->fNextEvent = evt;
reed@google.com87fac4a2011-08-04 13:50:17 +0000405 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000406
benjaminwagnerec4d4d72016-03-25 12:59:53 -0700407 SkMSec delay = globals.fDelayQHead->fTime - GetMSecsSinceStartup();
reed@google.com87fac4a2011-08-04 13:50:17 +0000408 if ((int32_t)delay <= 0) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000409 delay = 1;
reed@google.com87fac4a2011-08-04 13:50:17 +0000410 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000411 return delay;
412}
413
reed@google.com87fac4a2011-08-04 13:50:17 +0000414///////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +0000415
416#include "SkEventSink.h"
417
reed@google.com87fac4a2011-08-04 13:50:17 +0000418bool SkEvent::ProcessEvent() {
Ben Wagner145dbcd2016-11-03 14:40:50 -0400419 std::unique_ptr<SkEvent> evt(SkEvent::Dequeue());
420 bool again = false;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000421
422 EVENT_LOGN("ProcessEvent", (int32_t)evt);
423
reed@google.com87fac4a2011-08-04 13:50:17 +0000424 if (evt) {
425 (void)SkEventSink::DoEvent(*evt);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000426 again = SkEvent::QHasEvents();
427 }
428 return again;
429}
430
431void SkEvent::ServiceQueueTimer()
432{
reed@google.com9998c662011-11-17 22:09:47 +0000433 SkEvent_Globals& globals = getGlobals();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000434
435 globals.fEventMutex.acquire();
436
437 bool wasEmpty = false;
benjaminwagnerec4d4d72016-03-25 12:59:53 -0700438 SkMSec now = GetMSecsSinceStartup();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000439 SkEvent* evt = globals.fDelayQHead;
440
441 while (evt)
442 {
443 if (SkMSec_LT(now, evt->fTime))
444 break;
445
446#ifdef SK_TRACE_EVENTS
447 --gDelayDepth;
448 SkDebugf("dequeue-delay %s (%d)", evt->getType(), gDelayDepth);
449 const char* idStr = evt->findString("id");
450 if (idStr)
451 SkDebugf(" (%s)", idStr);
452 SkDebugf("\n");
453#endif
454
455 SkEvent* next = evt->fNextEvent;
456 if (SkEvent::Enqueue(evt))
457 wasEmpty = true;
458 evt = next;
459 }
460 globals.fDelayQHead = evt;
461
462 SkMSec time = evt ? evt->fTime - now : 0;
463
464 globals.fEventMutex.release();
465
466 if (wasEmpty)
467 SkEvent::SignalNonEmptyQueue();
468
469 SkEvent::SignalQueueTimer(time);
470}
471
reed@android.comf2b98d62010-12-20 18:26:13 +0000472int SkEvent::CountEventsOnQueue() {
reed@google.com9998c662011-11-17 22:09:47 +0000473 SkEvent_Globals& globals = getGlobals();
reed@android.comf2b98d62010-12-20 18:26:13 +0000474 globals.fEventMutex.acquire();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000475
reed@android.comf2b98d62010-12-20 18:26:13 +0000476 int count = 0;
477 const SkEvent* evt = globals.fEventQHead;
478 while (evt) {
479 count += 1;
480 evt = evt->fNextEvent;
481 }
482 globals.fEventMutex.release();
483
484 return count;
485}
486
benjaminwagnerec4d4d72016-03-25 12:59:53 -0700487SkMSec SkEvent::GetMSecsSinceStartup() {
488 static const double kEpoch = SkTime::GetMSecs();
489 return static_cast<SkMSec>(SkTime::GetMSecs() - kEpoch);
490}
491
reed@google.com9998c662011-11-17 22:09:47 +0000492///////////////////////////////////////////////////////////////////////////////
reed@android.com8a1c16f2008-12-17 15:59:43 +0000493
reed@google.com9998c662011-11-17 22:09:47 +0000494void SkEvent::Init() {}
reed@android.com8a1c16f2008-12-17 15:59:43 +0000495
reed@google.com9998c662011-11-17 22:09:47 +0000496void SkEvent::Term() {
497 SkEvent_Globals& globals = getGlobals();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000498
499 SkEvent* evt = globals.fEventQHead;
reed@google.com9998c662011-11-17 22:09:47 +0000500 while (evt) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000501 SkEvent* next = evt->fNextEvent;
502 delete evt;
503 evt = next;
504 }
505
506 evt = globals.fDelayQHead;
reed@google.com9998c662011-11-17 22:09:47 +0000507 while (evt) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000508 SkEvent* next = evt->fNextEvent;
509 delete evt;
510 evt = next;
511 }
512}