Remove excessive headers from JavaScriptCore
[WebKit-https.git] / Source / JavaScriptCore / heap / DeferGC.h
1 /*
2  * Copyright (C) 2013-2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #pragma once
27
28 #include "DisallowScope.h"
29 #include "Heap.h"
30 #include <wtf/ThreadSpecific.h>
31
32 namespace JSC {
33
34 class DeferGC {
35     WTF_MAKE_NONCOPYABLE(DeferGC);
36 public:
37     DeferGC(Heap& heap)
38         : m_heap(heap)
39     {
40         m_heap.incrementDeferralDepth();
41     }
42     
43     ~DeferGC()
44     {
45         m_heap.decrementDeferralDepthAndGCIfNeeded();
46     }
47
48 private:
49     Heap& m_heap;
50 };
51
52 class DeferGCForAWhile {
53     WTF_MAKE_NONCOPYABLE(DeferGCForAWhile);
54 public:
55     DeferGCForAWhile(Heap& heap)
56         : m_heap(heap)
57     {
58         m_heap.incrementDeferralDepth();
59     }
60     
61     ~DeferGCForAWhile()
62     {
63         m_heap.decrementDeferralDepth();
64     }
65
66 private:
67     Heap& m_heap;
68 };
69
70 class DisallowGC : public DisallowScope<DisallowGC> {
71     WTF_MAKE_NONCOPYABLE(DisallowGC);
72     typedef DisallowScope<DisallowGC> Base;
73 public:
74 #ifdef NDEBUG
75
76     ALWAYS_INLINE DisallowGC(bool = false) { }
77     ALWAYS_INLINE static void initialize() { }
78
79 #else // not NDEBUG
80
81     DisallowGC(bool enabled = true)
82         : Base(enabled)
83     { }
84
85     static void initialize()
86     {
87         WTF::threadSpecificKeyCreate(&s_scopeReentryCount, 0);
88     }
89
90 private:
91     static uintptr_t scopeReentryCount()
92     {
93         return reinterpret_cast<uintptr_t>(WTF::threadSpecificGet(s_scopeReentryCount));
94     }
95     static void setScopeReentryCount(uintptr_t value)
96     {
97         WTF::threadSpecificSet(s_scopeReentryCount, reinterpret_cast<void*>(value));
98     }
99     
100     JS_EXPORT_PRIVATE static WTF::ThreadSpecificKey s_scopeReentryCount;
101
102 #endif // NDEBUG
103     
104     friend class DisallowScope<DisallowGC>;
105 };
106
107 } // namespace JSC