Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Side by Side Diff: Source/modules/webdatabase/SQLCallbackWrapper.h

Issue 103473002: Manage WebSQL callbacks with OwnPtr instead of refcounting (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix RefPtr/OwnPtr transition gcc errors Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/modules/webdatabase/DatabaseSync.cpp ('k') | Source/modules/webdatabase/SQLStatement.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
(...skipping 24 matching lines...) Expand all
35 namespace WebCore { 35 namespace WebCore {
36 36
37 // A helper class to safely dereference the callback objects held by 37 // A helper class to safely dereference the callback objects held by
38 // SQLStatement and SQLTransaction on the proper thread. The 'wrapped' 38 // SQLStatement and SQLTransaction on the proper thread. The 'wrapped'
39 // callback is dereferenced: 39 // callback is dereferenced:
40 // - by destructing the enclosing wrapper - on any thread 40 // - by destructing the enclosing wrapper - on any thread
41 // - by calling clear() - on any thread 41 // - by calling clear() - on any thread
42 // - by unwrapping and then dereferencing normally - on context thread only 42 // - by unwrapping and then dereferencing normally - on context thread only
43 template<typename T> class SQLCallbackWrapper { 43 template<typename T> class SQLCallbackWrapper {
44 public: 44 public:
45 SQLCallbackWrapper(PassRefPtr<T> callback, ExecutionContext* executionContex t) 45 SQLCallbackWrapper(PassOwnPtr<T> callback, ExecutionContext* executionContex t)
46 : m_callback(callback) 46 : m_callback(callback)
47 , m_executionContext(m_callback ? executionContext : 0) 47 , m_executionContext(m_callback ? executionContext : 0)
48 { 48 {
49 ASSERT(!m_callback || (m_executionContext.get() && m_executionContext->i sContextThread())); 49 ASSERT(!m_callback || (m_executionContext.get() && m_executionContext->i sContextThread()));
50 } 50 }
51 51
52 ~SQLCallbackWrapper() 52 ~SQLCallbackWrapper()
53 { 53 {
54 clear(); 54 clear();
55 } 55 }
56 56
57 void clear() 57 void clear()
58 { 58 {
59 ExecutionContext* context; 59 ExecutionContext* context;
60 T* callback; 60 OwnPtr<T> callback;
61 { 61 {
62 MutexLocker locker(m_mutex); 62 MutexLocker locker(m_mutex);
63 if (!m_callback) { 63 if (!m_callback) {
64 ASSERT(!m_executionContext); 64 ASSERT(!m_executionContext);
65 return; 65 return;
66 } 66 }
67 if (m_executionContext->isContextThread()) { 67 if (m_executionContext->isContextThread()) {
68 m_callback = 0; 68 m_callback.clear();
69 m_executionContext = 0; 69 m_executionContext.clear();
70 return; 70 return;
71 } 71 }
72 context = m_executionContext.release().leakRef(); 72 context = m_executionContext.release().leakRef();
73 callback = m_callback.release().leakRef(); 73 callback = m_callback.release();
74 } 74 }
75 context->postTask(SafeReleaseTask::create(callback)); 75 context->postTask(SafeReleaseTask::create(callback.release()));
76 } 76 }
77 77
78 PassRefPtr<T> unwrap() 78 PassOwnPtr<T> unwrap()
79 { 79 {
80 MutexLocker locker(m_mutex); 80 MutexLocker locker(m_mutex);
81 ASSERT(!m_callback || m_executionContext->isContextThread()); 81 ASSERT(!m_callback || m_executionContext->isContextThread());
82 m_executionContext = 0; 82 m_executionContext.clear();
83 return m_callback.release(); 83 return m_callback.release();
84 } 84 }
85 85
86 // Useful for optimizations only, please test the return value of unwrap to be sure. 86 // Useful for optimizations only, please test the return value of unwrap to be sure.
87 bool hasCallback() const { return m_callback; } 87 bool hasCallback() const { return m_callback; }
88 88
89 private: 89 private:
90 class SafeReleaseTask : public ExecutionContextTask { 90 class SafeReleaseTask : public ExecutionContextTask {
91 public: 91 public:
92 static PassOwnPtr<SafeReleaseTask> create(T* callbackToRelease) 92 static PassOwnPtr<SafeReleaseTask> create(PassOwnPtr<T> callbackToReleas e)
93 { 93 {
94 return adoptPtr(new SafeReleaseTask(callbackToRelease)); 94 return adoptPtr(new SafeReleaseTask(callbackToRelease));
95 } 95 }
96 96
97 virtual void performTask(ExecutionContext* context) 97 virtual void performTask(ExecutionContext* context)
98 { 98 {
99 ASSERT(m_callbackToRelease && context && context->isContextThread()) ; 99 ASSERT(m_callbackToRelease && context && context->isContextThread()) ;
100 m_callbackToRelease->deref(); 100 m_callbackToRelease.clear();
101 context->deref(); 101 context->deref();
102 } 102 }
103 103
104 virtual bool isCleanupTask() const { return true; } 104 virtual bool isCleanupTask() const { return true; }
105 105
106 private: 106 private:
107 explicit SafeReleaseTask(T* callbackToRelease) 107 explicit SafeReleaseTask(PassOwnPtr<T> callbackToRelease)
108 : m_callbackToRelease(callbackToRelease) 108 : m_callbackToRelease(callbackToRelease)
109 { 109 {
110 } 110 }
111 111
112 T* m_callbackToRelease; 112 OwnPtr<T> m_callbackToRelease;
113 }; 113 };
114 114
115 Mutex m_mutex; 115 Mutex m_mutex;
116 RefPtr<T> m_callback; 116 OwnPtr<T> m_callback;
117 RefPtr<ExecutionContext> m_executionContext; 117 RefPtr<ExecutionContext> m_executionContext;
118 }; 118 };
119 119
120 } // namespace WebCore 120 } // namespace WebCore
121 121
122 #endif // SQLCallbackWrapper_h 122 #endif // SQLCallbackWrapper_h
OLDNEW
« no previous file with comments | « Source/modules/webdatabase/DatabaseSync.cpp ('k') | Source/modules/webdatabase/SQLStatement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698