OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
11 * notice, this list of conditions and the following disclaimer in the | 11 * notice, this list of conditions and the following disclaimer in the |
12 * documentation and/or other materials provided with the distribution. | 12 * documentation and/or other materials provided with the distribution. |
13 * | 13 * |
14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | 17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 */ | 24 */ |
25 | 25 |
26 #include "modules/indexeddb/WebIDBDatabaseCallbacksImpl.h" | 26 #include "modules/indexeddb/WebIDBDatabaseCallbacksImpl.h" |
27 | 27 |
28 #include "core/dom/DOMException.h" | 28 #include "core/dom/DOMException.h" |
29 #include "wtf/PtrUtil.h" | 29 #include "wtf/PtrUtil.h" |
30 #include "wtf/ThreadSpecific.h" | |
30 #include <memory> | 31 #include <memory> |
31 | 32 |
32 namespace blink { | 33 namespace blink { |
33 | 34 |
35 // This thread-specific list keeps track of instances of | |
36 // WebIDBDatabaseCallbacksImpl created by each thread. If a thread exits | |
37 // before they are destroyed then they would otherwise be leaked because the IO | |
38 // thread can no longer post a task to the thread on which they were created. | |
39 using CallbacksList = std::vector<std::unique_ptr<WebIDBDatabaseCallbacksImpl>>; | |
40 static ThreadSpecific<CallbacksList>& outstandingCallbacks() { | |
41 DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<CallbacksList>, callbacks, | |
42 new ThreadSpecific<CallbacksList>); | |
43 return callbacks; | |
44 } | |
45 | |
34 // static | 46 // static |
35 std::unique_ptr<WebIDBDatabaseCallbacksImpl> | 47 std::unique_ptr<WebIDBDatabaseCallbacksImpl> |
36 WebIDBDatabaseCallbacksImpl::create(IDBDatabaseCallbacks* callbacks) { | 48 WebIDBDatabaseCallbacksImpl::create(IDBDatabaseCallbacks* callbacks) { |
37 return wrapUnique(new WebIDBDatabaseCallbacksImpl(callbacks)); | 49 return wrapUnique(new WebIDBDatabaseCallbacksImpl(callbacks)); |
38 } | 50 } |
39 | 51 |
40 WebIDBDatabaseCallbacksImpl::WebIDBDatabaseCallbacksImpl( | 52 WebIDBDatabaseCallbacksImpl::WebIDBDatabaseCallbacksImpl( |
41 IDBDatabaseCallbacks* callbacks) | 53 IDBDatabaseCallbacks* callbacks) |
42 : m_callbacks(callbacks) {} | 54 : m_callbacks(callbacks) { |
55 outstandingCallbacks()->push_back(wrapUnique(this)); | |
56 } | |
43 | 57 |
44 WebIDBDatabaseCallbacksImpl::~WebIDBDatabaseCallbacksImpl() {} | 58 WebIDBDatabaseCallbacksImpl::~WebIDBDatabaseCallbacksImpl() { |
haraken
2016/10/18 19:01:29
Maybe we want to share the code with WebIDBCallbac
Reilly Grant (use Gerrit)
2016/10/19 00:36:51
I've moved this logic into IndexedDBDispatcher whe
| |
59 if (m_callbacks) | |
60 m_callbacks->webCallbacksDestroyed(); | |
61 | |
62 CallbacksList& callbacks = *outstandingCallbacks(); | |
63 auto it = std::find_if( | |
64 callbacks.begin(), callbacks.end(), | |
65 [this](const std::unique_ptr<WebIDBDatabaseCallbacksImpl>& element) { | |
66 return element.get() == this; | |
67 }); | |
68 if (it != callbacks.end()) { | |
69 it->release(); | |
70 callbacks.erase(it); | |
71 } | |
72 } | |
45 | 73 |
46 void WebIDBDatabaseCallbacksImpl::onForcedClose() { | 74 void WebIDBDatabaseCallbacksImpl::onForcedClose() { |
47 m_callbacks->onForcedClose(); | 75 if (m_callbacks) |
76 m_callbacks->onForcedClose(); | |
48 } | 77 } |
49 | 78 |
50 void WebIDBDatabaseCallbacksImpl::onVersionChange(long long oldVersion, | 79 void WebIDBDatabaseCallbacksImpl::onVersionChange(long long oldVersion, |
51 long long newVersion) { | 80 long long newVersion) { |
52 m_callbacks->onVersionChange(oldVersion, newVersion); | 81 if (m_callbacks) |
82 m_callbacks->onVersionChange(oldVersion, newVersion); | |
53 } | 83 } |
54 | 84 |
55 void WebIDBDatabaseCallbacksImpl::onAbort(long long transactionId, | 85 void WebIDBDatabaseCallbacksImpl::onAbort(long long transactionId, |
56 const WebIDBDatabaseError& error) { | 86 const WebIDBDatabaseError& error) { |
57 m_callbacks->onAbort(transactionId, | 87 if (m_callbacks) { |
58 DOMException::create(error.code(), error.message())); | 88 m_callbacks->onAbort(transactionId, |
89 DOMException::create(error.code(), error.message())); | |
90 } | |
59 } | 91 } |
60 | 92 |
61 void WebIDBDatabaseCallbacksImpl::onComplete(long long transactionId) { | 93 void WebIDBDatabaseCallbacksImpl::onComplete(long long transactionId) { |
62 m_callbacks->onComplete(transactionId); | 94 if (m_callbacks) |
95 m_callbacks->onComplete(transactionId); | |
96 } | |
97 | |
98 void WebIDBDatabaseCallbacksImpl::detach() { | |
99 m_callbacks.clear(); | |
63 } | 100 } |
64 | 101 |
65 } // namespace blink | 102 } // namespace blink |
OLD | NEW |