| /* |
| * 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; |
| } |