Home | History | Annotate | Download | only in filters
      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 ParallelJobs_h
     29 #define ParallelJobs_h
     30 
     31 #include "platform/Task.h"
     32 #include "public/platform/Platform.h"
     33 #include "public/platform/WebThread.h"
     34 #include "wtf/Assertions.h"
     35 #include "wtf/Noncopyable.h"
     36 #include "wtf/OwnPtr.h"
     37 #include "wtf/Vector.h"
     38 
     39 // Usage:
     40 //
     41 //     // Initialize parallel jobs
     42 //     ParallelJobs<TypeOfParameter> parallelJobs(&worker, requestedNumberOfJobs);
     43 //
     44 //     // Fill the parameter array
     45 //     for(i = 0; i < parallelJobs.numberOfJobs(); ++i) {
     46 //       TypeOfParameter& params = parallelJobs.parameter(i);
     47 //       params.attr1 = localVars ...
     48 //       ...
     49 //     }
     50 //
     51 //     // Execute parallel jobs
     52 //     parallelJobs.execute();
     53 //
     54 
     55 namespace WebCore {
     56 
     57 template<typename Type>
     58 class ParallelJobs {
     59     WTF_MAKE_NONCOPYABLE(ParallelJobs);
     60     WTF_MAKE_FAST_ALLOCATED;
     61 public:
     62     typedef void (*WorkerFunction)(Type*);
     63 
     64     ParallelJobs(WorkerFunction func, size_t requestedJobNumber)
     65         : m_func(func)
     66     {
     67         size_t numberOfJobs = std::max(static_cast<size_t>(2), std::min(requestedJobNumber, blink::Platform::current()->numberOfProcessors()));
     68         m_parameters.grow(numberOfJobs);
     69         // The main thread can execute one job, so only create requestJobNumber - 1 threads.
     70         for (size_t i = 0; i < numberOfJobs - 1; ++i) {
     71             OwnPtr<blink::WebThread> thread = adoptPtr(blink::Platform::current()->createThread("Unfortunate parallel worker"));
     72             m_threads.append(thread.release());
     73         }
     74     }
     75 
     76     size_t numberOfJobs()
     77     {
     78         return m_parameters.size();
     79     }
     80 
     81     Type& parameter(size_t i)
     82     {
     83         return m_parameters[i];
     84     }
     85 
     86     void execute()
     87     {
     88         for (size_t i = 0; i < numberOfJobs() - 1; ++i)
     89             m_threads[i]->postTask(new Task(WTF::bind(m_func, &parameter(i))));
     90         m_func(&parameter(numberOfJobs() - 1));
     91         m_threads.clear();
     92     }
     93 
     94 private:
     95     WorkerFunction m_func;
     96     Vector<OwnPtr<blink::WebThread> > m_threads;
     97     Vector<Type> m_parameters;
     98 };
     99 
    100 } // namespace WebCore
    101 
    102 #endif // ParallelJobs_h
    103