blob: 11af0f9623cba853f00729b55f9d8fe992e9f1a6 [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
9#include "SkEventSink.h"
mtklein1b249332015-07-07 12:21:21 -070010#include "SkMutex.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000011#include "SkTime.h"
12
reed@google.com9998c662011-11-17 22:09:47 +000013class SkEventSink_Globals {
reed@android.com8a1c16f2008-12-17 15:59:43 +000014public:
reed@google.com9998c662011-11-17 22:09:47 +000015 SkEventSink_Globals() {
16 fNextSinkID = 0;
halcanary96fcdcc2015-08-27 07:41:13 -070017 fSinkHead = nullptr;
reed@google.com9998c662011-11-17 22:09:47 +000018 }
19
reed@android.com8a1c16f2008-12-17 15:59:43 +000020 SkMutex fSinkMutex;
21 SkEventSinkID fNextSinkID;
22 SkEventSink* fSinkHead;
23};
24
reed@google.com9998c662011-11-17 22:09:47 +000025static SkEventSink_Globals& getGlobals() {
26 // leak this, so we don't incur any shutdown perf hit
27 static SkEventSink_Globals* gGlobals = new SkEventSink_Globals;
28 return *gGlobals;
reed@android.com8a1c16f2008-12-17 15:59:43 +000029}
30
Brian Osman4f99e582017-11-22 13:23:35 -050031SkEventSink::SkEventSink() {
reed@google.com9998c662011-11-17 22:09:47 +000032 SkEventSink_Globals& globals = getGlobals();
reed@android.com8a1c16f2008-12-17 15:59:43 +000033
34 globals.fSinkMutex.acquire();
35
36 fID = ++globals.fNextSinkID;
37 fNextSink = globals.fSinkHead;
38 globals.fSinkHead = this;
39
40 globals.fSinkMutex.release();
41}
42
reed@google.com9998c662011-11-17 22:09:47 +000043SkEventSink::~SkEventSink() {
44 SkEventSink_Globals& globals = getGlobals();
reed@android.com8a1c16f2008-12-17 15:59:43 +000045
reed@android.com8a1c16f2008-12-17 15:59:43 +000046 globals.fSinkMutex.acquire();
47
48 SkEventSink* sink = globals.fSinkHead;
halcanary96fcdcc2015-08-27 07:41:13 -070049 SkEventSink* prev = nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +000050
reed@google.com9998c662011-11-17 22:09:47 +000051 for (;;) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000052 SkEventSink* next = sink->fNextSink;
reed@google.com9998c662011-11-17 22:09:47 +000053 if (sink == this) {
54 if (prev) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000055 prev->fNextSink = next;
reed@google.com9998c662011-11-17 22:09:47 +000056 } else {
reed@android.com8a1c16f2008-12-17 15:59:43 +000057 globals.fSinkHead = next;
reed@google.com9998c662011-11-17 22:09:47 +000058 }
reed@android.com8a1c16f2008-12-17 15:59:43 +000059 break;
60 }
61 prev = sink;
62 sink = next;
63 }
64 globals.fSinkMutex.release();
65}
66
reed@google.com9998c662011-11-17 22:09:47 +000067bool SkEventSink::doEvent(const SkEvent& evt) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000068 return this->onEvent(evt);
69}
70
reed@google.com9998c662011-11-17 22:09:47 +000071bool SkEventSink::doQuery(SkEvent* evt) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000072 SkASSERT(evt);
73 return this->onQuery(evt);
74}
75
reed@google.com9998c662011-11-17 22:09:47 +000076bool SkEventSink::onEvent(const SkEvent&) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000077 return false;
78}
79
reed@google.com9998c662011-11-17 22:09:47 +000080bool SkEventSink::onQuery(SkEvent*) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000081 return false;
82}
83
84///////////////////////////////////////////////////////////////////////////////
85
reed@android.com8a1c16f2008-12-17 15:59:43 +000086SkEventSink* SkEventSink::FindSink(SkEventSinkID sinkID)
87{
88 if (sinkID == 0)
Ben Wagnera93a14a2017-08-28 10:34:05 -040089 return nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +000090
reed@google.com9998c662011-11-17 22:09:47 +000091 SkEventSink_Globals& globals = getGlobals();
reed@android.com8a1c16f2008-12-17 15:59:43 +000092 SkAutoMutexAcquire ac(globals.fSinkMutex);
93 SkEventSink* sink = globals.fSinkHead;
94
95 while (sink)
96 {
97 if (sink->getSinkID() == sinkID)
98 return sink;
99 sink = sink->fNextSink;
100 }
halcanary96fcdcc2015-08-27 07:41:13 -0700101 return nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000102}