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

Side by Side Diff: Source/core/dom/CrossThreadTask.h

Issue 374583002: Replace CallClosureTask::create(bind()) with createCrossThreadTask() (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Move createCallClosureTask to CrossThreadTask.h Created 6 years, 5 months 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
« no previous file with comments | « no previous file | Source/core/dom/Document.h » ('j') | Source/core/dom/ExecutionContextTask.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 return CrossThreadTask8<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3, 471 return CrossThreadTask8<typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3,
472 typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::T ype, MP5, typename CrossThreadCopier<P6>::Type, MP6, 472 typename CrossThreadCopier<P4>::Type, MP4, typename CrossThreadCopier<P5>::T ype, MP5, typename CrossThreadCopier<P6>::Type, MP6,
473 typename CrossThreadCopier<P7>::Type, MP7, typename CrossThreadCopier<P8>::T ype, MP8>::create( 473 typename CrossThreadCopier<P7>::Type, MP7, typename CrossThreadCopier<P8>::T ype, MP8>::create(
474 method, 474 method,
475 CrossThreadCopier<P1>::co py(parameter1), CrossThreadCopier<P2>::copy(parameter2), 475 CrossThreadCopier<P1>::co py(parameter1), CrossThreadCopier<P2>::copy(parameter2),
476 CrossThreadCopier<P3>::co py(parameter3), CrossThreadCopier<P4>::copy(parameter4), 476 CrossThreadCopier<P3>::co py(parameter3), CrossThreadCopier<P4>::copy(parameter4),
477 CrossThreadCopier<P5>::co py(parameter5), CrossThreadCopier<P6>::copy(parameter6), 477 CrossThreadCopier<P5>::co py(parameter5), CrossThreadCopier<P6>::copy(parameter6),
478 CrossThreadCopier<P7>::co py(parameter7), CrossThreadCopier<P8>::copy(parameter8)); 478 CrossThreadCopier<P7>::co py(parameter7), CrossThreadCopier<P8>::copy(parameter8));
479 } 479 }
480 480
481 // createCallClosureTask(...) is similar to but safer than
tkent 2014/07/10 03:36:14 I'd like to name this createCrossThreadTask. This
hiroshige 2014/07/10 04:39:56 The name createCrossThreadTask seems good, but doe
tyoshino (SeeGerritForStatus) 2014/07/10 04:50:04 Yes we can also rename 1 later to align naming con
tkent 2014/07/10 05:06:23 I'm sorry, I meant createCallbackTask. Smaller pa
hiroshige 2014/07/10 07:16:31 Probably yes. I renamed createCallClosureTask to
482 // CallClosureTask::create(bind(...)) for cross-thread task posting.
483 // postTask(CallClosureTask::create(bind(...))) is not thread-safe
484 // due to temporary objects, see http://crbug.com/390851 for details.
485 //
486 // createCallClosureTask copies its arguments into Closure
487 // by CrossThreadCopier, rather than copy constructors.
488 // This means it creates deep copy of each argument if necessary.
489 //
490 // To pass things that cannot be copied by CrossThreadCopier
491 // (e.g. pointers), use AllowCrossThreadAccess() explicitly.
492 //
493 // If the first argument of createCallClosureTask
494 // is a pointer to a member function in class C,
495 // then the second argument of createCallClosureTask
496 // is a raw pointer (C*) or a weak pointer (const WeakPtr<C>&) to C.
497 // createCallClosureTask does not use CrossThreadCopier for the pointer,
498 // assuming the user of createCallClosureTask knows that the pointer
499 // can be accessed from the target thread.
500
501 // Templates for member function of class C + raw pointer (C*)
502 // which do not use CrossThreadCopier for the raw pointer (a1)
503 template<typename R, typename C>
tkent 2014/07/10 03:36:14 Is R necessary? it's always void, right?
hiroshige 2014/07/10 04:39:56 Right, because CallClosureTask::create require Clo
hiroshige 2014/07/10 07:16:32 Done.
504 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(), C* a1 )
505 {
506 return CallClosureTask::create(bind(function,
507 a1));
508 }
509
510 template<typename R, typename C, typename P2, typename A2>
511 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2), C* a1, const A2& a2)
512 {
513 return CallClosureTask::create(bind(function,
514 a1,
515 CrossThreadCopier<A2>::copy(a2)));
516 }
517
518 template<typename R, typename C, typename P2, typename A2, typename P3, typename A3>
519 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2, P3), C* a1, const A2& a2, const A3& a3)
520 {
521 return CallClosureTask::create(bind(function,
522 a1,
523 CrossThreadCopier<A2>::copy(a2),
524 CrossThreadCopier<A3>::copy(a3)));
525 }
526
527 template<typename R, typename C, typename P2, typename A2, typename P3, typename A3, typename P4, typename A4>
528 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2, P3, P4), C* a1, const A2& a2, const A3& a3, const A4& a4)
529 {
530 return CallClosureTask::create(bind(function,
531 a1,
532 CrossThreadCopier<A2>::copy(a2),
533 CrossThreadCopier<A3>::copy(a3),
534 CrossThreadCopier<A4>::copy(a4)));
535 }
536
537 template<typename R, typename C, typename P2, typename A2, typename P3, typename A3, typename P4, typename A4, typename P5, typename A5>
538 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2, P3, P4, P5), C* a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
539 {
540 return CallClosureTask::create(bind(function,
541 a1,
542 CrossThreadCopier<A2>::copy(a2),
543 CrossThreadCopier<A3>::copy(a3),
544 CrossThreadCopier<A4>::copy(a4),
545 CrossThreadCopier<A5>::copy(a5)));
546 }
547
548 template<typename R, typename C, typename P2, typename A2, typename P3, typename A3, typename P4, typename A4, typename P5, typename A5, typename P6, typename A 6>
549 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2, P3, P4, P5, P6), C* a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, cons t A6& a6)
550 {
551 return CallClosureTask::create(bind(function,
552 a1,
553 CrossThreadCopier<A2>::copy(a2),
554 CrossThreadCopier<A3>::copy(a3),
555 CrossThreadCopier<A4>::copy(a4),
556 CrossThreadCopier<A5>::copy(a5),
557 CrossThreadCopier<A6>::copy(a6)));
558 }
559
560 // Templates for member function of class C + weak pointer (const WeakPtr<C>&)
561 // which do not use CrossThreadCopier for the weak pointer (a1)
562 template<typename R, typename C>
563 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(), const WeakPtr<C>& a1)
564 {
565 return CallClosureTask::create(bind(function,
566 a1));
567 }
568
569 template<typename R, typename C, typename P2, typename A2>
570 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2), con st WeakPtr<C>& a1, const A2& a2)
571 {
572 return CallClosureTask::create(bind(function,
573 a1,
574 CrossThreadCopier<A2>::copy(a2)));
575 }
576
577 template<typename R, typename C, typename P2, typename A2, typename P3, typename A3>
578 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2, P3), const WeakPtr<C>& a1, const A2& a2, const A3& a3)
579 {
580 return CallClosureTask::create(bind(function,
581 a1,
582 CrossThreadCopier<A2>::copy(a2),
583 CrossThreadCopier<A3>::copy(a3)));
584 }
585
586 template<typename R, typename C, typename P2, typename A2, typename P3, typename A3, typename P4, typename A4>
587 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2, P3, P4), const WeakPtr<C>& a1, const A2& a2, const A3& a3, const A4& a4)
588 {
589 return CallClosureTask::create(bind(function,
590 a1,
591 CrossThreadCopier<A2>::copy(a2),
592 CrossThreadCopier<A3>::copy(a3),
593 CrossThreadCopier<A4>::copy(a4)));
594 }
595
596 template<typename R, typename C, typename P2, typename A2, typename P3, typename A3, typename P4, typename A4, typename P5, typename A5>
597 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2, P3, P4, P5), const WeakPtr<C>& a1, const A2& a2, const A3& a3, const A4& a4, const A 5& a5)
598 {
599 return CallClosureTask::create(bind(function,
600 a1,
601 CrossThreadCopier<A2>::copy(a2),
602 CrossThreadCopier<A3>::copy(a3),
603 CrossThreadCopier<A4>::copy(a4),
604 CrossThreadCopier<A5>::copy(a5)));
605 }
606
607 template<typename R, typename C, typename P2, typename A2, typename P3, typename A3, typename P4, typename A4, typename P5, typename A5, typename P6, typename A 6>
608 PassOwnPtr<ExecutionContextTask> createCallClosureTask(R (C::*function)(P2, P3, P4, P5, P6), const WeakPtr<C>& a1, const A2& a2, const A3& a3, const A4& a4, con st A5& a5, const A6& a6)
609 {
610 return CallClosureTask::create(bind(function,
611 a1,
612 CrossThreadCopier<A2>::copy(a2),
613 CrossThreadCopier<A3>::copy(a3),
614 CrossThreadCopier<A4>::copy(a4),
615 CrossThreadCopier<A5>::copy(a5),
616 CrossThreadCopier<A6>::copy(a6)));
617 }
618
619 // Other cases; use CrossThreadCopier for all arguments
620 template<typename FunctionType>
621 PassOwnPtr<ExecutionContextTask> createCallClosureTask(FunctionType function)
622 {
623 return CallClosureTask::create(bind(function));
624 }
625
626 template<typename FunctionType, typename A1>
627 PassOwnPtr<ExecutionContextTask> createCallClosureTask(FunctionType function, co nst A1& a1)
628 {
629 return CallClosureTask::create(bind(function,
630 CrossThreadCopier<A1>::copy(a1)));
631 }
632
633 template<typename FunctionType, typename A1, typename A2>
634 PassOwnPtr<ExecutionContextTask> createCallClosureTask(FunctionType function, co nst A1& a1, const A2& a2)
635 {
636 return CallClosureTask::create(bind(function,
637 CrossThreadCopier<A1>::copy(a1),
638 CrossThreadCopier<A2>::copy(a2)));
639 }
640
641 template<typename FunctionType, typename A1, typename A2, typename A3>
642 PassOwnPtr<ExecutionContextTask> createCallClosureTask(FunctionType function, co nst A1& a1, const A2& a2, const A3& a3)
643 {
644 return CallClosureTask::create(bind(function,
645 CrossThreadCopier<A1>::copy(a1),
646 CrossThreadCopier<A2>::copy(a2),
647 CrossThreadCopier<A3>::copy(a3)));
648 }
649
650 template<typename FunctionType, typename A1, typename A2, typename A3, typename A4>
651 PassOwnPtr<ExecutionContextTask> createCallClosureTask(FunctionType function, co nst A1& a1, const A2& a2, const A3& a3, const A4& a4)
652 {
653 return CallClosureTask::create(bind(function,
654 CrossThreadCopier<A1>::copy(a1),
655 CrossThreadCopier<A2>::copy(a2),
656 CrossThreadCopier<A3>::copy(a3),
657 CrossThreadCopier<A4>::copy(a4)));
658 }
659
660 template<typename FunctionType, typename A1, typename A2, typename A3, typename A4, typename A5>
661 PassOwnPtr<ExecutionContextTask> createCallClosureTask(FunctionType function, co nst A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
662 {
663 return CallClosureTask::create(bind(function,
664 CrossThreadCopier<A1>::copy(a1),
665 CrossThreadCopier<A2>::copy(a2),
666 CrossThreadCopier<A3>::copy(a3),
667 CrossThreadCopier<A4>::copy(a4),
668 CrossThreadCopier<A5>::copy(a5)));
669 }
670
671 template<typename FunctionType, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
672 PassOwnPtr<ExecutionContextTask> createCallClosureTask(FunctionType function, co nst A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6 )
673 {
674 return CallClosureTask::create(bind(function,
675 CrossThreadCopier<A1>::copy(a1),
676 CrossThreadCopier<A2>::copy(a2),
677 CrossThreadCopier<A3>::copy(a3),
678 CrossThreadCopier<A4>::copy(a4),
679 CrossThreadCopier<A5>::copy(a5),
680 CrossThreadCopier<A6>::copy(a6)));
681 }
682
481 } // namespace WebCore 683 } // namespace WebCore
482 684
483 #endif // CrossThreadTask_h 685 #endif // CrossThreadTask_h
OLDNEW
« no previous file with comments | « no previous file | Source/core/dom/Document.h » ('j') | Source/core/dom/ExecutionContextTask.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698