OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009-2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2009-2010 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * 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 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 22 matching lines...) Expand all Loading... |
33 | 33 |
34 #include "core/dom/ExecutionContext.h" | 34 #include "core/dom/ExecutionContext.h" |
35 #include "core/dom/ExecutionContextTask.h" | 35 #include "core/dom/ExecutionContextTask.h" |
36 #include "platform/CrossThreadCopier.h" | 36 #include "platform/CrossThreadCopier.h" |
37 #include "wtf/PassOwnPtr.h" | 37 #include "wtf/PassOwnPtr.h" |
38 #include "wtf/PassRefPtr.h" | 38 #include "wtf/PassRefPtr.h" |
39 #include "wtf/TypeTraits.h" | 39 #include "wtf/TypeTraits.h" |
40 | 40 |
41 namespace blink { | 41 namespace blink { |
42 | 42 |
43 // Traits for the CrossThreadTask. | 43 // Traits for the CrossThreadTask. They are used to map a cross-thread-capable |
| 44 // copied type to a CrossThreadTask constructor parameter type. |
44 template<typename T> struct CrossThreadTaskTraits { | 45 template<typename T> struct CrossThreadTaskTraits { |
45 typedef const T& ParamType; | 46 typedef const T& ParamType; |
46 }; | 47 }; |
47 | 48 |
| 49 // We can copy pointer-like values. |
48 template<typename T> struct CrossThreadTaskTraits<T*> { | 50 template<typename T> struct CrossThreadTaskTraits<T*> { |
49 typedef T* ParamType; | 51 typedef T* ParamType; |
50 }; | 52 }; |
51 | |
52 template<typename T> struct CrossThreadTaskTraits<PassRefPtr<T> > { | 53 template<typename T> struct CrossThreadTaskTraits<PassRefPtr<T> > { |
53 typedef PassRefPtr<T> ParamType; | 54 typedef PassRefPtr<T> ParamType; |
54 }; | 55 }; |
55 | |
56 template<typename T> struct CrossThreadTaskTraits<PassOwnPtr<T> > { | 56 template<typename T> struct CrossThreadTaskTraits<PassOwnPtr<T> > { |
57 typedef PassOwnPtr<T> ParamType; | 57 typedef PassOwnPtr<T> ParamType; |
58 }; | 58 }; |
59 | |
60 // FIXME: Oilpan: Using a RawPtr is not safe, because the RawPtr does not keep | |
61 // the pointee alive while the ExecutionContextTask holds the RawPtr. | |
62 // | |
63 // - Ideally, we want to move the ExecutionContextTask to Oilpan's heap and use
a Member. | |
64 // However we cannot do that easily because the ExecutionContextTask outlives th
e thread | |
65 // that created the ExecutionContextTask. Oilpan does not support objects that | |
66 // outlives the thread that created the objects. | |
67 // | |
68 // - It's not either easy to keep the ExecutionContextTask off-heap | |
69 // and use a Persistent handle. This is because the Persistent handle can cause
a cycle. | |
70 // It's possible that the ExecutionContextTask holds a Persistent handle to the
object | |
71 // that owns the ExecutionContextTask. | |
72 // | |
73 // Given the above, we cannot avoid using a RawPtr at the moment. | |
74 // It's a responsibility of the caller sites to manage the lifetime of the point
ee. | |
75 template<typename T> struct CrossThreadTaskTraits<RawPtr<T> > { | 59 template<typename T> struct CrossThreadTaskTraits<RawPtr<T> > { |
76 typedef RawPtr<T> ParamType; | 60 typedef RawPtr<T> ParamType; |
77 }; | 61 }; |
78 | 62 |
79 template<typename P1, typename MP1> | 63 template<typename P1, typename MP1> |
80 class GC_PLUGIN_IGNORE("crbug.com/378192") CrossThreadTask1 : public ExecutionCo
ntextTask { | 64 class CrossThreadTask1 : public ExecutionContextTask { |
81 public: | 65 public: |
82 typedef void (*Method)(ExecutionContext*, MP1); | 66 typedef void (*Method)(ExecutionContext*, MP1); |
83 typedef CrossThreadTask1<P1, MP1> CrossThreadTask; | 67 typedef CrossThreadTask1<P1, MP1> CrossThreadTask; |
84 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; | 68 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; |
85 | 69 |
86 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1) | 70 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1) |
87 { | 71 { |
88 return adoptPtr(new CrossThreadTask(method, parameter1)); | 72 return adoptPtr(new CrossThreadTask(method, parameter1)); |
89 } | 73 } |
90 | 74 |
91 private: | 75 private: |
92 CrossThreadTask1(Method method, Param1 parameter1) | 76 CrossThreadTask1(Method method, Param1 parameter1) |
93 : m_method(method) | 77 : m_method(method) |
94 , m_parameter1(parameter1) | 78 , m_parameter1(WTF::ParamStorageTraits<P1>::wrap(parameter1)) |
95 { | 79 { |
96 } | 80 } |
97 | 81 |
98 virtual void performTask(ExecutionContext* context) | 82 virtual void performTask(ExecutionContext* context) |
99 { | 83 { |
100 (*m_method)(context, m_parameter1); | 84 (*m_method)(context, WTF::ParamStorageTraits<P1>::unwrap(m_parameter1)); |
101 } | 85 } |
102 | 86 |
103 private: | 87 private: |
104 Method m_method; | 88 Method m_method; |
105 P1 m_parameter1; | 89 typename WTF::ParamStorageTraits<P1>::StorageType m_parameter1; |
106 }; | 90 }; |
107 | 91 |
108 template<typename P1, typename MP1, typename P2, typename MP2> | 92 template<typename P1, typename MP1, typename P2, typename MP2> |
109 class GC_PLUGIN_IGNORE("crbug.com/378192") CrossThreadTask2 : public ExecutionCo
ntextTask { | 93 class CrossThreadTask2 : public ExecutionContextTask { |
110 public: | 94 public: |
111 typedef void (*Method)(ExecutionContext*, MP1, MP2); | 95 typedef void (*Method)(ExecutionContext*, MP1, MP2); |
112 typedef CrossThreadTask2<P1, MP1, P2, MP2> CrossThreadTask; | 96 typedef CrossThreadTask2<P1, MP1, P2, MP2> CrossThreadTask; |
113 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; | 97 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; |
114 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; | 98 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; |
115 | 99 |
116 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2) | 100 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2) |
117 { | 101 { |
118 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2)); | 102 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2)); |
119 } | 103 } |
120 | 104 |
121 private: | 105 private: |
122 CrossThreadTask2(Method method, Param1 parameter1, Param2 parameter2) | 106 CrossThreadTask2(Method method, Param1 parameter1, Param2 parameter2) |
123 : m_method(method) | 107 : m_method(method) |
124 , m_parameter1(parameter1) | 108 , m_parameter1(WTF::ParamStorageTraits<P1>::wrap(parameter1)) |
125 , m_parameter2(parameter2) | 109 , m_parameter2(WTF::ParamStorageTraits<P2>::wrap(parameter2)) |
126 { | 110 { |
127 } | 111 } |
128 | 112 |
129 virtual void performTask(ExecutionContext* context) | 113 virtual void performTask(ExecutionContext* context) |
130 { | 114 { |
131 (*m_method)(context, m_parameter1, m_parameter2); | 115 (*m_method)(context, |
| 116 WTF::ParamStorageTraits<P1>::unwrap(m_parameter1), |
| 117 WTF::ParamStorageTraits<P2>::unwrap(m_parameter2)); |
132 } | 118 } |
133 | 119 |
134 private: | 120 private: |
135 Method m_method; | 121 Method m_method; |
136 P1 m_parameter1; | 122 typename WTF::ParamStorageTraits<P1>::StorageType m_parameter1; |
137 P2 m_parameter2; | 123 typename WTF::ParamStorageTraits<P2>::StorageType m_parameter2; |
138 }; | 124 }; |
139 | 125 |
140 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3> | 126 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3> |
141 class GC_PLUGIN_IGNORE("crbug.com/378192") CrossThreadTask3 : public ExecutionCo
ntextTask { | 127 class CrossThreadTask3 : public ExecutionContextTask { |
142 public: | 128 public: |
143 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3); | 129 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3); |
144 typedef CrossThreadTask3<P1, MP1, P2, MP2, P3, MP3> CrossThreadTask; | 130 typedef CrossThreadTask3<P1, MP1, P2, MP2, P3, MP3> CrossThreadTask; |
145 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; | 131 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; |
146 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; | 132 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; |
147 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; | 133 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; |
148 | 134 |
149 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3) | 135 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3) |
150 { | 136 { |
151 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3)); | 137 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3)); |
152 } | 138 } |
153 | 139 |
154 private: | 140 private: |
155 CrossThreadTask3(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3) | 141 CrossThreadTask3(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3) |
156 : m_method(method) | 142 : m_method(method) |
157 , m_parameter1(parameter1) | 143 , m_parameter1(WTF::ParamStorageTraits<P1>::wrap(parameter1)) |
158 , m_parameter2(parameter2) | 144 , m_parameter2(WTF::ParamStorageTraits<P2>::wrap(parameter2)) |
159 , m_parameter3(parameter3) | 145 , m_parameter3(WTF::ParamStorageTraits<P3>::wrap(parameter3)) |
160 { | 146 { |
161 } | 147 } |
162 | 148 |
163 virtual void performTask(ExecutionContext* context) | 149 virtual void performTask(ExecutionContext* context) |
164 { | 150 { |
165 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3); | 151 (*m_method)(context, |
| 152 WTF::ParamStorageTraits<P1>::unwrap(m_parameter1), |
| 153 WTF::ParamStorageTraits<P2>::unwrap(m_parameter2), |
| 154 WTF::ParamStorageTraits<P3>::unwrap(m_parameter3)); |
166 } | 155 } |
167 | 156 |
168 private: | 157 private: |
169 Method m_method; | 158 Method m_method; |
170 P1 m_parameter1; | 159 typename WTF::ParamStorageTraits<P1>::StorageType m_parameter1; |
171 P2 m_parameter2; | 160 typename WTF::ParamStorageTraits<P2>::StorageType m_parameter2; |
172 P3 m_parameter3; | 161 typename WTF::ParamStorageTraits<P3>::StorageType m_parameter3; |
173 }; | 162 }; |
174 | 163 |
175 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4> | 164 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4> |
176 class GC_PLUGIN_IGNORE("crbug.com/378192") CrossThreadTask4 : public ExecutionCo
ntextTask { | 165 class CrossThreadTask4 : public ExecutionContextTask { |
177 public: | 166 public: |
178 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4); | 167 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4); |
179 typedef CrossThreadTask4<P1, MP1, P2, MP2, P3, MP3, P4, MP4> CrossThreadTask
; | 168 typedef CrossThreadTask4<P1, MP1, P2, MP2, P3, MP3, P4, MP4> CrossThreadTask
; |
180 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; | 169 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; |
181 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; | 170 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; |
182 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; | 171 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; |
183 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; | 172 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; |
184 | 173 |
185 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4) | 174 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4) |
186 { | 175 { |
187 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4)); | 176 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4)); |
188 } | 177 } |
189 | 178 |
190 private: | 179 private: |
191 CrossThreadTask4(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4) | 180 CrossThreadTask4(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4) |
192 : m_method(method) | 181 : m_method(method) |
193 , m_parameter1(parameter1) | 182 , m_parameter1(WTF::ParamStorageTraits<P1>::wrap(parameter1)) |
194 , m_parameter2(parameter2) | 183 , m_parameter2(WTF::ParamStorageTraits<P2>::wrap(parameter2)) |
195 , m_parameter3(parameter3) | 184 , m_parameter3(WTF::ParamStorageTraits<P3>::wrap(parameter3)) |
196 , m_parameter4(parameter4) | 185 , m_parameter4(WTF::ParamStorageTraits<P4>::wrap(parameter4)) |
197 { | 186 { |
198 } | 187 } |
199 | 188 |
200 virtual void performTask(ExecutionContext* context) | 189 virtual void performTask(ExecutionContext* context) |
201 { | 190 { |
202 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_paramet
er4); | 191 (*m_method)(context, |
| 192 WTF::ParamStorageTraits<P1>::unwrap(m_parameter1), |
| 193 WTF::ParamStorageTraits<P2>::unwrap(m_parameter2), |
| 194 WTF::ParamStorageTraits<P3>::unwrap(m_parameter3), |
| 195 WTF::ParamStorageTraits<P4>::unwrap(m_parameter4)); |
203 } | 196 } |
204 | 197 |
205 private: | 198 private: |
206 Method m_method; | 199 Method m_method; |
207 P1 m_parameter1; | 200 typename WTF::ParamStorageTraits<P1>::StorageType m_parameter1; |
208 P2 m_parameter2; | 201 typename WTF::ParamStorageTraits<P2>::StorageType m_parameter2; |
209 P3 m_parameter3; | 202 typename WTF::ParamStorageTraits<P3>::StorageType m_parameter3; |
210 P4 m_parameter4; | 203 typename WTF::ParamStorageTraits<P4>::StorageType m_parameter4; |
211 }; | 204 }; |
212 | 205 |
213 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4, typename P5, typename MP5> | 206 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4, typename P5, typename MP5> |
214 class GC_PLUGIN_IGNORE("crbug.com/378192") CrossThreadTask5 : public ExecutionCo
ntextTask { | 207 class CrossThreadTask5 : public ExecutionContextTask { |
215 public: | 208 public: |
216 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4, MP5); | 209 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4, MP5); |
217 typedef CrossThreadTask5<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5> CrossT
hreadTask; | 210 typedef CrossThreadTask5<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5> CrossT
hreadTask; |
218 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; | 211 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; |
219 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; | 212 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; |
220 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; | 213 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; |
221 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; | 214 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; |
222 typedef typename CrossThreadTaskTraits<P5>::ParamType Param5; | 215 typedef typename CrossThreadTaskTraits<P5>::ParamType Param5; |
223 | 216 |
224 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5) | 217 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5) |
225 { | 218 { |
226 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4, parameter5)); | 219 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4, parameter5)); |
227 } | 220 } |
228 | 221 |
229 private: | 222 private: |
230 CrossThreadTask5(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4, Param5 parameter5) | 223 CrossThreadTask5(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4, Param5 parameter5) |
231 : m_method(method) | 224 : m_method(method) |
232 , m_parameter1(parameter1) | 225 , m_parameter1(WTF::ParamStorageTraits<P1>::wrap(parameter1)) |
233 , m_parameter2(parameter2) | 226 , m_parameter2(WTF::ParamStorageTraits<P2>::wrap(parameter2)) |
234 , m_parameter3(parameter3) | 227 , m_parameter3(WTF::ParamStorageTraits<P3>::wrap(parameter3)) |
235 , m_parameter4(parameter4) | 228 , m_parameter4(WTF::ParamStorageTraits<P4>::wrap(parameter4)) |
236 , m_parameter5(parameter5) | 229 , m_parameter5(WTF::ParamStorageTraits<P5>::wrap(parameter5)) |
237 { | 230 { |
238 } | 231 } |
239 | 232 |
240 virtual void performTask(ExecutionContext* context) | 233 virtual void performTask(ExecutionContext* context) |
241 { | 234 { |
242 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_paramet
er4, m_parameter5); | 235 (*m_method)(context, |
| 236 WTF::ParamStorageTraits<P1>::unwrap(m_parameter1), |
| 237 WTF::ParamStorageTraits<P2>::unwrap(m_parameter2), |
| 238 WTF::ParamStorageTraits<P3>::unwrap(m_parameter3), |
| 239 WTF::ParamStorageTraits<P4>::unwrap(m_parameter4), |
| 240 WTF::ParamStorageTraits<P5>::unwrap(m_parameter5)); |
243 } | 241 } |
244 | 242 |
245 private: | 243 private: |
246 Method m_method; | 244 Method m_method; |
247 P1 m_parameter1; | 245 typename WTF::ParamStorageTraits<P1>::StorageType m_parameter1; |
248 P2 m_parameter2; | 246 typename WTF::ParamStorageTraits<P2>::StorageType m_parameter2; |
249 P3 m_parameter3; | 247 typename WTF::ParamStorageTraits<P3>::StorageType m_parameter3; |
250 P4 m_parameter4; | 248 typename WTF::ParamStorageTraits<P4>::StorageType m_parameter4; |
251 P5 m_parameter5; | 249 typename WTF::ParamStorageTraits<P5>::StorageType m_parameter5; |
252 }; | 250 }; |
253 | 251 |
254 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typ
ename MP6> | 252 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typ
ename MP6> |
255 class GC_PLUGIN_IGNORE("crbug.com/378192") CrossThreadTask6 : public ExecutionCo
ntextTask { | 253 class CrossThreadTask6 : public ExecutionContextTask { |
256 public: | 254 public: |
257 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6); | 255 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6); |
258 typedef CrossThreadTask6<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP
6> CrossThreadTask; | 256 typedef CrossThreadTask6<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP
6> CrossThreadTask; |
259 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; | 257 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; |
260 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; | 258 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; |
261 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; | 259 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; |
262 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; | 260 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; |
263 typedef typename CrossThreadTaskTraits<P5>::ParamType Param5; | 261 typedef typename CrossThreadTaskTraits<P5>::ParamType Param5; |
264 typedef typename CrossThreadTaskTraits<P6>::ParamType Param6; | 262 typedef typename CrossThreadTaskTraits<P6>::ParamType Param6; |
265 | 263 |
266 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Para
m6 parameter6) | 264 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Para
m6 parameter6) |
267 { | 265 { |
268 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4, parameter5, parameter6)); | 266 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4, parameter5, parameter6)); |
269 } | 267 } |
270 | 268 |
271 private: | 269 private: |
272 CrossThreadTask6(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6) | 270 CrossThreadTask6(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6) |
273 : m_method(method) | 271 : m_method(method) |
274 , m_parameter1(parameter1) | 272 , m_parameter1(WTF::ParamStorageTraits<P1>::wrap(parameter1)) |
275 , m_parameter2(parameter2) | 273 , m_parameter2(WTF::ParamStorageTraits<P2>::wrap(parameter2)) |
276 , m_parameter3(parameter3) | 274 , m_parameter3(WTF::ParamStorageTraits<P3>::wrap(parameter3)) |
277 , m_parameter4(parameter4) | 275 , m_parameter4(WTF::ParamStorageTraits<P4>::wrap(parameter4)) |
278 , m_parameter5(parameter5) | 276 , m_parameter5(WTF::ParamStorageTraits<P5>::wrap(parameter5)) |
279 , m_parameter6(parameter6) | 277 , m_parameter6(WTF::ParamStorageTraits<P6>::wrap(parameter6)) |
280 { | 278 { |
281 } | 279 } |
282 | 280 |
283 virtual void performTask(ExecutionContext* context) | 281 virtual void performTask(ExecutionContext* context) |
284 { | 282 { |
285 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_paramet
er4, m_parameter5, m_parameter6); | 283 (*m_method)(context, |
| 284 WTF::ParamStorageTraits<P1>::unwrap(m_parameter1), |
| 285 WTF::ParamStorageTraits<P2>::unwrap(m_parameter2), |
| 286 WTF::ParamStorageTraits<P3>::unwrap(m_parameter3), |
| 287 WTF::ParamStorageTraits<P4>::unwrap(m_parameter4), |
| 288 WTF::ParamStorageTraits<P5>::unwrap(m_parameter5), |
| 289 WTF::ParamStorageTraits<P6>::unwrap(m_parameter6)); |
286 } | 290 } |
287 | 291 |
288 private: | 292 private: |
289 Method m_method; | 293 Method m_method; |
290 P1 m_parameter1; | 294 typename WTF::ParamStorageTraits<P1>::StorageType m_parameter1; |
291 P2 m_parameter2; | 295 typename WTF::ParamStorageTraits<P2>::StorageType m_parameter2; |
292 P3 m_parameter3; | 296 typename WTF::ParamStorageTraits<P3>::StorageType m_parameter3; |
293 P4 m_parameter4; | 297 typename WTF::ParamStorageTraits<P4>::StorageType m_parameter4; |
294 P5 m_parameter5; | 298 typename WTF::ParamStorageTraits<P5>::StorageType m_parameter5; |
295 P6 m_parameter6; | 299 typename WTF::ParamStorageTraits<P6>::StorageType m_parameter6; |
296 }; | 300 }; |
297 | 301 |
298 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typ
ename MP6, typename P7, typename MP7> | 302 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typ
ename MP6, typename P7, typename MP7> |
299 class GC_PLUGIN_IGNORE("crbug.com/378192") CrossThreadTask7 : public ExecutionCo
ntextTask { | 303 class CrossThreadTask7 : public ExecutionContextTask { |
300 public: | 304 public: |
301 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7)
; | 305 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7)
; |
302 typedef CrossThreadTask7<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP
6, P7, MP7> CrossThreadTask; | 306 typedef CrossThreadTask7<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP
6, P7, MP7> CrossThreadTask; |
303 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; | 307 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; |
304 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; | 308 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; |
305 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; | 309 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; |
306 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; | 310 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; |
307 typedef typename CrossThreadTaskTraits<P5>::ParamType Param5; | 311 typedef typename CrossThreadTaskTraits<P5>::ParamType Param5; |
308 typedef typename CrossThreadTaskTraits<P6>::ParamType Param6; | 312 typedef typename CrossThreadTaskTraits<P6>::ParamType Param6; |
309 typedef typename CrossThreadTaskTraits<P7>::ParamType Param7; | 313 typedef typename CrossThreadTaskTraits<P7>::ParamType Param7; |
310 | 314 |
311 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Para
m6 parameter6, Param7 parameter7) | 315 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Para
m6 parameter6, Param7 parameter7) |
312 { | 316 { |
313 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4, parameter5, parameter6, parameter7)); | 317 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4, parameter5, parameter6, parameter7)); |
314 } | 318 } |
315 | 319 |
316 private: | 320 private: |
317 CrossThreadTask7(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 par
ameter7) | 321 CrossThreadTask7(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 par
ameter7) |
318 : m_method(method) | 322 : m_method(method) |
319 , m_parameter1(parameter1) | 323 , m_parameter1(WTF::ParamStorageTraits<P1>::wrap(parameter1)) |
320 , m_parameter2(parameter2) | 324 , m_parameter2(WTF::ParamStorageTraits<P2>::wrap(parameter2)) |
321 , m_parameter3(parameter3) | 325 , m_parameter3(WTF::ParamStorageTraits<P3>::wrap(parameter3)) |
322 , m_parameter4(parameter4) | 326 , m_parameter4(WTF::ParamStorageTraits<P4>::wrap(parameter4)) |
323 , m_parameter5(parameter5) | 327 , m_parameter5(WTF::ParamStorageTraits<P5>::wrap(parameter5)) |
324 , m_parameter6(parameter6) | 328 , m_parameter6(WTF::ParamStorageTraits<P6>::wrap(parameter6)) |
325 , m_parameter7(parameter7) | 329 , m_parameter7(WTF::ParamStorageTraits<P7>::wrap(parameter7)) |
326 { | 330 { |
327 } | 331 } |
328 | 332 |
329 virtual void performTask(ExecutionContext* context) | 333 virtual void performTask(ExecutionContext* context) |
330 { | 334 { |
331 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_paramet
er4, m_parameter5, m_parameter6, m_parameter7); | 335 (*m_method)(context, |
| 336 WTF::ParamStorageTraits<P1>::unwrap(m_parameter1), |
| 337 WTF::ParamStorageTraits<P2>::unwrap(m_parameter2), |
| 338 WTF::ParamStorageTraits<P3>::unwrap(m_parameter3), |
| 339 WTF::ParamStorageTraits<P4>::unwrap(m_parameter4), |
| 340 WTF::ParamStorageTraits<P5>::unwrap(m_parameter5), |
| 341 WTF::ParamStorageTraits<P6>::unwrap(m_parameter6), |
| 342 WTF::ParamStorageTraits<P7>::unwrap(m_parameter7)); |
332 } | 343 } |
333 | 344 |
334 private: | 345 private: |
335 Method m_method; | 346 Method m_method; |
336 P1 m_parameter1; | 347 typename WTF::ParamStorageTraits<P1>::StorageType m_parameter1; |
337 P2 m_parameter2; | 348 typename WTF::ParamStorageTraits<P2>::StorageType m_parameter2; |
338 P3 m_parameter3; | 349 typename WTF::ParamStorageTraits<P3>::StorageType m_parameter3; |
339 P4 m_parameter4; | 350 typename WTF::ParamStorageTraits<P4>::StorageType m_parameter4; |
340 P5 m_parameter5; | 351 typename WTF::ParamStorageTraits<P5>::StorageType m_parameter5; |
341 P6 m_parameter6; | 352 typename WTF::ParamStorageTraits<P6>::StorageType m_parameter6; |
342 P7 m_parameter7; | 353 typename WTF::ParamStorageTraits<P7>::StorageType m_parameter7; |
343 }; | 354 }; |
344 | 355 |
345 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typ
ename MP6, typename P7, typename MP7, typename P8, typename MP8> | 356 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, type
name MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typ
ename MP6, typename P7, typename MP7, typename P8, typename MP8> |
346 class GC_PLUGIN_IGNORE("crbug.com/378192") CrossThreadTask8 : public ExecutionCo
ntextTask { | 357 class CrossThreadTask8 : public ExecutionContextTask { |
347 public: | 358 public: |
348 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7,
MP8); | 359 typedef void (*Method)(ExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7,
MP8); |
349 typedef CrossThreadTask8<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP
6, P7, MP7, P8, MP8> CrossThreadTask; | 360 typedef CrossThreadTask8<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP
6, P7, MP7, P8, MP8> CrossThreadTask; |
350 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; | 361 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; |
351 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; | 362 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; |
352 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; | 363 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; |
353 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; | 364 typedef typename CrossThreadTaskTraits<P4>::ParamType Param4; |
354 typedef typename CrossThreadTaskTraits<P5>::ParamType Param5; | 365 typedef typename CrossThreadTaskTraits<P5>::ParamType Param5; |
355 typedef typename CrossThreadTaskTraits<P6>::ParamType Param6; | 366 typedef typename CrossThreadTaskTraits<P6>::ParamType Param6; |
356 typedef typename CrossThreadTaskTraits<P7>::ParamType Param7; | 367 typedef typename CrossThreadTaskTraits<P7>::ParamType Param7; |
357 typedef typename CrossThreadTaskTraits<P8>::ParamType Param8; | 368 typedef typename CrossThreadTaskTraits<P8>::ParamType Param8; |
358 | 369 |
359 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Para
m6 parameter6, Param7 parameter7, Param8 parameter8) | 370 static PassOwnPtr<CrossThreadTask> create(Method method, Param1 parameter1,
Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Para
m6 parameter6, Param7 parameter7, Param8 parameter8) |
360 { | 371 { |
361 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4, parameter5, parameter6, parameter7, parameter8)); | 372 return adoptPtr(new CrossThreadTask(method, parameter1, parameter2, para
meter3, parameter4, parameter5, parameter6, parameter7, parameter8)); |
362 } | 373 } |
363 | 374 |
364 private: | 375 private: |
365 CrossThreadTask8(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 par
ameter7, Param8 parameter8) | 376 CrossThreadTask8(Method method, Param1 parameter1, Param2 parameter2, Param3
parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 par
ameter7, Param8 parameter8) |
366 : m_method(method) | 377 : m_method(method) |
367 , m_parameter1(parameter1) | 378 , m_parameter1(WTF::ParamStorageTraits<P1>::wrap(parameter1)) |
368 , m_parameter2(parameter2) | 379 , m_parameter2(WTF::ParamStorageTraits<P2>::wrap(parameter2)) |
369 , m_parameter3(parameter3) | 380 , m_parameter3(WTF::ParamStorageTraits<P3>::wrap(parameter3)) |
370 , m_parameter4(parameter4) | 381 , m_parameter4(WTF::ParamStorageTraits<P4>::wrap(parameter4)) |
371 , m_parameter5(parameter5) | 382 , m_parameter5(WTF::ParamStorageTraits<P5>::wrap(parameter5)) |
372 , m_parameter6(parameter6) | 383 , m_parameter6(WTF::ParamStorageTraits<P6>::wrap(parameter6)) |
373 , m_parameter7(parameter7) | 384 , m_parameter7(WTF::ParamStorageTraits<P7>::wrap(parameter7)) |
374 , m_parameter8(parameter8) | 385 , m_parameter8(WTF::ParamStorageTraits<P8>::wrap(parameter8)) |
375 { | 386 { |
376 } | 387 } |
377 | 388 |
378 virtual void performTask(ExecutionContext* context) | 389 virtual void performTask(ExecutionContext* context) |
379 { | 390 { |
380 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_paramet
er4, m_parameter5, m_parameter6, m_parameter7, m_parameter8); | 391 (*m_method)(context, |
| 392 WTF::ParamStorageTraits<P1>::unwrap(m_parameter1), |
| 393 WTF::ParamStorageTraits<P2>::unwrap(m_parameter2), |
| 394 WTF::ParamStorageTraits<P3>::unwrap(m_parameter3), |
| 395 WTF::ParamStorageTraits<P4>::unwrap(m_parameter4), |
| 396 WTF::ParamStorageTraits<P5>::unwrap(m_parameter5), |
| 397 WTF::ParamStorageTraits<P6>::unwrap(m_parameter6), |
| 398 WTF::ParamStorageTraits<P7>::unwrap(m_parameter7), |
| 399 WTF::ParamStorageTraits<P8>::unwrap(m_parameter8)); |
381 } | 400 } |
382 | 401 |
383 private: | 402 private: |
384 Method m_method; | 403 Method m_method; |
385 P1 m_parameter1; | 404 typename WTF::ParamStorageTraits<P1>::StorageType m_parameter1; |
386 P2 m_parameter2; | 405 typename WTF::ParamStorageTraits<P2>::StorageType m_parameter2; |
387 P3 m_parameter3; | 406 typename WTF::ParamStorageTraits<P3>::StorageType m_parameter3; |
388 P4 m_parameter4; | 407 typename WTF::ParamStorageTraits<P4>::StorageType m_parameter4; |
389 P5 m_parameter5; | 408 typename WTF::ParamStorageTraits<P5>::StorageType m_parameter5; |
390 P6 m_parameter6; | 409 typename WTF::ParamStorageTraits<P6>::StorageType m_parameter6; |
391 P7 m_parameter7; | 410 typename WTF::ParamStorageTraits<P7>::StorageType m_parameter7; |
392 P8 m_parameter8; | 411 typename WTF::ParamStorageTraits<P8>::StorageType m_parameter8; |
393 }; | 412 }; |
394 | 413 |
395 template<typename P1, typename MP1> | 414 template<typename P1, typename MP1> |
396 PassOwnPtr<ExecutionContextTask> createCrossThreadTask( | 415 PassOwnPtr<ExecutionContextTask> createCrossThreadTask( |
397 void (*method)(ExecutionContext*, MP1), | 416 void (*method)(ExecutionContext*, MP1), |
398 const P1& parameter1) | 417 const P1& parameter1) |
399 { | 418 { |
400 return CrossThreadTask1<typename CrossThreadCopier<P1>::Type, MP1>::create( | 419 return CrossThreadTask1<typename CrossThreadCopier<P1>::Type, MP1>::create( |
401 method, | 420 method, |
402 CrossThreadCopier<P1>::copy(parameter1)); | 421 CrossThreadCopier<P1>::copy(parameter1)); |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 CrossThreadCopier<P2>::copy(parameter2), | 745 CrossThreadCopier<P2>::copy(parameter2), |
727 CrossThreadCopier<P3>::copy(parameter3), | 746 CrossThreadCopier<P3>::copy(parameter3), |
728 CrossThreadCopier<P4>::copy(parameter4), | 747 CrossThreadCopier<P4>::copy(parameter4), |
729 CrossThreadCopier<P5>::copy(parameter5), | 748 CrossThreadCopier<P5>::copy(parameter5), |
730 CrossThreadCopier<P6>::copy(parameter6))); | 749 CrossThreadCopier<P6>::copy(parameter6))); |
731 } | 750 } |
732 | 751 |
733 } // namespace blink | 752 } // namespace blink |
734 | 753 |
735 #endif // CrossThreadTask_h | 754 #endif // CrossThreadTask_h |
OLD | NEW |