1 /* 2 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef GenericWorkerTask_h 32 #define GenericWorkerTask_h 33 34 #if ENABLE(WORKERS) 35 36 #include "CrossThreadCopier.h" 37 #include "ScriptExecutionContext.h" 38 #include <memory> 39 #include <wtf/PassOwnPtr.h> 40 #include <wtf/PassRefPtr.h> 41 #include <wtf/TypeTraits.h> 42 43 namespace WebCore { 44 45 // Traits for the GenericWorkerTask. 46 template<typename T> struct GenericWorkerTaskTraits { 47 typedef const T& ParamType; 48 }; 49 50 template<typename T> struct GenericWorkerTaskTraits<T*> { 51 typedef T* ParamType; 52 }; 53 54 template<typename T> struct GenericWorkerTaskTraits<std::auto_ptr<T> > { 55 typedef std::auto_ptr<T> ParamType; 56 }; 57 58 template<typename T> struct GenericWorkerTaskTraits<PassRefPtr<T> > { 59 typedef PassRefPtr<T> ParamType; 60 }; 61 62 template<typename T> struct GenericWorkerTaskTraits<PassOwnPtr<T> > { 63 typedef PassOwnPtr<T> ParamType; 64 }; 65 66 template<typename P1, typename MP1> 67 class GenericWorkerTask1 : public ScriptExecutionContext::Task { 68 public: 69 typedef void (*Method)(ScriptExecutionContext*, MP1); 70 typedef GenericWorkerTask1<P1, MP1> GenericWorkerTask; 71 typedef typename GenericWorkerTaskTraits<P1>::ParamType Param1; 72 73 static PassOwnPtr<GenericWorkerTask> create(Method method, Param1 parameter1) 74 { 75 return new GenericWorkerTask(method, parameter1); 76 } 77 78 private: 79 GenericWorkerTask1(Method method, Param1 parameter1) 80 : m_method(method) 81 , m_parameter1(parameter1) 82 { 83 } 84 85 virtual void performTask(ScriptExecutionContext* context) 86 { 87 (*m_method)(context, m_parameter1); 88 } 89 90 private: 91 Method m_method; 92 P1 m_parameter1; 93 }; 94 95 template<typename P1, typename MP1, typename P2, typename MP2> 96 class GenericWorkerTask2 : public ScriptExecutionContext::Task { 97 public: 98 typedef void (*Method)(ScriptExecutionContext*, MP1, MP2); 99 typedef GenericWorkerTask2<P1, MP1, P2, MP2> GenericWorkerTask; 100 typedef typename GenericWorkerTaskTraits<P1>::ParamType Param1; 101 typedef typename GenericWorkerTaskTraits<P2>::ParamType Param2; 102 103 static PassOwnPtr<GenericWorkerTask> create(Method method, Param1 parameter1, Param2 parameter2) 104 { 105 return new GenericWorkerTask(method, parameter1, parameter2); 106 } 107 108 private: 109 GenericWorkerTask2(Method method, Param1 parameter1, Param2 parameter2) 110 : m_method(method) 111 , m_parameter1(parameter1) 112 , m_parameter2(parameter2) 113 { 114 } 115 116 virtual void performTask(ScriptExecutionContext* context) 117 { 118 (*m_method)(context, m_parameter1, m_parameter2); 119 } 120 121 private: 122 Method m_method; 123 P1 m_parameter1; 124 P2 m_parameter2; 125 }; 126 127 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3> 128 class GenericWorkerTask3 : public ScriptExecutionContext::Task { 129 public: 130 typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3); 131 typedef GenericWorkerTask3<P1, MP1, P2, MP2, P3, MP3> GenericWorkerTask; 132 typedef typename GenericWorkerTaskTraits<P1>::ParamType Param1; 133 typedef typename GenericWorkerTaskTraits<P2>::ParamType Param2; 134 typedef typename GenericWorkerTaskTraits<P3>::ParamType Param3; 135 136 static PassOwnPtr<GenericWorkerTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3) 137 { 138 return new GenericWorkerTask(method, parameter1, parameter2, parameter3); 139 } 140 141 private: 142 GenericWorkerTask3(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3) 143 : m_method(method) 144 , m_parameter1(parameter1) 145 , m_parameter2(parameter2) 146 , m_parameter3(parameter3) 147 { 148 } 149 150 virtual void performTask(ScriptExecutionContext* context) 151 { 152 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3); 153 } 154 155 private: 156 Method m_method; 157 P1 m_parameter1; 158 P2 m_parameter2; 159 P3 m_parameter3; 160 }; 161 162 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4> 163 class GenericWorkerTask4 : public ScriptExecutionContext::Task { 164 public: 165 typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4); 166 typedef GenericWorkerTask4<P1, MP1, P2, MP2, P3, MP3, P4, MP4> GenericWorkerTask; 167 typedef typename GenericWorkerTaskTraits<P1>::ParamType Param1; 168 typedef typename GenericWorkerTaskTraits<P2>::ParamType Param2; 169 typedef typename GenericWorkerTaskTraits<P3>::ParamType Param3; 170 typedef typename GenericWorkerTaskTraits<P4>::ParamType Param4; 171 172 static PassOwnPtr<GenericWorkerTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4) 173 { 174 return new GenericWorkerTask(method, parameter1, parameter2, parameter3, parameter4); 175 } 176 177 private: 178 GenericWorkerTask4(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4) 179 : m_method(method) 180 , m_parameter1(parameter1) 181 , m_parameter2(parameter2) 182 , m_parameter3(parameter3) 183 , m_parameter4(parameter4) 184 { 185 } 186 187 virtual void performTask(ScriptExecutionContext* context) 188 { 189 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4); 190 } 191 192 private: 193 Method m_method; 194 P1 m_parameter1; 195 P2 m_parameter2; 196 P3 m_parameter3; 197 P4 m_parameter4; 198 }; 199 200 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5> 201 class GenericWorkerTask5 : public ScriptExecutionContext::Task { 202 public: 203 typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5); 204 typedef GenericWorkerTask5<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5> GenericWorkerTask; 205 typedef typename GenericWorkerTaskTraits<P1>::ParamType Param1; 206 typedef typename GenericWorkerTaskTraits<P2>::ParamType Param2; 207 typedef typename GenericWorkerTaskTraits<P3>::ParamType Param3; 208 typedef typename GenericWorkerTaskTraits<P4>::ParamType Param4; 209 typedef typename GenericWorkerTaskTraits<P5>::ParamType Param5; 210 211 static PassOwnPtr<GenericWorkerTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5) 212 { 213 return new GenericWorkerTask(method, parameter1, parameter2, parameter3, parameter4, parameter5); 214 } 215 216 private: 217 GenericWorkerTask5(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5) 218 : m_method(method) 219 , m_parameter1(parameter1) 220 , m_parameter2(parameter2) 221 , m_parameter3(parameter3) 222 , m_parameter4(parameter4) 223 , m_parameter5(parameter5) 224 { 225 } 226 227 virtual void performTask(ScriptExecutionContext* context) 228 { 229 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5); 230 } 231 232 private: 233 Method m_method; 234 P1 m_parameter1; 235 P2 m_parameter2; 236 P3 m_parameter3; 237 P4 m_parameter4; 238 P5 m_parameter5; 239 }; 240 241 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6> 242 class GenericWorkerTask6 : public ScriptExecutionContext::Task { 243 public: 244 typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6); 245 typedef GenericWorkerTask6<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP6> GenericWorkerTask; 246 typedef typename GenericWorkerTaskTraits<P1>::ParamType Param1; 247 typedef typename GenericWorkerTaskTraits<P2>::ParamType Param2; 248 typedef typename GenericWorkerTaskTraits<P3>::ParamType Param3; 249 typedef typename GenericWorkerTaskTraits<P4>::ParamType Param4; 250 typedef typename GenericWorkerTaskTraits<P5>::ParamType Param5; 251 typedef typename GenericWorkerTaskTraits<P6>::ParamType Param6; 252 253 static PassOwnPtr<GenericWorkerTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6) 254 { 255 return new GenericWorkerTask(method, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6); 256 } 257 258 private: 259 GenericWorkerTask6(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6) 260 : m_method(method) 261 , m_parameter1(parameter1) 262 , m_parameter2(parameter2) 263 , m_parameter3(parameter3) 264 , m_parameter4(parameter4) 265 , m_parameter5(parameter5) 266 , m_parameter6(parameter6) 267 { 268 } 269 270 virtual void performTask(ScriptExecutionContext* context) 271 { 272 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5, m_parameter6); 273 } 274 275 private: 276 Method m_method; 277 P1 m_parameter1; 278 P2 m_parameter2; 279 P3 m_parameter3; 280 P4 m_parameter4; 281 P5 m_parameter5; 282 P6 m_parameter6; 283 }; 284 285 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7> 286 class GenericWorkerTask7 : public ScriptExecutionContext::Task { 287 public: 288 typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7); 289 typedef GenericWorkerTask7<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP6, P7, MP7> GenericWorkerTask; 290 typedef typename GenericWorkerTaskTraits<P1>::ParamType Param1; 291 typedef typename GenericWorkerTaskTraits<P2>::ParamType Param2; 292 typedef typename GenericWorkerTaskTraits<P3>::ParamType Param3; 293 typedef typename GenericWorkerTaskTraits<P4>::ParamType Param4; 294 typedef typename GenericWorkerTaskTraits<P5>::ParamType Param5; 295 typedef typename GenericWorkerTaskTraits<P6>::ParamType Param6; 296 typedef typename GenericWorkerTaskTraits<P7>::ParamType Param7; 297 298 static PassOwnPtr<GenericWorkerTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7) 299 { 300 return new GenericWorkerTask(method, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7); 301 } 302 303 private: 304 GenericWorkerTask7(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7) 305 : m_method(method) 306 , m_parameter1(parameter1) 307 , m_parameter2(parameter2) 308 , m_parameter3(parameter3) 309 , m_parameter4(parameter4) 310 , m_parameter5(parameter5) 311 , m_parameter6(parameter6) 312 , m_parameter7(parameter7) 313 { 314 } 315 316 virtual void performTask(ScriptExecutionContext* context) 317 { 318 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5, m_parameter6, m_parameter7); 319 } 320 321 private: 322 Method m_method; 323 P1 m_parameter1; 324 P2 m_parameter2; 325 P3 m_parameter3; 326 P4 m_parameter4; 327 P5 m_parameter5; 328 P6 m_parameter6; 329 P7 m_parameter7; 330 }; 331 332 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7, typename P8, typename MP8> 333 class GenericWorkerTask8 : public ScriptExecutionContext::Task { 334 public: 335 typedef void (*Method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8); 336 typedef GenericWorkerTask8<P1, MP1, P2, MP2, P3, MP3, P4, MP4, P5, MP5, P6, MP6, P7, MP7, P8, MP8> GenericWorkerTask; 337 typedef typename GenericWorkerTaskTraits<P1>::ParamType Param1; 338 typedef typename GenericWorkerTaskTraits<P2>::ParamType Param2; 339 typedef typename GenericWorkerTaskTraits<P3>::ParamType Param3; 340 typedef typename GenericWorkerTaskTraits<P4>::ParamType Param4; 341 typedef typename GenericWorkerTaskTraits<P5>::ParamType Param5; 342 typedef typename GenericWorkerTaskTraits<P6>::ParamType Param6; 343 typedef typename GenericWorkerTaskTraits<P7>::ParamType Param7; 344 typedef typename GenericWorkerTaskTraits<P8>::ParamType Param8; 345 346 static PassOwnPtr<GenericWorkerTask> create(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7, Param8 parameter8) 347 { 348 return new GenericWorkerTask(method, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8); 349 } 350 351 private: 352 GenericWorkerTask8(Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3, Param4 parameter4, Param5 parameter5, Param6 parameter6, Param7 parameter7, Param8 parameter8) 353 : m_method(method) 354 , m_parameter1(parameter1) 355 , m_parameter2(parameter2) 356 , m_parameter3(parameter3) 357 , m_parameter4(parameter4) 358 , m_parameter5(parameter5) 359 , m_parameter6(parameter6) 360 , m_parameter7(parameter7) 361 , m_parameter8(parameter8) 362 { 363 } 364 365 virtual void performTask(ScriptExecutionContext* context) 366 { 367 (*m_method)(context, m_parameter1, m_parameter2, m_parameter3, m_parameter4, m_parameter5, m_parameter6, m_parameter7, m_parameter8); 368 } 369 370 private: 371 Method m_method; 372 P1 m_parameter1; 373 P2 m_parameter2; 374 P3 m_parameter3; 375 P4 m_parameter4; 376 P5 m_parameter5; 377 P6 m_parameter6; 378 P7 m_parameter7; 379 P8 m_parameter8; 380 }; 381 382 template<typename P1, typename MP1> 383 PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask( 384 void (*method)(ScriptExecutionContext*, MP1), 385 const P1& parameter1) 386 { 387 return GenericWorkerTask1<typename CrossThreadCopier<P1>::Type, MP1>::create( 388 method, 389 CrossThreadCopier<P1>::copy(parameter1)); 390 } 391 392 template<typename P1, typename MP1, typename P2, typename MP2> 393 PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask( 394 void (*method)(ScriptExecutionContext*, MP1, MP2), 395 const P1& parameter1, const P2& parameter2) 396 { 397 return GenericWorkerTask2<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2>::create( 398 method, 399 CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2)); 400 } 401 402 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3> 403 PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask( 404 void (*method)(ScriptExecutionContext*, MP1, MP2, MP3), 405 const P1& parameter1, const P2& parameter2, const P3& parameter3) 406 { 407 return GenericWorkerTask3<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3>::create( 408 method, 409 CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2), 410 CrossThreadCopier<P3>::copy(parameter3)); 411 } 412 413 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4> 414 PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask( 415 void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4), 416 const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4) 417 { 418 return GenericWorkerTask4<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3, 419 typename CrossThreadCopier<P4>::Type, MP4>::create( 420 method, 421 CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2), 422 CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4)); 423 } 424 425 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5> 426 PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask( 427 void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5), 428 const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4, const P5& parameter5) 429 { 430 return GenericWorkerTask5<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3, 431 typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::Type, MP5>::create( 432 method, 433 CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2), 434 CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4), 435 CrossThreadCopier<P5>::copy(parameter5)); 436 } 437 438 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6> 439 PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask( 440 void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6), 441 const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4, const P5& parameter5, const P6& parameter6) 442 { 443 return GenericWorkerTask6<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3, 444 typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::Type, MP5, typename CrossThreadCopier<P6>::Type, MP6>::create( 445 method, 446 CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2), 447 CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4), 448 CrossThreadCopier<P5>::copy(parameter5), CrossThreadCopier<P6>::copy(parameter6)); 449 } 450 451 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7> 452 PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask( 453 void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7), 454 const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4, const P5& parameter5, const P6& parameter6, const P7& parameter7) 455 { 456 return GenericWorkerTask7<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3, 457 typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::Type, MP5, typename CrossThreadCopier<P6>::Type, MP6, 458 typename CrossThreadCopier<P7>::Type, MP7>::create( 459 method, 460 CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2), 461 CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4), 462 CrossThreadCopier<P5>::copy(parameter5), CrossThreadCopier<P6>::copy(parameter6), 463 CrossThreadCopier<P7>::copy(parameter7)); 464 } 465 466 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7, typename P8, typename MP8> 467 PassOwnPtr<ScriptExecutionContext::Task> createCallbackTask( 468 void (*method)(ScriptExecutionContext*, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8), 469 const P1& parameter1, const P2& parameter2, const P3& parameter3, const P4& parameter4, const P5& parameter5, const P6& parameter6, const P7& parameter7, const P8& parameter8) 470 { 471 return GenericWorkerTask8<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3, 472 typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::Type, MP5, typename CrossThreadCopier<P6>::Type, MP6, 473 typename CrossThreadCopier<P7>::Type, MP7, typename CrossThreadCopier<P8>::Type, MP8>::create( 474 method, 475 CrossThreadCopier<P1>::copy(parameter1), CrossThreadCopier<P2>::copy(parameter2), 476 CrossThreadCopier<P3>::copy(parameter3), CrossThreadCopier<P4>::copy(parameter4), 477 CrossThreadCopier<P5>::copy(parameter5), CrossThreadCopier<P6>::copy(parameter6), 478 CrossThreadCopier<P7>::copy(parameter7), CrossThreadCopier<P8>::copy(parameter8)); 479 } 480 481 } // namespace WebCore 482 483 #endif // ENABLE(WORKERS) 484 485 #endif // GenericWorkerTask_h 486