blob: 11af0f9623cba853f00729b55f9d8fe992e9f1a6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
/*
* 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;
}
|