1 /* 2 * Copyright (C) 2011 University of Szeged 3 * Copyright (C) 2011 Gabor Loki <loki (at) webkit.org> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY 16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR 19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #ifndef ParallelJobsGeneric_h 29 #define ParallelJobsGeneric_h 30 31 #if ENABLE(THREADING_GENERIC) 32 33 #include "wtf/RefCounted.h" 34 #include "wtf/Threading.h" 35 #include "wtf/WTFExport.h" 36 37 namespace WTF { 38 39 class WTF_EXPORT ParallelEnvironment { 40 WTF_MAKE_FAST_ALLOCATED; 41 public: 42 typedef void (*ThreadFunction)(void*); 43 44 ParallelEnvironment(ThreadFunction, size_t sizeOfParameter, int requestedJobNumber); 45 46 int numberOfJobs() 47 { 48 return m_numberOfJobs; 49 } 50 51 void execute(void* parameters); 52 53 class ThreadPrivate : public RefCounted<ThreadPrivate> { 54 public: 55 ThreadPrivate() 56 : m_threadID(0) 57 , m_running(false) 58 , m_parent(0) 59 { 60 } 61 62 bool tryLockFor(ParallelEnvironment*); 63 64 void execute(ThreadFunction, void*); 65 66 void waitForFinish(); 67 68 static PassRefPtr<ThreadPrivate> create() 69 { 70 return adoptRef(new ThreadPrivate()); 71 } 72 73 static void workerThread(void*); 74 75 private: 76 ThreadIdentifier m_threadID; 77 bool m_running; 78 ParallelEnvironment* m_parent; 79 80 mutable Mutex m_mutex; 81 ThreadCondition m_threadCondition; 82 83 ThreadFunction m_threadFunction; 84 void* m_parameters; 85 }; 86 87 private: 88 ThreadFunction m_threadFunction; 89 size_t m_sizeOfParameter; 90 int m_numberOfJobs; 91 92 Vector< RefPtr<ThreadPrivate> > m_threads; 93 static Vector< RefPtr<ThreadPrivate> >* s_threadPool; 94 }; 95 96 } // namespace WTF 97 98 #endif // ENABLE(THREADING_GENERIC) 99 100 101 #endif // ParallelJobsGeneric_h 102