Changeset 201872 in webkit


Ignore:
Timestamp:
Jun 9, 2016 10:34:55 AM (8 years ago)
Author:
beidson@apple.com
Message:

Greatly simplify CrossThreadTask.h.
https://bugs.webkit.org/show_bug.cgi?id=158542

Reviewed by Darin Adler.

Source/WTF:

  • wtf/CrossThreadTask.h:

(WTF::crossThreadCopy):
(WTF::callFunctionForCrossThreadTaskImpl):
(WTF::callFunctionForCrossThreadTask):
(WTF::createCrossThreadTask):
(WTF::callMemberFunctionForCrossThreadTaskImpl):
(WTF::callMemberFunctionForCrossThreadTask):

Tools:

  • TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp:

(TestWebKitAPI::TEST):

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r201809 r201872  
     12016-06-09  Brady Eidson  <beidson@apple.com>
     2
     3        Greatly simplify CrossThreadTask.h.
     4        https://bugs.webkit.org/show_bug.cgi?id=158542
     5
     6        Reviewed by Darin Adler.
     7
     8        * wtf/CrossThreadTask.h:
     9        (WTF::crossThreadCopy):
     10        (WTF::callFunctionForCrossThreadTaskImpl):
     11        (WTF::callFunctionForCrossThreadTask):
     12        (WTF::createCrossThreadTask):
     13        (WTF::callMemberFunctionForCrossThreadTaskImpl):
     14        (WTF::callMemberFunctionForCrossThreadTask):
     15
    1162016-06-08  Brady Eidson  <beidson@apple.com>
    217
  • trunk/Source/WTF/wtf/CrossThreadTask.h

    r201809 r201872  
    3333
    3434class CrossThreadTask {
    35     template<class T>
    36     friend CrossThreadTask createCrossThreadTask(T&, void (T::*)());
    37     template<class T, class P1, class MP1>
    38     friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1), const P1&);
    39     template<class T, class P1, class MP1, class P2, class MP2>
    40     friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2), const P1&, const P2&);
    41     template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3>
    42     friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3), const P1&, const P2&, const P3&);
    43     template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4>
    44     friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4), const P1&, const P2&, const P3&, const P4&);
    45     template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4, class P5, class MP5>
    46     friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4, MP5), const P1&, const P2&, const P3&, const P4&, const P5&);
    47     template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4, class P5, class MP5, class P6, class MP6>
    48     friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4, MP5, MP6), const P1&, const P2&, const P3&, const P4&, const P5&, const P6&);
    49     template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4, class P5, class MP5, class P6, class MP6, class P7, class MP7>
    50     friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4, MP5, MP6, MP7), const P1&, const P2&, const P3&, const P4&, const P5&, const P6&, const P7&);
    51     template<class T, class P1, class MP1, class P2, class MP2, class P3, class MP3, class P4, class MP4, class P5, class MP5, class P6, class MP6, class P7, class MP7, class P8, class MP8>
    52     friend CrossThreadTask createCrossThreadTask(T&, void (T::*)(MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8), const P1&, const P2&, const P3&, const P4&, const P5&, const P6&, const P7&, const P8&);
    5335public:
    5436    CrossThreadTask() = default;
     
    6951};
    7052
    71 template<typename T>
    72 CrossThreadTask createCrossThreadTask(
    73     T& callee,
    74     void (T::*method)())
     53template <typename T>
     54T crossThreadCopy(const T& t)
    7555{
    76     return CrossThreadTask([callee = &callee, method]() mutable {
    77         (callee->*method)();
     56    return CrossThreadCopier<T>::copy(t);
     57}
     58
     59template <typename F, typename ArgsTuple, size_t... ArgsIndex>
     60void callFunctionForCrossThreadTaskImpl(F function, ArgsTuple&& args, std::index_sequence<ArgsIndex...>)
     61{
     62    function(std::get<ArgsIndex>(std::forward<ArgsTuple>(args))...);
     63}
     64
     65template <typename F, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>>
     66void callFunctionForCrossThreadTask(F function, ArgsTuple&& args)
     67{
     68    callFunctionForCrossThreadTaskImpl(function, std::forward<ArgsTuple>(args), ArgsIndicies());
     69}
     70
     71template<typename... Parameters, typename... Arguments>
     72CrossThreadTask createCrossThreadTask(void (*method)(Parameters...), const Arguments&... arguments)
     73{
     74    return CrossThreadTask([method, arguments = std::make_tuple(crossThreadCopy<Arguments>(arguments)...)]() mutable {
     75        callFunctionForCrossThreadTask(method, WTFMove(arguments));
    7876    });
    7977}
    8078
    81 template<typename T, typename P1, typename MP1>
    82 CrossThreadTask createCrossThreadTask(
    83     T& callee,
    84     void (T::*method)(MP1),
    85     const P1& parameter1)
     79template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex>
     80void callMemberFunctionForCrossThreadTaskImpl(C* object, MF function, ArgsTuple&& args, std::index_sequence<ArgsIndex...>)
    8681{
    87     return CrossThreadTask([callee = &callee, method,
    88         p1 = CrossThreadCopier<P1>::copy(parameter1)]() mutable {
    89         (callee->*method)(p1);
    90     });
     82    (object->*function)(std::get<ArgsIndex>(std::forward<ArgsTuple>(args))...);
    9183}
    9284
    93 template<typename T, typename P1, typename MP1, typename P2, typename MP2>
    94 CrossThreadTask createCrossThreadTask(
    95     T& callee,
    96     void (T::*method)(MP1, MP2),
    97     const P1& parameter1,
    98     const P2& parameter2)
     85template <typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>>
     86void callMemberFunctionForCrossThreadTask(C* object, MF function, ArgsTuple&& args)
    9987{
    100     return CrossThreadTask([callee = &callee, method,
    101         p1 = CrossThreadCopier<P1>::copy(parameter1),
    102         p2 = CrossThreadCopier<P2>::copy(parameter2)]() mutable {
    103         (callee->*method)(p1, p2);
    104     });
     88    callMemberFunctionForCrossThreadTaskImpl(object, function, std::forward<ArgsTuple>(args), ArgsIndicies());
    10589}
    10690
    107 template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
    108 CrossThreadTask createCrossThreadTask(
    109     T& callee,
    110     void (T::*method)(MP1, MP2, MP3),
    111     const P1& parameter1,
    112     const P2& parameter2,
    113     const P3& parameter3)
     91template<typename T, typename... Parameters, typename... Arguments>
     92CrossThreadTask createCrossThreadTask(T& callee, void (T::*method)(Parameters...), const Arguments&... arguments)
    11493{
    115     return CrossThreadTask([callee = &callee, method,
    116         p1 = CrossThreadCopier<P1>::copy(parameter1),
    117         p2 = CrossThreadCopier<P2>::copy(parameter2),
    118         p3 = CrossThreadCopier<P3>::copy(parameter3)]() mutable {
    119         (callee->*method)(p1, p2, p3);
    120     });
    121 }
    122 
    123 template<typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>
    124 CrossThreadTask createCrossThreadTask(
    125     void (*method)(MP1, MP2, MP3),
    126     const P1& parameter1,
    127     const P2& parameter2,
    128     const P3& parameter3)
    129 {
    130     return CrossThreadTask([method,
    131         p1 = CrossThreadCopier<P1>::copy(parameter1),
    132         p2 = CrossThreadCopier<P2>::copy(parameter2),
    133         p3 = CrossThreadCopier<P3>::copy(parameter3)]() mutable {
    134         method(p1, p2, p3);
    135     });
    136 }
    137 
    138 template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4>
    139 CrossThreadTask createCrossThreadTask(
    140     T& callee,
    141     void (T::*method)(MP1, MP2, MP3, MP4),
    142     const P1& parameter1,
    143     const P2& parameter2,
    144     const P3& parameter3,
    145     const P4& parameter4)
    146 {
    147     return CrossThreadTask([callee = &callee, method,
    148         p1 = CrossThreadCopier<P1>::copy(parameter1),
    149         p2 = CrossThreadCopier<P2>::copy(parameter2),
    150         p3 = CrossThreadCopier<P3>::copy(parameter3),
    151         p4 = CrossThreadCopier<P4>::copy(parameter4)]() mutable {
    152         (callee->*method)(p1, p2, p3, p4);
    153     });
    154 }
    155 
    156 template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5>
    157 CrossThreadTask createCrossThreadTask(
    158     T& callee,
    159     void (T::*method)(MP1, MP2, MP3, MP4, MP5),
    160     const P1& parameter1,
    161     const P2& parameter2,
    162     const P3& parameter3,
    163     const P4& parameter4,
    164     const P5& parameter5)
    165 {
    166     return CrossThreadTask([callee = &callee, method,
    167         p1 = CrossThreadCopier<P1>::copy(parameter1),
    168         p2 = CrossThreadCopier<P2>::copy(parameter2),
    169         p3 = CrossThreadCopier<P3>::copy(parameter3),
    170         p4 = CrossThreadCopier<P4>::copy(parameter4),
    171         p5 = CrossThreadCopier<P5>::copy(parameter5)]() mutable {
    172         (callee->*method)(p1, p2, p3, p4, p5);
    173     });
    174 }
    175 
    176 template<typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6>
    177 CrossThreadTask createCrossThreadTask(
    178     T& callee,
    179     void (T::*method)(MP1, MP2, MP3, MP4, MP5, MP6),
    180     const P1& parameter1,
    181     const P2& parameter2,
    182     const P3& parameter3,
    183     const P4& parameter4,
    184     const P5& parameter5,
    185     const P6& parameter6)
    186 {
    187     return CrossThreadTask([callee = &callee, method,
    188         p1 = CrossThreadCopier<P1>::copy(parameter1),
    189         p2 = CrossThreadCopier<P2>::copy(parameter2),
    190         p3 = CrossThreadCopier<P3>::copy(parameter3),
    191         p4 = CrossThreadCopier<P4>::copy(parameter4),
    192         p5 = CrossThreadCopier<P5>::copy(parameter5),
    193         p6 = CrossThreadCopier<P6>::copy(parameter6)]() mutable {
    194         (callee->*method)(p1, p2, p3, p4, p5, p6);
    195     });
    196 }
    197 
    198 template<typename T, 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>
    199 CrossThreadTask createCrossThreadTask(
    200     T& callee,
    201     void (T::*method)(MP1, MP2, MP3, MP4, MP5, MP6, MP7),
    202     const P1& parameter1,
    203     const P2& parameter2,
    204     const P3& parameter3,
    205     const P4& parameter4,
    206     const P5& parameter5,
    207     const P6& parameter6,
    208     const P7& parameter7)
    209 {
    210     return CrossThreadTask([callee = &callee, method,
    211         p1 = CrossThreadCopier<P1>::copy(parameter1),
    212         p2 = CrossThreadCopier<P2>::copy(parameter2),
    213         p3 = CrossThreadCopier<P3>::copy(parameter3),
    214         p4 = CrossThreadCopier<P4>::copy(parameter4),
    215         p5 = CrossThreadCopier<P5>::copy(parameter5),
    216         p6 = CrossThreadCopier<P6>::copy(parameter6),
    217         p7 = CrossThreadCopier<P7>::copy(parameter7)]() mutable {
    218         (callee->*method)(p1, p2, p3, p4, p5, p6, p7);
    219     });
    220 }
    221 
    222 template<typename T, 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>
    223 CrossThreadTask createCrossThreadTask(
    224     T& callee,
    225     void (T::*method)(MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8),
    226     const P1& parameter1,
    227     const P2& parameter2,
    228     const P3& parameter3,
    229     const P4& parameter4,
    230     const P5& parameter5,
    231     const P6& parameter6,
    232     const P7& parameter7,
    233     const P8& parameter8)
    234 {
    235     return CrossThreadTask([callee = &callee, method,
    236         p1 = CrossThreadCopier<P1>::copy(parameter1),
    237         p2 = CrossThreadCopier<P2>::copy(parameter2),
    238         p3 = CrossThreadCopier<P3>::copy(parameter3),
    239         p4 = CrossThreadCopier<P4>::copy(parameter4),
    240         p5 = CrossThreadCopier<P5>::copy(parameter5),
    241         p6 = CrossThreadCopier<P6>::copy(parameter6),
    242         p7 = CrossThreadCopier<P7>::copy(parameter7),
    243         p8 = CrossThreadCopier<P8>::copy(parameter8)]() mutable {
    244         (callee->*method)(p1, p2, p3, p4, p5, p6, p7, p8);
     94    return CrossThreadTask([callee = &callee, method, arguments = std::make_tuple(crossThreadCopy<Arguments>(arguments)...)]() mutable {
     95        callMemberFunctionForCrossThreadTask(callee, method, WTFMove(arguments));
    24596    });
    24697}
  • trunk/Tools/ChangeLog

    r201866 r201872  
     12016-06-09  Brady Eidson  <beidson@apple.com>
     2
     3        Greatly simplify CrossThreadTask.h.
     4        https://bugs.webkit.org/show_bug.cgi?id=158542
     5
     6        Reviewed by Darin Adler.
     7
     8        * TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp:
     9        (TestWebKitAPI::TEST):
     10
    1112016-06-09  Chris Dumez  <cdumez@apple.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp

    r201811 r201872  
    8686        return string;
    8787    }
    88 
    8988};
    9089
     
    104103        task.performTask();
    105104    }
    106     ASSERT_STREQ("default_constructor(<default>-0-0) copy_constructor(<default>-1-0) name_constructor(logger-0-0) isolatedCopy() copy_constructor(<default>-1-0) isolatedCopy() copy_constructor(<default>-2-0) isolatedCopy() copy_constructor(logger-1-0) move_constructor(<default>-1-1) move_constructor(<default>-2-1) move_constructor(logger-1-1) destructor(logger-1-0) destructor(<default>-2-0) destructor(<default>-1-0) testFunction called destructor(logger-1-1) destructor(<default>-2-1) destructor(<default>-1-1) destructor(logger-0-0) destructor(<default>-1-0) destructor(<default>-0-0) ", LifetimeLogger::takeLogStr().c_str());
     105    ASSERT_STREQ("default_constructor(<default>-0-0) copy_constructor(<default>-1-0) name_constructor(logger-0-0) isolatedCopy() copy_constructor(<default>-1-0) isolatedCopy() copy_constructor(<default>-2-0) isolatedCopy() copy_constructor(logger-1-0) move_constructor(<default>-1-1) move_constructor(<default>-2-1) move_constructor(logger-1-1) destructor(logger-1-0) destructor(<default>-2-0) destructor(<default>-1-0) move_constructor(<default>-1-2) move_constructor(<default>-2-2) move_constructor(logger-1-2) destructor(logger-1-1) destructor(<default>-2-1) destructor(<default>-1-1) testFunction called destructor(logger-1-2) destructor(<default>-2-2) destructor(<default>-1-2) destructor(logger-0-0) destructor(<default>-1-0) destructor(<default>-0-0) ", LifetimeLogger::takeLogStr().c_str());
    107106}
    108107   
Note: See TracChangeset for help on using the changeset viewer.