Changeset 201872 in webkit
- Timestamp:
- Jun 9, 2016 10:34:55 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r201809 r201872 1 2016-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 1 16 2016-06-08 Brady Eidson <beidson@apple.com> 2 17 -
trunk/Source/WTF/wtf/CrossThreadTask.h
r201809 r201872 33 33 34 34 class 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&);53 35 public: 54 36 CrossThreadTask() = default; … … 69 51 }; 70 52 71 template<typename T> 72 CrossThreadTask createCrossThreadTask( 73 T& callee, 74 void (T::*method)()) 53 template <typename T> 54 T crossThreadCopy(const T& t) 75 55 { 76 return CrossThreadTask([callee = &callee, method]() mutable { 77 (callee->*method)(); 56 return CrossThreadCopier<T>::copy(t); 57 } 58 59 template <typename F, typename ArgsTuple, size_t... ArgsIndex> 60 void callFunctionForCrossThreadTaskImpl(F function, ArgsTuple&& args, std::index_sequence<ArgsIndex...>) 61 { 62 function(std::get<ArgsIndex>(std::forward<ArgsTuple>(args))...); 63 } 64 65 template <typename F, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>> 66 void callFunctionForCrossThreadTask(F function, ArgsTuple&& args) 67 { 68 callFunctionForCrossThreadTaskImpl(function, std::forward<ArgsTuple>(args), ArgsIndicies()); 69 } 70 71 template<typename... Parameters, typename... Arguments> 72 CrossThreadTask 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)); 78 76 }); 79 77 } 80 78 81 template<typename T, typename P1, typename MP1> 82 CrossThreadTask createCrossThreadTask( 83 T& callee, 84 void (T::*method)(MP1), 85 const P1& parameter1) 79 template <typename C, typename MF, typename ArgsTuple, size_t... ArgsIndex> 80 void callMemberFunctionForCrossThreadTaskImpl(C* object, MF function, ArgsTuple&& args, std::index_sequence<ArgsIndex...>) 86 81 { 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))...); 91 83 } 92 84 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) 85 template <typename C, typename MF, typename ArgsTuple, typename ArgsIndicies = std::make_index_sequence<std::tuple_size<ArgsTuple>::value>> 86 void callMemberFunctionForCrossThreadTask(C* object, MF function, ArgsTuple&& args) 99 87 { 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()); 105 89 } 106 90 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) 91 template<typename T, typename... Parameters, typename... Arguments> 92 CrossThreadTask createCrossThreadTask(T& callee, void (T::*method)(Parameters...), const Arguments&... arguments) 114 93 { 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)); 245 96 }); 246 97 } -
trunk/Tools/ChangeLog
r201866 r201872 1 2016-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 1 11 2016-06-09 Chris Dumez <cdumez@apple.com> 2 12 -
trunk/Tools/TestWebKitAPI/Tests/WTF/CrossThreadTask.cpp
r201811 r201872 86 86 return string; 87 87 } 88 89 88 }; 90 89 … … 104 103 task.performTask(); 105 104 } 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()); 107 106 } 108 107
Note: See TracChangeset
for help on using the changeset viewer.