blob: 11af0f9623cba853f00729b55f9d8fe992e9f1a6 [file] [log] [blame]
/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkEventSink.h"
#include "SkMutex.h"
#include "SkTime.h"
class SkEventSink_Globals {
public:
SkEventSink_Globals() {
fNextSinkID = 0;
fSinkHead = nullptr;
}
SkMutex fSinkMutex;
SkEventSinkID fNextSinkID;
SkEventSink* fSinkHead;
};
static SkEventSink_Globals& getGlobals() {
// leak this, so we don't incur any shutdown perf hit
static SkEventSink_Globals* gGlobals = new SkEventSink_Globals;
return *gGlobals;
}
SkEventSink::SkEventSink() {
SkEventSink_Globals& globals = getGlobals();
globals.fSinkMutex.acquire();
fID = ++globals.fNextSinkID;
fNextSink = globals.fSinkHead;
globals.fSinkHead = this;
globals.fSinkMutex.release();
}
SkEventSink::~SkEventSink() {
SkEventSink_Globals& globals = getGlobals();
globals.fSinkMutex.acquire();
SkEventSink* sink = globals.fSinkHead;
SkEventSink* prev = nullptr;
for (;;) {
SkEventSink* next = sink->fNextSink;
if (sink == this) {
if (prev) {
prev->fNextSink = next;
} else {
globals.fSinkHead = next;
}
break;
}
prev = sink;
sink = next;
}
globals.fSinkMutex.release();
}
bool SkEventSink::doEvent(const SkEvent& evt) {
return this->onEvent(evt);
}
bool SkEventSink::doQuery(SkEvent* evt) {
SkASSERT(evt);
return this->onQuery(evt);
}
bool SkEventSink::onEvent(const SkEvent&) {
return false;
}
bool SkEventSink::onQuery(SkEvent*) {
return false;
}
///////////////////////////////////////////////////////////////////////////////
SkEventSink* SkEventSink::FindSink(SkEventSinkID sinkID)
{
if (sinkID == 0)
return nullptr;
SkEventSink_Globals& globals = getGlobals();
SkAutoMutexAcquire ac(globals.fSinkMutex);
SkEventSink* sink = globals.fSinkHead;
while (sink)
{
if (sink->getSinkID() == sinkID)
return sink;
sink = sink->fNextSink;
}
return nullptr;
}