Changeset 64406 in webkit
- Timestamp:
- Jul 30, 2010 10:04:11 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r64402 r64406 1 2010-07-30 Kinuko Yasuda <kinuko@chromium.org> 2 3 Reviewed by Jian Li. 4 5 Decouple FileThread from FileStream to support generic file-related async tasks 6 https://bugs.webkit.org/show_bug.cgi?id=43135 7 8 No new tests as this doesn't change any functionality. 9 10 * html/FileThread.cpp: 11 (WebCore::FileThread::stop): 12 (WebCore::SameInstancePredicate::SameFilePredicate): 13 (WebCore::SameInstancePredicate::operator()): 14 (WebCore::FileThread::unscheduleTasksInternal): 15 * html/FileThread.h: 16 (WebCore::FileThread::create): 17 (WebCore::FileThread::Task::instance): 18 (WebCore::FileThread::Task::Task): 19 * html/FileThreadTask.h: Changed all templates to take any type as a callee instance. 20 (WebCore::createFileThreadTask): 21 1 22 2010-07-30 Darin Fisher <darin@chromium.org> 2 23 -
trunk/WebCore/html/FileThread.cpp
r57229 r64406 62 62 void FileThread::stop() 63 63 { 64 returnm_queue.kill();64 m_queue.kill(); 65 65 } 66 66 … … 70 70 } 71 71 72 class Same FilePredicate {72 class SameInstancePredicate { 73 73 public: 74 Same FilePredicate(const FileStream* stream) : m_stream(stream) { }75 bool operator()(FileThread::Task* task) const { return task-> stream() == m_stream; }74 SameInstancePredicate(const void* instance) : m_instance(instance) { } 75 bool operator()(FileThread::Task* task) const { return task->instance() == m_instance; } 76 76 private: 77 const FileStream* m_stream;77 const void* m_instance; 78 78 }; 79 79 80 void FileThread::unscheduleTasks(const FileStream* stream)80 void FileThread::unscheduleTasks(const void* instance) 81 81 { 82 Same FilePredicate predicate(stream);82 SameInstancePredicate predicate(instance); 83 83 m_queue.removeIf(predicate); 84 84 } -
trunk/WebCore/html/FileThread.h
r57229 r64406 45 45 class FileThread : public ThreadSafeShared<FileThread> { 46 46 public: 47 static PassRefPtr<FileThread> create() { return adoptRef(new FileThread()); } 47 static PassRefPtr<FileThread> create() 48 { 49 return adoptRef(new FileThread()); 50 } 51 48 52 ~FileThread(); 49 53 … … 55 59 virtual ~Task() { } 56 60 virtual void performTask() = 0; 57 FileStream* stream() const { return m_stream; }61 void* instance() const { return m_instance; } 58 62 protected: 59 Task( FileStream* stream) : m_stream(stream) { }60 FileStream* m_stream;63 Task(void* instance) : m_instance(instance) { } 64 void* m_instance; 61 65 }; 62 66 63 67 void postTask(PassOwnPtr<Task> task); 64 void unscheduleTasks(const FileStream*); 68 69 void unscheduleTasks(const void* instance); 65 70 66 71 private: -
trunk/WebCore/html/FileThreadTask.h
r64162 r64406 33 33 34 34 #include "CrossThreadCopier.h" 35 #include "CrossThreadTask.h" 35 36 #include "FileThread.h" 36 #include <memory>37 37 #include <wtf/PassOwnPtr.h> 38 38 #include <wtf/PassRefPtr.h> 39 #include <wtf/TypeTraits.h>40 39 41 40 namespace WebCore { 42 41 43 // Traits for the Task. 44 template<typename T> struct FileThreadTaskTraits { 45 typedef const T& ParamType; 46 }; 47 48 template<typename T> struct FileThreadTaskTraits<T*> { 49 typedef T* ParamType; 50 }; 51 52 template<typename T> struct FileThreadTaskTraits<PassRefPtr<T> > { 53 typedef PassRefPtr<T> ParamType; 54 }; 55 56 template<typename T> struct FileThreadTaskTraits<PassOwnPtr<T> > { 57 typedef PassOwnPtr<T> ParamType; 58 }; 59 60 template<typename R> 42 template<typename R, typename T> 61 43 class FileThreadTask0 : public FileThread::Task { 62 44 public: 63 typedef R ( FileStream::*Method)();64 typedef FileThreadTask0<R > FileThreadTask;65 66 static PassOwnPtr<FileThreadTask > create(FileStream* stream, Method method)67 { 68 return new FileThreadTask (stream, method);69 } 70 71 private: 72 FileThreadTask0( FileStream* stream, Method method)73 : FileThread::Task( stream)74 , m_method(method) 75 { 76 } 77 78 virtual void performTask() 79 { 80 (*st ream().*m_method)();81 } 82 83 private: 84 Method m_method; 85 }; 86 87 template<typename R, typename P1, typename MP1>45 typedef R (T::*Method)(); 46 typedef FileThreadTask0<R, T> FileThreadTaskImpl; 47 48 static PassOwnPtr<FileThreadTaskImpl> create(T* instance, Method method) 49 { 50 return new FileThreadTaskImpl(instance, method); 51 } 52 53 private: 54 FileThreadTask0(T* instance, Method method) 55 : FileThread::Task(instance) 56 , m_method(method) 57 { 58 } 59 60 virtual void performTask() 61 { 62 (*static_cast<T*>(instance()).*m_method)(); 63 } 64 65 private: 66 Method m_method; 67 }; 68 69 template<typename R, typename T, typename P1, typename MP1> 88 70 class FileThreadTask1 : public FileThread::Task { 89 71 public: 90 typedef R ( FileStream::*Method)(MP1);91 typedef FileThreadTask1<R, P1, MP1> FileThreadTask;92 typedef typename FileThreadTaskTraits<P1>::ParamType Param1;93 94 static PassOwnPtr<FileThreadTask > create(FileStream* stream, Method method, Param1 parameter1)95 { 96 return new FileThreadTask (stream, method, parameter1);97 } 98 99 private: 100 FileThreadTask1( FileStream* stream, Method method, Param1 parameter1)101 : FileThread::Task( stream)72 typedef R (T::*Method)(MP1); 73 typedef FileThreadTask1<R, T, P1, MP1> FileThreadTaskImpl; 74 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; 75 76 static PassOwnPtr<FileThreadTaskImpl> create(T* instance, Method method, Param1 parameter1) 77 { 78 return new FileThreadTaskImpl(instance, method, parameter1); 79 } 80 81 private: 82 FileThreadTask1(T* instance, Method method, Param1 parameter1) 83 : FileThread::Task(instance) 102 84 , m_method(method) 103 85 , m_parameter1(parameter1) … … 107 89 virtual void performTask() 108 90 { 109 (*st ream().*m_method)(m_parameter1);91 (*static_cast<T*>(instance()).*m_method)(m_parameter1); 110 92 } 111 93 … … 115 97 }; 116 98 117 template<typename R, typename P1, typename MP1, typename P2, typename MP2>99 template<typename R, typename T, typename P1, typename MP1, typename P2, typename MP2> 118 100 class FileThreadTask2 : public FileThread::Task { 119 101 public: 120 typedef R ( FileStream::*Method)(MP1, MP2);121 typedef FileThreadTask2<R, P1, MP1, P2, MP2> FileThreadTask;122 typedef typename FileThreadTaskTraits<P1>::ParamType Param1;123 typedef typename FileThreadTaskTraits<P2>::ParamType Param2;124 125 static PassOwnPtr<FileThreadTask > create(FileStream* stream, Method method, Param1 parameter1, Param2 parameter2)126 { 127 return new FileThreadTask (stream, method, parameter1, parameter2);128 } 129 130 private: 131 FileThreadTask2( FileStream* stream, Method method, Param1 parameter1, Param2 parameter2)132 : FileThread::Task( stream)102 typedef R (T::*Method)(MP1, MP2); 103 typedef FileThreadTask2<R, T, P1, MP1, P2, MP2> FileThreadTaskImpl; 104 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; 105 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; 106 107 static PassOwnPtr<FileThreadTaskImpl> create(T* instance, Method method, Param1 parameter1, Param2 parameter2) 108 { 109 return new FileThreadTaskImpl(instance, method, parameter1, parameter2); 110 } 111 112 private: 113 FileThreadTask2(T* instance, Method method, Param1 parameter1, Param2 parameter2) 114 : FileThread::Task(instance) 133 115 , m_method(method) 134 116 , m_parameter1(parameter1) … … 139 121 virtual void performTask() 140 122 { 141 (*st ream().*m_method)(m_parameter1, m_parameter2);123 (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2); 142 124 } 143 125 … … 148 130 }; 149 131 150 template<typename R, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>132 template<typename R, typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3> 151 133 class FileThreadTask3 : public FileThread::Task { 152 134 public: 153 typedef R (FileStream::*Method)(MP1, MP2, MP3);154 typedef FileThreadTask3<R, P1, MP1, P2, MP2, P3, MP3> FileThreadTask;155 typedef typename FileThreadTaskTraits<P1>::ParamType Param1;156 typedef typename FileThreadTaskTraits<P2>::ParamType Param2;157 typedef typename FileThreadTaskTraits<P3>::ParamType Param3;158 159 static PassOwnPtr<FileThreadTask > create(FileStream* stream, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)160 { 161 return new FileThreadTask (stream, method, parameter1, parameter2, parameter3);162 } 163 164 private: 165 FileThreadTask3( FileStream* stream, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3)166 : FileThread::Task( stream)135 typedef void (T::*Method)(MP1, MP2, MP3); 136 typedef FileThreadTask3<R, T, P1, MP1, P2, MP2, P3, MP3> FileThreadTaskImpl; 137 typedef typename CrossThreadTaskTraits<P1>::ParamType Param1; 138 typedef typename CrossThreadTaskTraits<P2>::ParamType Param2; 139 typedef typename CrossThreadTaskTraits<P3>::ParamType Param3; 140 141 static PassOwnPtr<FileThreadTaskImpl> create(T* instance, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3) 142 { 143 return new FileThreadTaskImpl(instance, method, parameter1, parameter2, parameter3); 144 } 145 146 private: 147 FileThreadTask3(T* instance, Method method, Param1 parameter1, Param2 parameter2, Param3 parameter3) 148 : FileThread::Task(instance) 167 149 , m_method(method) 168 150 , m_parameter1(parameter1) … … 174 156 virtual void performTask() 175 157 { 176 (*st ream().*m_method)(m_parameter1, m_parameter2, m_parameter3);158 (*static_cast<T*>(instance()).*m_method)(m_parameter1, m_parameter2, m_parameter3); 177 159 } 178 160 … … 184 166 }; 185 167 186 template<typename R >187 PassOwnPtr<FileThread::Task> createFileThreadTask( 188 FileStream* const callee,189 R ( FileStream::*method)());190 191 template<typename R >192 PassOwnPtr<FileThread::Task> createFileThreadTask( 193 FileStream* const callee,194 R ( FileStream::*method)())195 { 196 return FileThreadTask0<R >::create(168 template<typename R, typename T> 169 PassOwnPtr<FileThread::Task> createFileThreadTask( 170 T* const callee, 171 R (T::*method)()); 172 173 template<typename R, typename T> 174 PassOwnPtr<FileThread::Task> createFileThreadTask( 175 T* const callee, 176 R (T::*method)()) 177 { 178 return FileThreadTask0<R, T>::create( 197 179 callee, 198 180 method); 199 181 } 200 182 201 template<typename R, typename P1, typename MP1>202 PassOwnPtr<FileThread::Task> createFileThreadTask( 203 FileStream* const callee,204 R ( FileStream::*method)(MP1),183 template<typename R, typename T, typename P1, typename MP1> 184 PassOwnPtr<FileThread::Task> createFileThreadTask( 185 T* const callee, 186 R (T::*method)(MP1), 205 187 const P1& parameter1) 206 188 { 207 return FileThreadTask1<R, typename CrossThreadCopier<P1>::Type, MP1>::create(189 return FileThreadTask1<R, T, typename CrossThreadCopier<P1>::Type, MP1>::create( 208 190 callee, 209 191 method, … … 211 193 } 212 194 213 template<typename R, typename P1, typename MP1, typename P2, typename MP2>214 PassOwnPtr<FileThread::Task> createFileThreadTask( 215 FileStream* const callee,216 R ( FileStream::*method)(MP1, MP2),195 template<typename R, typename T, typename P1, typename MP1, typename P2, typename MP2> 196 PassOwnPtr<FileThread::Task> createFileThreadTask( 197 T* const callee, 198 R (T::*method)(MP1, MP2), 217 199 const P1& parameter1, 218 200 const P2& parameter2) 219 201 { 220 return FileThreadTask2<R, typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2>::create(202 return FileThreadTask2<R, T, typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2>::create( 221 203 callee, 222 204 method, … … 225 207 } 226 208 227 template<typename R, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3>228 PassOwnPtr<FileThread::Task> createFileThreadTask( 229 FileStream* const callee,230 R ( FileStream::*method)(MP1, MP2, MP3),209 template<typename R, typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3> 210 PassOwnPtr<FileThread::Task> createFileThreadTask( 211 T* const callee, 212 R (T::*method)(MP1, MP2, MP3), 231 213 const P1& parameter1, 232 214 const P2& parameter2, 233 215 const P3& parameter3) 234 216 { 235 return FileThreadTask3<R, typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3>::create(217 return FileThreadTask3<R, T, typename CrossThreadCopier<P1>::Type, MP1, typename CrossThreadCopier<P2>::Type, MP2, typename CrossThreadCopier<P3>::Type, MP3>::create( 236 218 callee, 237 219 method,
Note: See TracChangeset
for help on using the changeset viewer.