initial import
[vuplus_webkit] / Source / JavaScriptCore / wtf / ParallelJobsLibdispatch.h
1 /*
2  * Copyright (C) 2011 University of Szeged
3  * Copyright (C) 2011 Gabor Loki <loki@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 ParallelJobsLibdispatch_h
29 #define ParallelJobsLibdispatch_h
30
31 #if ENABLE(THREADING_LIBDISPATCH)
32
33 #include <dispatch/dispatch.h>
34
35 namespace WTF {
36
37 static const int maxParallelThreads = 2;
38
39 class ParallelEnvironment {
40     WTF_MAKE_FAST_ALLOCATED;
41 public:
42     typedef void (*ThreadFunction)(void*);
43
44     ParallelEnvironment(ThreadFunction threadFunction, size_t sizeOfParameter, int requestedJobNumber) :
45         m_threadFunction(threadFunction),
46         m_sizeOfParameter(sizeOfParameter)
47     {
48         if (!requestedJobNumber || requestedJobNumber > maxParallelThreads)
49             requestedJobNumber = maxParallelThreads;
50
51         ASSERT(requestedJobNumber > 0);
52
53         m_numberOfJobs = requestedJobNumber;
54     }
55
56     int numberOfJobs()
57     {
58         return m_numberOfJobs;
59     }
60
61     void execute(unsigned char* parameters)
62     {
63         // libdispatch is NOT supported inside a template
64         dispatch_queue_t parallelJobsQueue = dispatch_queue_create("ParallelJobs", 0);
65
66         for (int i = 0; i < m_numberOfJobs - 1; ++i) {
67             dispatch_async(parallelJobsQueue, ^{(*m_threadFunction)(parameters);});
68             parameters += m_sizeOfParameter;
69         }
70
71         // The work for the main thread. Wait until all jobs are done.
72         dispatch_sync(parallelJobsQueue, ^{(*m_threadFunction)(parameters);});
73     }
74
75 private:
76     ThreadFunction m_threadFunction;
77     size_t m_sizeOfParameter;
78     int m_numberOfJobs;
79 };
80
81 } // namespace WTF
82
83 #endif // ENABLE(THREADING_LIBDISPATCH)
84
85 #endif // ParallelJobsLibdispatch_h