[WTF] Use m_suspendCount instead of m_suspended flag in Thread
[WebKit-https.git] / Source / JavaScriptCore / heap / FreeList.cpp
1 /*
2  * Copyright (C) 2016-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 #include "config.h"
27 #include "FreeList.h"
28
29 #include "FreeListInlines.h"
30 #include "MarkedBlock.h"
31 #include <wtf/CommaPrinter.h>
32
33 namespace JSC {
34
35 FreeList::FreeList(unsigned cellSize)
36     : m_cellSize(cellSize)
37 {
38 }
39
40 FreeList::~FreeList()
41 {
42 }
43
44 void FreeList::clear()
45 {
46     m_scrambledHead = 0;
47     m_secret = 0;
48     m_payloadEnd = nullptr;
49     m_remaining = 0;
50     m_originalSize = 0;
51 }
52
53 void FreeList::initializeList(FreeCell* head, uintptr_t secret, unsigned bytes)
54 {
55     // It's *slightly* more optimal to use a scrambled head. It saves a register on the fast path.
56     m_scrambledHead = FreeCell::scramble(head, secret);
57     m_secret = secret;
58     m_payloadEnd = nullptr;
59     m_remaining = 0;
60     m_originalSize = bytes;
61 }
62
63 void FreeList::initializeBump(char* payloadEnd, unsigned remaining)
64 {
65     m_scrambledHead = 0;
66     m_secret = 0;
67     m_payloadEnd = payloadEnd;
68     m_remaining = remaining;
69     m_originalSize = remaining;
70 }
71
72 bool FreeList::contains(HeapCell* target) const
73 {
74     if (m_remaining) {
75         const void* start = (m_payloadEnd - m_remaining);
76         const void* end = m_payloadEnd;
77         return (start <= target) && (target < end);
78     }
79
80     FreeCell* candidate = head();
81     while (candidate) {
82         if (bitwise_cast<HeapCell*>(candidate) == target)
83             return true;
84         candidate = candidate->next(m_secret);
85     }
86
87     return false;
88 }
89
90 void FreeList::dump(PrintStream& out) const
91 {
92     out.print("{head = ", RawPointer(head()), ", secret = ", m_secret, ", payloadEnd = ", RawPointer(m_payloadEnd), ", remaining = ", m_remaining, ", originalSize = ", m_originalSize, "}");
93 }
94
95 } // namespace JSC
96