1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkEvent.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comvoid SkEvent::initialize(const char* type, size_t typeLen, 1387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com SkEventSinkID targetID) { 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fType = NULL; 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com setType(type, typeLen); 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com f32 = 0; 1787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com fTargetID = targetID; 1887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com fTargetProc = NULL; 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fTime = 0; 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fNextEvent = NULL; 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkEvent::SkEvent() 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 2787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com initialize("", 0, 0); 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkEvent::SkEvent(const SkEvent& src) 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *this = src; 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (((size_t) fType & 1) == 0) 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com setType(src.fType); 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comSkEvent::SkEvent(const SkString& type, SkEventSinkID targetID) 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 3987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com initialize(type.c_str(), type.size(), targetID); 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comSkEvent::SkEvent(const char type[], SkEventSinkID targetID) 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(type); 4587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com initialize(type, strlen(type), targetID); 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkEvent::~SkEvent() 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (((size_t) fType & 1) == 0) 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com sk_free((void*) fType); 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic size_t makeCharArray(char* buffer, size_t compact) 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t bits = (size_t) compact >> 1; 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(buffer, &bits, sizeof(compact)); 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com buffer[sizeof(compact)] = 0; 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return strlen(buffer); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 62d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comvoid SkEvent::getType(SkString* str) const 63d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com{ 64d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (str) 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if ((size_t) fType & 1) // not a pointer 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com char chars[sizeof(size_t) + 1]; 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t len = makeCharArray(chars, (size_t) fType); 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com str->set(chars, len); 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com str->set(fType); 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 77d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.combool SkEvent::isType(const SkString& str) const 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 79d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com return this->isType(str.c_str(), str.size()); 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 82d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.combool SkEvent::isType(const char type[], size_t typeLen) const 83d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com{ 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (typeLen == 0) 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typeLen = strlen(type); 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if ((size_t) fType & 1) { // not a pointer 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com char chars[sizeof(size_t) + 1]; 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t len = makeCharArray(chars, (size_t) fType); 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return len == typeLen && strncmp(chars, type, typeLen) == 0; 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 91d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com return strncmp(fType, type, typeLen) == 0 && fType[typeLen] == 0; 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvent::setType(const char type[], size_t typeLen) 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (typeLen == 0) 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typeLen = strlen(type); 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (typeLen <= sizeof(fType)) { 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t slot = 0; 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(&slot, type, typeLen); 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (slot << 1 >> 1 != slot) 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com goto useCharStar; 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com slot <<= 1; 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com slot |= 1; 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fType = (char*) slot; 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comuseCharStar: 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fType = (char*) sk_malloc_throw(typeLen + 1); 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(((size_t) fType & 1) == 0); 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(fType, type, typeLen); 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fType[typeLen] = 0; 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvent::setType(const SkString& type) 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com setType(type.c_str()); 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////// 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkParse.h" 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvent::inflate(const SkDOM& dom, const SkDOM::Node* node) 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* name = dom.findAttr(node, "type"); 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (name) 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->setType(name); 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* value; 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if ((value = dom.findAttr(node, "fast32")) != NULL) 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int32_t n; 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SkParse::FindS32(value, &n)) 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->setFast32(n); 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (node = dom.getFirstChild(node); node; node = dom.getNextSibling(node)) 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (strcmp(dom.getName(node), "data")) 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDEBUGCODE(SkDebugf("SkEvent::inflate unrecognized subelement <%s>\n", dom.getName(node));) 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com continue; 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com name = dom.findAttr(node, "name"); 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (name == NULL) 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDEBUGCODE(SkDebugf("SkEvent::inflate missing required \"name\" attribute in <data> subelement\n");) 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com continue; 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if ((value = dom.findAttr(node, "s32")) != NULL) 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int32_t n; 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SkParse::FindS32(value, &n)) 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->setS32(name, n); 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if ((value = dom.findAttr(node, "scalar")) != NULL) 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScalar x; 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SkParse::FindScalar(value, &x)) 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->setScalar(name, x); 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else if ((value = dom.findAttr(node, "string")) != NULL) 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->setString(name, value); 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("SkEvent::inflate <data name=\"%s\"> subelement missing required type attribute [S32 | scalar | string]\n", name); 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #ifndef SkScalarToFloat 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SkScalarToFloat(x) ((x) / 65536.f) 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #endif 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void SkEvent::dump(const char title[]) 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (title) 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%s ", title); 186d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkString etype; 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->getType(&etype); 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("event<%s> fast32=%d", etype.c_str(), this->getFast32()); 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkMetaData& md = this->getMetaData(); 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMetaData::Iter iter(md); 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMetaData::Type mtype; 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int count; 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* name; 196d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while ((name = iter.next(&mtype, &count)) != NULL) 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(count > 0); 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf(" <%s>=", name); 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com switch (mtype) { 2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case SkMetaData::kS32_Type: // vector version??? 2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int32_t value; 2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com md.findS32(name, &value); 2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%d ", value); 2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case SkMetaData::kScalar_Type: 2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkScalar* values = md.findScalars(name, &count, NULL); 2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%f", SkScalarToFloat(values[0])); 2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (int i = 1; i < count; i++) 2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf(", %f", SkScalarToFloat(values[i])); 2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf(" "); 2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case SkMetaData::kString_Type: 2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* value = md.findString(name); 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(value); 2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("<%s> ", value); 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case SkMetaData::kPtr_Type: // vector version??? 2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void* value; 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com md.findPtr(name, &value); 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%p ", value); 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com case SkMetaData::kBool_Type: // vector version??? 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool value; 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com md.findBool(name, &value); 2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%s ", value ? "true" : "false"); 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com default: 2410c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("unknown metadata type returned from iterator"); 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("\n"); 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////////////// 2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// #define SK_TRACE_EVENTSx 2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_TRACE_EVENTS 2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static void event_log(const char s[]) 2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDEBUGF(("%s\n", s)); 2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define EVENT_LOG(s) event_log(s) 2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define EVENT_LOGN(s, n) do { SkString str(s); str.append(" "); str.appendS32(n); event_log(str.c_str()); } while (0) 2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define EVENT_LOG(s) 2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define EVENT_LOGN(s, n) 2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkThread.h" 2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h" 2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2719998c669300281b5682fce72b036c1a6a619a44ereed@google.comclass SkEvent_Globals { 2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 2739998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals() { 2749998c669300281b5682fce72b036c1a6a619a44ereed@google.com fEventQHead = NULL; 2759998c669300281b5682fce72b036c1a6a619a44ereed@google.com fEventQTail = NULL; 2769998c669300281b5682fce72b036c1a6a619a44ereed@google.com fDelayQHead = NULL; 2779998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkDEBUGCODE(fEventCounter = 0;) 2789998c669300281b5682fce72b036c1a6a619a44ereed@google.com } 2799998c669300281b5682fce72b036c1a6a619a44ereed@google.com 2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMutex fEventMutex; 2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* fEventQHead, *fEventQTail; 2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* fDelayQHead; 2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDEBUGCODE(int fEventCounter;) 2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2869998c669300281b5682fce72b036c1a6a619a44ereed@google.comstatic SkEvent_Globals& getGlobals() { 2879998c669300281b5682fce72b036c1a6a619a44ereed@google.com // leak this, so we don't incure any shutdown perf hit 2889998c669300281b5682fce72b036c1a6a619a44ereed@google.com static SkEvent_Globals* gGlobals = new SkEvent_Globals; 2899998c669300281b5682fce72b036c1a6a619a44ereed@google.com return *gGlobals; 2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 29287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com/////////////////////////////////////////////////////////////////////////////// 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 29487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comvoid SkEvent::postDelay(SkMSec delay) { 29587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (!fTargetID && !fTargetProc) { 29687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com delete this; 29787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com return; 2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 299d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 30087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (delay) { 30187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com this->postTime(SkTime::GetMSecs() + delay); 30287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com return; 30387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com } 30487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com 3059998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals& globals = getGlobals(); 3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventMutex.acquire(); 30887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com bool wasEmpty = SkEvent::Enqueue(this); 3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventMutex.release(); 310d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // call outside of us holding the mutex 31287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (wasEmpty) { 3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent::SignalNonEmptyQueue(); 31487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com } 3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 31787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comvoid SkEvent::postTime(SkMSec time) { 31887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (!fTargetID && !fTargetProc) { 31987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com delete this; 32087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com return; 3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3239998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals& globals = getGlobals(); 324d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventMutex.acquire(); 32687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com SkMSec queueDelay = SkEvent::EnqueueTime(this, time); 3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventMutex.release(); 328d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // call outside of us holding the mutex 33087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if ((int32_t)queueDelay != ~0) { 3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent::SignalQueueTimer(queueDelay); 332c514dde99e10fb3dbfff5a15537211a7eb094365reed@google.com } 333c514dde99e10fb3dbfff5a15537211a7eb094365reed@google.com} 334c514dde99e10fb3dbfff5a15537211a7eb094365reed@google.com 33587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.combool SkEvent::Enqueue(SkEvent* evt) { 3369998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals& globals = getGlobals(); 3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // gEventMutex acquired by caller 3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(evt); 3408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool wasEmpty = globals.fEventQHead == NULL; 3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (globals.fEventQTail) 3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventQTail->fNextEvent = evt; 3458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventQTail = evt; 3468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (globals.fEventQHead == NULL) 3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventQHead = evt; 3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com evt->fNextEvent = NULL; 3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDEBUGCODE(++globals.fEventCounter); 3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return wasEmpty; 3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 35587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comSkEvent* SkEvent::Dequeue() { 3569998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals& globals = getGlobals(); 3578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventMutex.acquire(); 3588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* evt = globals.fEventQHead; 36087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (evt) { 3618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDEBUGCODE(--globals.fEventCounter); 3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventQHead = evt->fNextEvent; 36487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (globals.fEventQHead == NULL) { 3658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventQTail = NULL; 36687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com } 3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventMutex.release(); 3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return evt; 3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 37387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.combool SkEvent::QHasEvents() { 3749998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals& globals = getGlobals(); 3758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // this is not thread accurate, need a semaphore for that 3778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return globals.fEventQHead != NULL; 3788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 3798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_TRACE_EVENTS 3818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static int gDelayDepth; 3828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 38487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.comSkMSec SkEvent::EnqueueTime(SkEvent* evt, SkMSec time) { 3859998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals& globals = getGlobals(); 3868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // gEventMutex acquired by caller 3878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* curr = globals.fDelayQHead; 3898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* prev = NULL; 3908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 39187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com while (curr) { 39287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (SkMSec_LT(time, curr->fTime)) { 3938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 39487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com } 3958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com prev = curr; 3968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com curr = curr->fNextEvent; 3978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 3988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com evt->fTime = time; 4008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com evt->fNextEvent = curr; 40187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (prev == NULL) { 4028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fDelayQHead = evt; 40387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com } else { 4048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com prev->fNextEvent = evt; 40587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com } 4068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMSec delay = globals.fDelayQHead->fTime - SkTime::GetMSecs(); 40887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if ((int32_t)delay <= 0) { 4098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com delay = 1; 41087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com } 4118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return delay; 4128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 4138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 41487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com/////////////////////////////////////////////////////////////////////////////// 4158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkEventSink.h" 4178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 41887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.combool SkEvent::ProcessEvent() { 41987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com SkEvent* evt = SkEvent::Dequeue(); 4208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAutoTDelete<SkEvent> autoDelete(evt); 42187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com bool again = false; 4228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com EVENT_LOGN("ProcessEvent", (int32_t)evt); 4248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 42587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com if (evt) { 42687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com (void)SkEventSink::DoEvent(*evt); 4278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com again = SkEvent::QHasEvents(); 4288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return again; 4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 4318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkEvent::ServiceQueueTimer() 4338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 4349998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals& globals = getGlobals(); 4358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventMutex.acquire(); 4378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool wasEmpty = false; 4398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMSec now = SkTime::GetMSecs(); 4408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* evt = globals.fDelayQHead; 4418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (evt) 4438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SkMSec_LT(now, evt->fTime)) 4458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com break; 4468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_TRACE_EVENTS 4488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com --gDelayDepth; 4498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("dequeue-delay %s (%d)", evt->getType(), gDelayDepth); 4508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* idStr = evt->findString("id"); 4518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (idStr) 4528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf(" (%s)", idStr); 4538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("\n"); 4548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 4558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* next = evt->fNextEvent; 4578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SkEvent::Enqueue(evt)) 4588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com wasEmpty = true; 4598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com evt = next; 4608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 4618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fDelayQHead = evt; 4628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMSec time = evt ? evt->fTime - now : 0; 4648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com globals.fEventMutex.release(); 4668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (wasEmpty) 4688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent::SignalNonEmptyQueue(); 4698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent::SignalQueueTimer(time); 4718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 4728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 473f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comint SkEvent::CountEventsOnQueue() { 4749998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals& globals = getGlobals(); 475f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com globals.fEventMutex.acquire(); 476d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 477f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com int count = 0; 478f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com const SkEvent* evt = globals.fEventQHead; 479f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com while (evt) { 480f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com count += 1; 481f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com evt = evt->fNextEvent; 482f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com } 483f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com globals.fEventMutex.release(); 484f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 485f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com return count; 486f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com} 487f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 4889998c669300281b5682fce72b036c1a6a619a44ereed@google.com/////////////////////////////////////////////////////////////////////////////// 4898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4909998c669300281b5682fce72b036c1a6a619a44ereed@google.comvoid SkEvent::Init() {} 4918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4929998c669300281b5682fce72b036c1a6a619a44ereed@google.comvoid SkEvent::Term() { 4939998c669300281b5682fce72b036c1a6a619a44ereed@google.com SkEvent_Globals& globals = getGlobals(); 4948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 4958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* evt = globals.fEventQHead; 4969998c669300281b5682fce72b036c1a6a619a44ereed@google.com while (evt) { 4978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* next = evt->fNextEvent; 4988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com delete evt; 4998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com evt = next; 5008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 5018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com evt = globals.fDelayQHead; 5039998c669300281b5682fce72b036c1a6a619a44ereed@google.com while (evt) { 5048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkEvent* next = evt->fNextEvent; 5058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com delete evt; 5068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com evt = next; 5078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 5088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 509