[WTF] Use m_suspendCount instead of m_suspended flag in Thread
[WebKit-https.git] / Source / JavaScriptCore / heap / Weak.h
1 /*
2  * Copyright (C) 2009, 2012, 2013, 2016 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "JSExportMacros.h"
29 #include <cstddef>
30 #include <wtf/HashTraits.h>
31 #include <wtf/Noncopyable.h>
32 #include <wtf/VectorTraits.h>
33
34 namespace JSC {
35
36 class WeakImpl;
37 class WeakHandleOwner;
38
39 // This is a free function rather than a Weak<T> member function so we can put it in Weak.cpp.
40 JS_EXPORT_PRIVATE void weakClearSlowCase(WeakImpl*&);
41
42 template<typename T> class Weak {
43     WTF_MAKE_NONCOPYABLE(Weak);
44 public:
45     Weak()
46         : m_impl(0)
47     {
48     }
49
50     Weak(std::nullptr_t)
51         : m_impl(0)
52     {
53     }
54
55     inline Weak(T*, WeakHandleOwner* = 0, void* context = 0);
56
57     enum HashTableDeletedValueTag { HashTableDeletedValue };
58     inline bool isHashTableDeletedValue() const;
59     inline Weak(HashTableDeletedValueTag);
60
61     inline Weak(Weak&&);
62
63     ~Weak()
64     {
65         clear();
66     }
67
68     inline void swap(Weak&);
69
70     inline Weak& operator=(Weak&&);
71
72     inline bool operator!() const;
73     inline T* operator->() const;
74     inline T& operator*() const;
75     inline T* get() const;
76
77     inline bool was(T*) const;
78
79     inline explicit operator bool() const;
80
81     inline WeakImpl* leakImpl() WARN_UNUSED_RETURN;
82     void clear()
83     {
84         if (!m_impl)
85             return;
86         weakClearSlowCase(m_impl);
87     }
88     
89 private:
90     static inline WeakImpl* hashTableDeletedValue();
91
92     WeakImpl* m_impl;
93 };
94
95 } // namespace JSC
96
97 namespace WTF {
98
99 template<typename T> struct VectorTraits<JSC::Weak<T>> : SimpleClassVectorTraits {
100     static const bool canCompareWithMemcmp = false;
101 };
102
103 template<typename T> struct HashTraits<JSC::Weak<T>> : SimpleClassHashTraits<JSC::Weak<T>> {
104     typedef JSC::Weak<T> StorageType;
105
106     typedef std::nullptr_t EmptyValueType;
107     static EmptyValueType emptyValue() { return nullptr; }
108
109     typedef T* PeekType;
110     static PeekType peek(const StorageType& value) { return value.get(); }
111     static PeekType peek(EmptyValueType) { return PeekType(); }
112 };
113
114 } // namespace WTF