Home | History | Annotate | Download | only in wtf
      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 "wtf/Assertions.h"
     32 #include "wtf/Noncopyable.h"
     33 #include "wtf/RefPtr.h"
     34 #include "wtf/Vector.h"
     35 
     36 // Usage:
     37 //
     38 //     // Initialize parallel jobs
     39 //     ParallelJobs<TypeOfParameter> parallelJobs(&worker [, requestedNumberOfJobs]);
     40 //
     41 //     // Fill the parameter array
     42 //     for(i = 0; i < parallelJobs.numberOfJobs(); ++i) {
     43 //       TypeOfParameter& params = parallelJobs.parameter(i);
     44 //       params.attr1 = localVars ...
     45 //       ...
     46 //     }
     47 //
     48 //     // Execute parallel jobs
     49 //     parallelJobs.execute();
     50 //
     51 
     52 #if !defined(ENABLE_THREADING_LIBDISPATCH) && HAVE(DISPATCH_H)
     53 #define ENABLE_THREADING_LIBDISPATCH 1
     54 #elif !defined(THREADING_GENERIC)
     55 #define ENABLE_THREADING_GENERIC 1
     56 #endif
     57 
     58 #if ENABLE(THREADING_GENERIC)
     59 #include "wtf/ParallelJobsGeneric.h"
     60 
     61 #elif ENABLE(THREADING_LIBDISPATCH)
     62 #include "wtf/ParallelJobsLibdispatch.h"
     63 
     64 #else
     65 #error "No parallel processing API for ParallelJobs"
     66 
     67 #endif
     68 
     69 namespace WTF {
     70 
     71 template<typename Type>
     72 class ParallelJobs {
     73     WTF_MAKE_FAST_ALLOCATED;
     74 public:
     75     typedef void (*WorkerFunction)(Type*);
     76 
     77     ParallelJobs(WorkerFunction func, int requestedJobNumber) :
     78         m_parallelEnvironment(reinterpret_cast<ParallelEnvironment::ThreadFunction>(func), sizeof(Type), requestedJobNumber)
     79     {
     80         m_parameters.grow(m_parallelEnvironment.numberOfJobs());
     81         ASSERT(numberOfJobs() == m_parameters.size());
     82     }
     83 
     84     size_t numberOfJobs()
     85     {
     86         return m_parameters.size();
     87     }
     88 
     89     Type& parameter(size_t i)
     90     {
     91         return m_parameters[i];
     92     }
     93 
     94     void execute()
     95     {
     96         m_parallelEnvironment.execute(reinterpret_cast<unsigned char*>(m_parameters.data()));
     97     }
     98 
     99 private:
    100     ParallelEnvironment m_parallelEnvironment;
    101     Vector<Type> m_parameters;
    102 };
    103 
    104 } // namespace WTF
    105 
    106 using WTF::ParallelJobs;
    107 
    108 #endif // ParallelJobs_h
    109