97a883fdc537797a151280ef91329072b2ccdcf2
[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/Noncopyable.h>
31 #include <wtf/ThreadSpecific.h>
32
33 namespace JSC {
34
35 class DeferGC {
36     WTF_MAKE_NONCOPYABLE(DeferGC);
37 public:
38     DeferGC(Heap& heap)
39         : m_heap(heap)
40     {
41         m_heap.incrementDeferralDepth();
42     }
43     
44     ~DeferGC()
45     {
46         m_heap.decrementDeferralDepthAndGCIfNeeded();
47     }
48
49 private:
50     Heap& m_heap;
51 };
52
53 class DeferGCForAWhile {
54     WTF_MAKE_NONCOPYABLE(DeferGCForAWhile);
55 public:
56     DeferGCForAWhile(Heap& heap)
57         : m_heap(heap)
58     {
59         m_heap.incrementDeferralDepth();
60     }
61     
62     ~DeferGCForAWhile()
63     {
64         m_heap.decrementDeferralDepth();
65     }
66
67 private:
68     Heap& m_heap;
69 };
70
71 class DisallowGC : public DisallowScope<DisallowGC> {
72     WTF_MAKE_NONCOPYABLE(DisallowGC);
73     typedef DisallowScope<DisallowGC> Base;
74 public:
75 #ifdef NDEBUG
76
77     ALWAYS_INLINE DisallowGC(bool = false) { }
78     ALWAYS_INLINE static void initialize() { }
79
80 #else // not NDEBUG
81
82     DisallowGC(bool enabled = true)
83         : Base(enabled)
84     { }
85
86     static void initialize()
87     {
88         WTF::threadSpecificKeyCreate(&s_scopeReentryCount, 0);
89     }
90
91 private:
92     static uintptr_t scopeReentryCount()
93     {
94         return reinterpret_cast<uintptr_t>(WTF::threadSpecificGet(s_scopeReentryCount));
95     }
96     static void setScopeReentryCount(uintptr_t value)
97     {
98         WTF::threadSpecificSet(s_scopeReentryCount, reinterpret_cast<void*>(value));
99     }
100     
101     JS_EXPORT_PRIVATE static WTF::ThreadSpecificKey s_scopeReentryCount;
102
103 #endif // NDEBUG
104     
105     friend class DisallowScope<DisallowGC>;
106 };
107
108 } // namespace JSC