Loading...
--- libmalloc/libmalloc-283.40.1/tests/MallocBenchTest/BMALLOC/bmalloc/ChangeLog
+++ /dev/null
@@ -1,9969 +0,0 @@
-2018-11-21 Dominik Infuehr <dinfuehr@igalia.com>
-
- Enable JIT on ARM/Linux
- https://bugs.webkit.org/show_bug.cgi?id=191548
-
- Reviewed by Yusuke Suzuki.
-
- * bmalloc/IsoPageInlines.h:
- (bmalloc::IsoPage<Config>::startAllocating):
-
-2018-11-01 Jiewen Tan <jiewen_tan@apple.com>
-
- Replace CommonRandom SPI with API
- https://bugs.webkit.org/show_bug.cgi?id=191178
- <rdar://problem/45722391>
-
- Reviewed by Brent Fulgham.
-
- * bmalloc/CryptoRandom.cpp:
- (bmalloc::ARC4RandomNumberGenerator::stir):
-
-2018-10-29 Mark Lam <mark.lam@apple.com>
-
- Correctly detect string overflow when using the 'Function' constructor.
- https://bugs.webkit.org/show_bug.cgi?id=184883
- <rdar://problem/36320331>
-
- Reviewed by Saam Barati.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::tryReallocate):
- (bmalloc::Allocator::reallocateImpl):
- * bmalloc/Allocator.h:
- * bmalloc/Cache.h:
- (bmalloc::Cache::tryReallocate):
- * bmalloc/DebugHeap.cpp:
- (bmalloc::DebugHeap::realloc):
- * bmalloc/DebugHeap.h:
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryRealloc):
-
-2018-10-25 Ross Kirsling <ross.kirsling@sony.com>
-
- Cleanup: inline constexpr is redundant as constexpr implies inline
- https://bugs.webkit.org/show_bug.cgi?id=190819
-
- Reviewed by Mark Lam.
-
- * bmalloc/Algorithm.h:
- (bmalloc::max):
- (bmalloc::min):
- (bmalloc::mask):
- (bmalloc::test):
- (bmalloc::isPowerOfTwo):
- (bmalloc::roundDownToMultipleOf):
- (bmalloc::sizeOf):
- (bmalloc::bitCount):
- (bmalloc::log2):
- * bmalloc/Bits.h:
- (bmalloc::bitsArrayLength):
- * bmalloc/Sizes.h:
- (bmalloc::Sizes::maskSizeClass):
-
-2018-10-24 Alexey Proskuryakov <ap@apple.com>
-
- Add BPLATFORM(IOS_FAMILY)
- https://bugs.webkit.org/show_bug.cgi?id=190878
-
- Reviewed by Saam Barati.
-
- * bmalloc/AvailableMemory.cpp:
- (bmalloc::memorySizeAccordingToKernel):
- (bmalloc::computeAvailableMemory):
- * bmalloc/AvailableMemory.h:
- (bmalloc::isUnderMemoryPressure):
- * bmalloc/BPlatform.h:
- * bmalloc/Gigacage.h:
- * bmalloc/Logging.cpp:
- (bmalloc::logVMFailure):
- * bmalloc/VMAllocate.h:
- (bmalloc::vmPageSizePhysical):
- * bmalloc/bmalloc.h:
- * bmalloc/darwin/MemoryStatusSPI.h:
-
-2018-10-12 Ryan Haddad <ryanhaddad@apple.com>
-
- Unreviewed, rolling out r237063.
-
- Caused layout test fast/dom/Window/window-postmessage-clone-
- deep-array.html to fail on macOS and iOS Debug bots.
-
- Reverted changeset:
-
- "[JSC] Remove gcc warnings on mips and armv7"
- https://bugs.webkit.org/show_bug.cgi?id=188598
- https://trac.webkit.org/changeset/237063
-
-2018-10-11 Guillaume Emont <guijemont@igalia.com>
-
- [JSC] Remove gcc warnings on mips and armv7
- https://bugs.webkit.org/show_bug.cgi?id=188598
-
- Reviewed by Mark Lam.
-
- Add bitwise_cast (from WTF) and use it instead of reinterpret_cast in
- a couple places where reinterpret_cast triggers a warning about
- alignment even though we know that alignment is correct.
-
- * bmalloc/Algorithm.h:
- (bmalloc::bitwise_cast): Copied from WTF/wtf/StdLibextras.h
- * bmalloc/IsoDirectoryPageInlines.h:
- (bmalloc::IsoDirectoryPage<Config>::pageFor):
- * bmalloc/IsoPageInlines.h:
- (bmalloc::IsoPage<Config>::startAllocating):
-
-2018-10-03 Dan Bernstein <mitz@apple.com>
-
- bmalloc part of [Xcode] Update some build settings as recommended by Xcode 10
- https://bugs.webkit.org/show_bug.cgi?id=190250
-
- Reviewed by Alex Christensen.
-
- * Configurations/Base.xcconfig: Enabled CLANG_WARN_COMMA, CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS,
- and CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF.
-
- * bmalloc.xcodeproj/project.pbxproj: Let Xcode update LastUpgradeCheck.
-
-2018-09-25 Alex Christensen <achristensen@webkit.org>
-
- Allow for suffixes to com.apple.WebKit.WebContent
- https://bugs.webkit.org/show_bug.cgi?id=189972
-
- Reviewed by Chris Dumez.
-
- * bmalloc/ProcessCheck.mm:
- (bmalloc::gigacageEnabledForProcess):
-
-2018-09-24 Fujii Hironori <Hironori.Fujii@sony.com>
-
- Rename WTF_COMPILER_GCC_OR_CLANG to WTF_COMPILER_GCC_COMPATIBLE
- https://bugs.webkit.org/show_bug.cgi?id=189733
-
- Reviewed by Michael Catanzaro.
-
- * bmalloc/BCompiler.h:
-
-2018-08-27 Keith Rollin <krollin@apple.com>
-
- Unreviewed build fix -- disable LTO for production builds
-
- * Configurations/Base.xcconfig:
-
-2018-08-27 Keith Rollin <krollin@apple.com>
-
- Build system support for LTO
- https://bugs.webkit.org/show_bug.cgi?id=187785
- <rdar://problem/42353132>
-
- Reviewed by Dan Bernstein.
-
- Update Base.xcconfig and DebugRelease.xcconfig to optionally enable
- LTO.
-
- * Configurations/Base.xcconfig:
- * Configurations/DebugRelease.xcconfig:
-
-2018-08-16 Tomas Popela <tpopela@redhat.com>
-
- bmalloc: Coverity scan issues
- https://bugs.webkit.org/show_bug.cgi?id=186763
-
- Reviewed by Saam Barati.
-
- * bmalloc/DebugHeap.h: Initialize the m_pageSize variable.
- * bmalloc/IsoTLS.cpp:
- (bmalloc::IsoTLS::ensureEntries): Check the return value of
- pthread_key_create return().
- * bmalloc/VMAllocate.h:
- (bmalloc::vmPageSize): Correctly check the return value of sysconf().
-
-2018-07-27 Mark Lam <mark.lam@apple.com>
-
- Initialize bmalloc::DebugHeap::m_pageSize for non-Darwin builds.
- https://bugs.webkit.org/show_bug.cgi?id=188132
- <rdar://problem/40401599>
-
- Reviewed by Saam Barati.
-
- * bmalloc/DebugHeap.cpp:
- (bmalloc::DebugHeap::DebugHeap):
-
-2018-07-27 Saam Barati <sbarati@apple.com>
-
- Explicitly handle memlimit_active < 0
- https://bugs.webkit.org/show_bug.cgi?id=188125
-
- Reviewed by Mark Lam.
-
- This may come up during development when someone wants the limit
- to be "infinite".
-
- * bmalloc/AvailableMemory.cpp:
- (bmalloc::jetsamLimit):
-
-2018-07-27 Saam Barati <sbarati@apple.com>
-
- Use SPI to compute the jetsam limit on iOS instead of hardcoding 840MB
- https://bugs.webkit.org/show_bug.cgi?id=188091
- <rdar://problem/42647697>
-
- Reviewed by Simon Fraser.
-
- We want bmalloc to dynamically adapt to the jetsam limit of the process
- it's running in. WTF::ramSize() is based off bmalloc's availableMemory,
- so it will now reflect the result of the real jetsam limit when we can
- read it.
-
- Reading the jetsam limit requires an entitlement, so this patch opts in
- the WebContent/Storage/Network processes. We fall back to 840MB (the
- old hard coded value) when the SPI call fails (e.g, when we're in a
- process without the proper entitlement).
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/AvailableMemory.cpp:
- (bmalloc::jetsamLimit):
- (bmalloc::computeAvailableMemory):
- * bmalloc/darwin/MemoryStatusSPI.h: Added.
-
-2018-07-24 Saam Barati <sbarati@apple.com>
-
- Revert back to using phys_footprint to calculate isUnderMemoryPressure()
- https://bugs.webkit.org/show_bug.cgi?id=187919
- <rdar://problem/42552888>
-
- Reviewed by Simon Fraser.
-
- Currently on iOS, bmalloc will run the scavenger more frequently when it detects
- that the process is under memory pressure. However, it only uses bmalloc's
- own footprint as a percentage of the HW available memory to determine if
- the process is under memory pressure. This is a change I recently made
- in an effort to run the scavenger less when bmalloc wasn't contributing
- to the dirty footprint in the process. However, this fails to run the
- scavenger eagerly when the process in question has a heap split
- between a lot of dirty bmalloc memory as well as a lot of dirty memory
- from elsewhere. We also have evidence that we may have increased jetsams
- in the Web Content process. Since my original change was not a measurable
- speedup, this patch reverts isUnderMemoryPressure() to its previous
- behavior of using phys_footprint to determine if 75% of the available
- HW memory is being used.
-
- * bmalloc/AvailableMemory.cpp:
- (bmalloc::memoryStatus):
-
-2019-07-12 Michael Saboff <msaboff@apple.com>
-
- Disable IsoHeaps when Gigacage is off
- https://bugs.webkit.org/show_bug.cgi?id=187160
-
- Reviewed by Saam Barati.
-
- Relanding change sets 233547 and 233550 with the added fix that Gigacage is also
- enabled for DumpRenderTree.
-
- Updated determineMallocFallbackState to base enabling of Iso Heaps on Gigacage
- being enabled. We do this because if Gigacage is disabled, it may be due to lack
- of address space.
-
- To work around a compiler issue uncovered by the change above, I added explicit
- instantiation of PerThread's static variables. Defined the same explicit
- instantiated static variables with export scope in the new file PerThread.cpp
- to eliminate separate variables allocations in each linked framework / library.
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/IsoTLS.cpp:
- (bmalloc::IsoTLS::determineMallocFallbackState):
- * bmalloc/PerThread.cpp: Added.
- * bmalloc/PerThread.h:
- * bmalloc/ProcessCheck.mm:
- (bmalloc::gigacageEnabledForProcess):
-
-2018-07-09 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r233547 and r233550.
- https://bugs.webkit.org/show_bug.cgi?id=187497
-
- Introduced flakiness for media/fullscreen-* tests on mac-wk1
- (Requested by ryanhaddad on #webkit).
-
- Reverted changesets:
-
- "Disable IsoHeaps when Gigacage is off"
- https://bugs.webkit.org/show_bug.cgi?id=187160
- https://trac.webkit.org/changeset/233547
-
- "Build fix (r233547): Disable IsoHeaps when Gigacage is off"
- https://bugs.webkit.org/show_bug.cgi?id=187160
- https://trac.webkit.org/changeset/233550
-
-2018-07-05 David Kilzer <ddkilzer@apple.com>
-
- Build fix (r233547): Disable IsoHeaps when Gigacage is off
- <https://webkit.org/b/187160>
-
- * bmalloc/PerThread.cpp: Add #if !HAVE_PTHREAD_MACHDEP_H/#endif
- around variables only used when that macro is 0. Include what
- you use: Cache.h and Heap.h.
- * bmalloc/PerThread.h: Include <memory> for std::once_flag.
-
-2018-07-05 Michael Saboff <msaboff@apple.com>
-
- Disable IsoHeaps when Gigacage is off
- https://bugs.webkit.org/show_bug.cgi?id=187160
-
- Reviewed by Saam Barati.
-
- Updated determineMallocFallbackState to base enabling of Iso Heaps on Gigacage
- being enabled. We do this because if Gigacage is disabled, it may be due to lack
- of address space.
-
- To work around a compiler issue uncovered by the change above, I added explicit
- instantiation of PerThread's static variables. Defined the same explicit
- instantiated static variables with export scope in the new file PerThread.cpp
- to eliminate separate variables allocations in each linked framework / library.
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/IsoTLS.cpp:
- (bmalloc::IsoTLS::determineMallocFallbackState):
- * bmalloc/PerThread.cpp: Added.
- * bmalloc/PerThread.h:
-
-2018-07-04 Tim Horton <timothy_horton@apple.com>
-
- Introduce PLATFORM(IOSMAC)
- https://bugs.webkit.org/show_bug.cgi?id=187315
-
- Reviewed by Dan Bernstein.
-
- * Configurations/Base.xcconfig:
-
-2018-06-29 Ryan Haddad <ryanhaddad@apple.com>
-
- Unreviewed, rolling out r233347.
-
- Causes crashes during WK1 tests.
-
- Reverted changeset:
-
- "Disable IsoHeaps when Gigacage is off"
- https://bugs.webkit.org/show_bug.cgi?id=187160
- https://trac.webkit.org/changeset/233347
-
-2018-06-28 Michael Saboff <msaboff@apple.com>
-
- Disable IsoHeaps when Gigacage is off
- https://bugs.webkit.org/show_bug.cgi?id=187160
-
- Reviewed by Saam Barati.
-
- If Gigacage is disabled, it may be due to lack of address space.
- Therefore we should also turn off IsoHeaps since it uses more virtual
- address space as well.
-
- * bmalloc/IsoTLS.cpp:
- (bmalloc::IsoTLS::determineMallocFallbackState):
-
-2018-06-27 Simon Fraser <simon.fraser@apple.com>
-
- https://hackernoon.com/ uses lots of layer backing store
- https://bugs.webkit.org/show_bug.cgi?id=186909
- rdar://problem/40257540
-
- Reviewed by Tim Horton.
-
- Drive-by typo fix.
-
- * bmalloc/Scavenger.cpp:
- (bmalloc::dumpStats):
-
-2018-06-26 Saam Barati <sbarati@apple.com>
-
- Unreviewed followup. Fix the watchos build after r233192.
-
- This patch also correct the changelog entry below to have the correct
- bug and title info.
-
- * bmalloc/ProcessCheck.mm:
-
-2018-06-26 Saam Barati <sbarati@apple.com>
-
- Switch to system malloc on iOS when nano malloc is disabled
- https://bugs.webkit.org/show_bug.cgi?id=186322
- <rdar://problem/41140257>
-
- Reviewed by Keith Miller.
-
- We have evidence showing that processes with small heaps using the
- JS API are more space efficient when using system malloc. Our main
- hypothesis as to why this is, is that when dealing with small heaps,
- one malloc can be more efficient at optimizing memory usage than
- two mallocs.
-
- * bmalloc/BPlatform.h:
- * bmalloc/Environment.cpp:
- (bmalloc::isNanoMallocEnabled):
- (bmalloc::Environment::computeIsDebugHeapEnabled):
- * bmalloc/ProcessCheck.h:
- (bmalloc::shouldProcessUnconditionallyUseBmalloc):
- * bmalloc/ProcessCheck.mm:
- (bmalloc::shouldProcessUnconditionallyUseBmalloc):
-
-2018-06-24 Yusuke Suzuki <utatane.tea@gmail.com>
-
- [bmalloc][Linux] Remove static initializers for PerProcess<>::s_object
- https://bugs.webkit.org/show_bug.cgi?id=186966
-
- Reviewed by Anders Carlsson.
-
- chrome/tools/linux/dump-static-initializers.py can dump static initializers
- in the binary and we found that PerProcess<>::s_object initialization is done
- by static initializers in GCC + Linux environments. The example is the following.
-
- Scavenger.cpp (initializer offset 0x38c210 size 0x3e)
- _GLOBAL__sub_I_Scavenger.cpp+0x1e
- _GLOBAL__sub_I_Scavenger.cpp+0x2d
- _GLOBAL__sub_I_Scavenger.cpp+0x3c
- _GLOBAL__sub_I_Scavenger.cpp+0xf
- guard variable for bmalloc::PerProcess<bmalloc::AllIsoHeaps>::s_object@@Base-0x3f0d8
- guard variable for bmalloc::PerProcess<bmalloc::Environment>::s_object@@Base-0x3f0e8
- guard variable for bmalloc::PerProcess<bmalloc::PerHeapKind<bmalloc::Heap> >::s_object@@Base-0x3c600
- guard variable for bmalloc::PerProcess<bmalloc::Scavenger>::s_object@@Base-0x38ce8
-
- We can remove this by initializing `nullptr`, which leads to constexpr initialization.
- After this change, Linux JSCOnly libJavaScriptCore.so has no static initializers.
-
- * bmalloc/PerProcess.h:
-
-2018-06-09 Dan Bernstein <mitz@apple.com>
-
- [Xcode] Clean up and modernize some build setting definitions
- https://bugs.webkit.org/show_bug.cgi?id=186463
-
- Reviewed by Sam Weinig.
-
- * Configurations/Base.xcconfig: Removed definition for macOS 10.11.
- * Configurations/DebugRelease.xcconfig: Ditto.
-
-2018-06-07 Darin Adler <darin@apple.com>
-
- [Cocoa] Turn on ARC for the single Objective-C++ source file in bmalloc
- https://bugs.webkit.org/show_bug.cgi?id=186398
-
- Reviewed by Saam Barati.
-
- * Configurations/Base.xcconfig: Turn on ARC.
- * bmalloc/ProcessCheck.mm:
- (bmalloc::gigacageEnabledForProcess): Removed the globals from this function,
- since it's only called once. If it was called more than once, we could optimize
- that with a single boolean global rather than two strings and two booleans.
-
-2018-06-07 David Kilzer <ddkilzer@apple.com>
-
- bmalloc: Fix 'noreturn' warnings when compiling with -std=gnu++17
- <https://webkit.org/b/186400>
-
- Reviewed by Saam Barati.
-
- Fixes the following warnings when compiling with gnu++17:
-
- Source/bmalloc/bmalloc/Scavenger.cpp:363:1: error: function 'threadRunLoop' could be declared with attribute 'noreturn' [-Werror,-Wmissing-noreturn]
- {
- ^
- Source/bmalloc/bmalloc/Scavenger.cpp:358:1: error: function 'threadEntryPoint' could be declared with attribute 'noreturn' [-Werror,-Wmissing-noreturn]
- {
- ^
-
- * bmalloc/BCompiler.h:
- (BCOMPILER): Add support for the BCOMPILER() macro, then add
- BCOMPILER(GCC_OR_CLANG). Taken from Source/WTF/wtf/Compiler.h.
- (BNO_RETURN): Implement 'norerturn' support using the new
- BCOMPILER() macros. Taken from Source/WTF/wtf/Compiler.h.
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::threadRunLoop): Remove the workaround that
- tricked older compilers into thinking the while() loop wasn't
- infinite.
- * bmalloc/Scavenger.h:
- (bmalloc::Scavenger::threadEntryPoint): Add BNO_RETURN attribute.
- (bmalloc::Scavenger::threadRunLoop): Ditto.
-
-2018-05-29 Saam Barati <sbarati@apple.com>
-
- JSC should put bmalloc's scavenger into mini mode
- https://bugs.webkit.org/show_bug.cgi?id=185988
-
- Reviewed by Michael Saboff.
-
- We expose an API for putting bmalloc into mini mode. All that means now
- is that we'll run the scavenger more aggressively.
-
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::enableMiniMode):
- (bmalloc::Scavenger::threadRunLoop):
- * bmalloc/Scavenger.h:
- * bmalloc/Sizes.h:
- * bmalloc/bmalloc.cpp:
- (bmalloc::api::enableMiniMode):
- * bmalloc/bmalloc.h:
-
-2018-05-29 Geoffrey Garen <ggaren@apple.com>
-
- Fixed the bmalloc build
- https://bugs.webkit.org/show_bug.cgi?id=186025
-
- Reviewed by Sam Weinig.
-
- * bmalloc.xcodeproj/project.pbxproj: Link Foundation because the
- gigacage check needs it.
-
-2018-05-23 Antti Koivisto <antti@apple.com>
-
- Increase the simulated memory size on PLATFORM(IOS_SIMULATOR) from 512MB to 1024MB
- https://bugs.webkit.org/show_bug.cgi?id=185908
-
- Reviewed by Geoffrey Garen.
-
- We don't support 512MB devices anymore. This will make the simulator behave more
- like a real device.
-
- * bmalloc/AvailableMemory.cpp:
- (bmalloc::memorySizeAccordingToKernel):
-
- Factor to a function.
- Don't use availableMemoryGuess for the simulator value as it is not a guess.
-
- (bmalloc::computeAvailableMemory):
-
- Apply the same adjustments to the simulated value too.
-
-2018-05-22 Ryan Haddad <ryanhaddad@apple.com>
-
- Unreviewed, rolling out r232052.
-
- Breaks internal builds.
-
- Reverted changeset:
-
- "Use more C++17"
- https://bugs.webkit.org/show_bug.cgi?id=185176
- https://trac.webkit.org/changeset/232052
-
-2018-05-22 Yusuke Suzuki <utatane.tea@gmail.com>
-
- Define GIGACAGE_ALLOCATION_CAN_FAIL on Linux
- https://bugs.webkit.org/show_bug.cgi?id=183329
-
- Reviewed by Michael Catanzaro.
-
- We specify `GIGACAGE_ALLOCATION_CAN_FAIL 1` in Linux since
- Linux can fail to `mmap` if `vm.overcommit_memory = 2`.
- Users can enable Gigacage if users enable overcommit_memory.
-
- * bmalloc/Gigacage.h:
-
-2018-05-21 Yusuke Suzuki <utatane.tea@gmail.com>
-
- Use more C++17
- https://bugs.webkit.org/show_bug.cgi?id=185176
-
- Reviewed by JF Bastien.
-
- Add BNO_RETURN.
-
- * Configurations/Base.xcconfig:
- * bmalloc/BCompiler.h:
- * bmalloc/Scavenger.h:
-
-2018-05-06 Yusuke Suzuki <utatane.tea@gmail.com>
-
- [JSC] Remove "using namespace std;" from JSC, bmalloc, WTF
- https://bugs.webkit.org/show_bug.cgi?id=185362
-
- Reviewed by Sam Weinig.
-
- * bmalloc/Allocator.cpp:
- * bmalloc/Deallocator.cpp:
-
-2018-05-03 Filip Pizlo <fpizlo@apple.com>
-
- Strings should not be allocated in a gigacage
- https://bugs.webkit.org/show_bug.cgi?id=185218
-
- Reviewed by Saam Barati.
-
- This removes the string gigacage.
-
- Putting strings in a gigacage prevents read gadgets. The other things that get to be in gigacages
- are there to prevent read-write gadgets.
-
- Also, putting strings in a gigacage seems to have been a bigger regression than putting other
- things in gigacages.
-
- Therefore, to maximize the benefit/cost ratio of gigacages, we should evict strings from them. If
- we want to throw away perf for security, there are more beneficial things to sacrifice.
-
- * bmalloc/Gigacage.h:
- (Gigacage::name):
- (Gigacage::basePtr):
- (Gigacage::size):
- (Gigacage::forEachKind):
- * bmalloc/HeapKind.h:
- (bmalloc::isGigacage):
- (bmalloc::gigacageKind):
- (bmalloc::heapKind):
- (bmalloc::isActiveHeapKindAfterEnsuringGigacage):
- (bmalloc::mapToActiveHeapKindAfterEnsuringGigacage):
-
-2018-04-30 Yusuke Suzuki <utatane.tea@gmail.com>
-
- Use WordLock instead of std::mutex for Threading
- https://bugs.webkit.org/show_bug.cgi?id=185121
-
- Reviewed by Geoffrey Garen.
-
- Add constexpr to explicitly describe that bmalloc::Mutex constructor is constexpr.
-
- * bmalloc/Mutex.h:
-
-2018-04-23 Ting-Wei Lan <lantw44@gmail.com>
-
- Include stdio.h before using stderr
- https://bugs.webkit.org/show_bug.cgi?id=184872
-
- Reviewed by Yusuke Suzuki.
-
- * bmalloc/PerProcess.cpp:
- * bmalloc/Scavenger.cpp:
-
-2018-04-21 Yusuke Suzuki <utatane.tea@gmail.com>
-
- Unreviewed, follow-up patch after r230474
- https://bugs.webkit.org/show_bug.cgi?id=166684
-
- Add "JavaScriptCore" to Darwin name. And use short name "BMScavenger"
- for Linux since adding "JavaScriptCore" makes the name too long for Linux.
-
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::threadRunLoop):
-
-2018-04-18 Jer Noble <jer.noble@apple.com>
-
- Don't put build products into WK_ALTERNATE_WEBKIT_SDK_PATH for engineering builds
- https://bugs.webkit.org/show_bug.cgi?id=184762
-
- Reviewed by Dan Bernstein.
-
- * Configurations/Base.xcconfig:
-
-2018-04-20 Daniel Bates <dabates@apple.com>
-
- Remove code for compilers that did not support NSDMI for aggregates
- https://bugs.webkit.org/show_bug.cgi?id=184599
-
- Reviewed by Per Arne Vollan.
-
- Remove workaround for earlier Visual Studio versions that did not support non-static data
- member initializers (NSDMI) for aggregates. We have since updated all the build.webkit.org
- and EWS bots to a newer version that supports this feature.
-
- * bmalloc/BPlatform.h:
- * bmalloc/List.h:
- (bmalloc::ListNode::ListNode): Deleted.
- (bmalloc::List::iterator::iterator): Deleted.
-
-2018-04-19 David Kilzer <ddkilzer@apple.com>
-
- Enable Objective-C weak references
- <https://webkit.org/b/184789>
- <rdar://problem/39571716>
-
- Reviewed by Dan Bernstein.
-
- * Configurations/Base.xcconfig:
- (CLANG_ENABLE_OBJC_WEAK): Enable.
-
-2018-04-12 Saam Barati <sbarati@apple.com>
-
- Lessen partial scavenge interval on x86-64
- https://bugs.webkit.org/show_bug.cgi?id=184577
-
- Rubber-stamped by Filip Pizlo.
-
- I initially made the scavenge interval longer because I had thought the
- shorter interval caused a JetStream regression. I was mistaken though.
- I was looking at the wrong commit range when analyzing perf data.
-
- This patch shortens the interval, but still keeps x86-64 50% longer than
- other architectures. We know that scavenging frequently on Mac is less
- important to overall system performance than it is on iOS.
-
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::threadRunLoop):
-
-2018-04-12 Saam Barati <sbarati@apple.com>
-
- Raise the partial scavenge interval even more on x86-64
- https://bugs.webkit.org/show_bug.cgi?id=184551
-
- Rubber-stamped by Filip Pizlo.
-
- The JetStream regression didn't recover from my previous patch.
- This is another attempt to get it to recover perf.
-
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::threadRunLoop):
-
-2018-04-11 Saam Barati <sbarati@apple.com>
-
- raise partial scavenge interval on x86-64
- https://bugs.webkit.org/show_bug.cgi?id=184521
-
- Rubber-stamped by Filip Pizlo.
-
- This patch is an attempt to recover the 1-3% JetStream regression
- my initial partial scavenging patch introduced on some Macs.
-
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::threadRunLoop):
-
-2018-04-10 Saam Barati <sbarati@apple.com>
-
- IsoHeapImpl::scavenge* needs to grab the lock
- https://bugs.webkit.org/show_bug.cgi?id=184461
-
- Reviewed by Filip Pizlo.
-
- Another thread could be modifying the linked list that the scavenge* methods traverse.
-
- * bmalloc/IsoHeapImplInlines.h:
- (bmalloc::IsoHeapImpl<Config>::scavenge):
- (bmalloc::IsoHeapImpl<Config>::scavengeToHighWatermark):
-
-2018-04-10 Saam Barati <sbarati@apple.com>
-
- bmalloc should do partial scavenges more frequently
- https://bugs.webkit.org/show_bug.cgi?id=184176
-
- Reviewed by Filip Pizlo.
-
- This patch adds the ability for bmalloc to do a partial scavenge.
- bmalloc will now do a partial scavenge with some frequency even
- when the heap is growing.
-
- For Heap, this means tracking the high water mark of where the Heap
- has allocated since the last scavenge. Partial scavenging is just
- decommitting entries in the LargeMap that are past this high water
- mark. Because we allocate in first fit order out of LargeMap, tracking
- the high water mark is a good heuristic of how much memory a partial
- scavenge should decommit.
-
- For IsoHeaps, each IsoDirectory also keeps track of its high water mark
- for the furthest page it allocates into. Similar to Heap, we scavenge pages
- past that high water mark. IsoHeapImpl then tracks the high water mark
- for the IsoDirectory it allocates into. We then scavenge all directories
- including and past the directory high water mark. This includes scavenging
- the inline directory when its the only thing we allocate out of since
- the last scavenge.
-
- This patch also adds some other capabilities to bmalloc:
-
- Heaps and IsoHeaps now track how much memory is freeable. Querying
- this number is now cheap.
-
- Heaps no longer hold the global lock when decommitting large ranges.
- Instead, that range is just marked as non eligible to be allocated.
- Then, without the lock held, the scavenger will decommit those ranges.
- Once this is done, the scavenger will then reacquire the lock and mark
- these ranges as eligible. This lessens lock contention between the
- scavenger and the allocation slow path since threads that are taking an
- allocation slow path can now allocate concurrently to the scavenger's
- decommits. The main consideration in adding this functionality is that
- a large allocation may fail while the scavenger is in the process of
- decommitting memory. When the Heap fails to allocate a large range when
- the scavenger is in the middle of a decommit, Heap will wait for the
- Scavenger to finish and then it will try to allocate a large range again.
-
- Decommitting from Heap now aggregates the ranges to decommit and tries to
- merge them together to lower the number of calls to vmDeallocatePhysicalPages.
- This is analogous to what IsoHeaps already do.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::tryAllocate):
- (bmalloc::Allocator::allocateImpl):
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::refillAllocatorSlowCase):
- (bmalloc::Allocator::allocateLarge):
- * bmalloc/BulkDecommit.h: Added.
- (bmalloc::BulkDecommit::addEager):
- (bmalloc::BulkDecommit::addLazy):
- (bmalloc::BulkDecommit::processEager):
- (bmalloc::BulkDecommit::processLazy):
- (bmalloc::BulkDecommit::add):
- (bmalloc::BulkDecommit::process):
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::scavenge):
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSlowCase):
- * bmalloc/Deallocator.h:
- (bmalloc::Deallocator::lineCache):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::freeableMemory):
- (bmalloc::Heap::markAllLargeAsEligibile):
- (bmalloc::Heap::decommitLargeRange):
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::scavengeToHighWatermark):
- (bmalloc::Heap::deallocateLineCache):
- (bmalloc::Heap::allocateSmallChunk):
- (bmalloc::Heap::deallocateSmallChunk):
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::allocateSmallBumpRangesByMetadata):
- (bmalloc::Heap::allocateSmallBumpRangesByObject):
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::isLarge):
- (bmalloc::Heap::largeSize):
- (bmalloc::Heap::shrinkLarge):
- (bmalloc::Heap::deallocateLarge):
- (bmalloc::Heap::externalCommit):
- (bmalloc::Heap::externalDecommit):
- * bmalloc/Heap.h:
- (bmalloc::Heap::allocateSmallBumpRanges):
- (bmalloc::Heap::derefSmallLine):
- * bmalloc/IsoDirectory.h:
- * bmalloc/IsoDirectoryInlines.h:
- (bmalloc::passedNumPages>::takeFirstEligible):
- (bmalloc::passedNumPages>::didBecome):
- (bmalloc::passedNumPages>::didDecommit):
- (bmalloc::passedNumPages>::scavengePage):
- (bmalloc::passedNumPages>::scavenge):
- (bmalloc::passedNumPages>::scavengeToHighWatermark):
- (bmalloc::passedNumPages>::freeableMemory): Deleted.
- * bmalloc/IsoHeapImpl.h:
- * bmalloc/IsoHeapImplInlines.h:
- (bmalloc::IsoHeapImpl<Config>::takeFirstEligible):
- (bmalloc::IsoHeapImpl<Config>::scavenge):
- (bmalloc::IsoHeapImpl<Config>::scavengeToHighWatermark):
- (bmalloc::IsoHeapImpl<Config>::freeableMemory):
- (bmalloc::IsoHeapImpl<Config>::isNowFreeable):
- (bmalloc::IsoHeapImpl<Config>::isNoLongerFreeable):
- * bmalloc/LargeMap.cpp:
- (bmalloc::LargeMap::remove):
- (bmalloc::LargeMap::markAllAsEligibile):
- * bmalloc/LargeMap.h:
- (bmalloc::LargeMap::size):
- (bmalloc::LargeMap::at):
- * bmalloc/LargeRange.h:
- (bmalloc::LargeRange::setEligible):
- (bmalloc::LargeRange::isEligibile const):
- (bmalloc::canMerge):
- * bmalloc/ObjectType.cpp:
- (bmalloc::objectType):
- * bmalloc/Scavenger.cpp:
- (bmalloc::PrintTime::PrintTime):
- (bmalloc::PrintTime::~PrintTime):
- (bmalloc::PrintTime::print):
- (bmalloc::Scavenger::timeSinceLastFullScavenge):
- (bmalloc::Scavenger::timeSinceLastPartialScavenge):
- (bmalloc::Scavenger::scavenge):
- (bmalloc::Scavenger::partialScavenge):
- (bmalloc::Scavenger::freeableMemory):
- (bmalloc::Scavenger::threadRunLoop):
- * bmalloc/Scavenger.h:
- * bmalloc/SmallLine.h:
- (bmalloc::SmallLine::refCount):
- (bmalloc::SmallLine::ref):
- (bmalloc::SmallLine::deref):
- * bmalloc/SmallPage.h:
- (bmalloc::SmallPage::refCount):
- (bmalloc::SmallPage::hasFreeLines const):
- (bmalloc::SmallPage::setHasFreeLines):
- (bmalloc::SmallPage::ref):
- (bmalloc::SmallPage::deref):
- * bmalloc/bmalloc.cpp:
- (bmalloc::api::tryLargeZeroedMemalignVirtual):
- (bmalloc::api::freeLargeVirtual):
-
-2018-04-09 Yusuke Suzuki <utatane.tea@gmail.com>
-
- [bmalloc] Name Scavenger thread "bmalloc scavenger"
- https://bugs.webkit.org/show_bug.cgi?id=166684
-
- Reviewed by Saam Barati.
-
- We name the thread for bmalloc Scavenger "bmalloc scavenger".
- It is useful for debugging. In Linux environment, it will be
- shown in GDB.
-
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::threadRunLoop):
- (bmalloc::Scavenger::setName):
- * bmalloc/Scavenger.h:
-
-2018-04-09 Michael Catanzaro <mcatanzaro@igalia.com>
-
- Rename UNUSED to BUNUSED
- https://bugs.webkit.org/show_bug.cgi?id=184093
-
- Reviewed by Yusuke Suzuki.
-
- * bmalloc/BAssert.h:
- * bmalloc/VMAllocate.h:
- (bmalloc::vmValidate):
- (bmalloc::vmValidatePhysical):
-
-2018-04-08 Yusuke Suzuki <utatane.tea@gmail.com>
-
- Use alignas instead of compiler-specific attributes
- https://bugs.webkit.org/show_bug.cgi?id=183508
-
- Reviewed by Mark Lam.
-
- Use alignas for g_gigacageBasePtr. We also add reinterpret_cast to fix
- compile errors in ARMv7 and MIPS JSCOnly ports.
-
- * bmalloc/Gigacage.cpp:
- * bmalloc/Gigacage.h:
- (Gigacage::basePtrs):
-
-2018-04-06 Saam Barati <sbarati@apple.com>
-
- bmalloc virtual allocation API should not treat memory it vends as dirty with respect to how it drives the scavenger
- https://bugs.webkit.org/show_bug.cgi?id=184342
-
- Reviewed by Mark Lam.
-
- Currently, the only user of this API is Wasm. Ideally, Wasm would tell
- us exactly which page is dirtied. We should really do that at some point:
- https://bugs.webkit.org/show_bug.cgi?id=184207
-
- However, until we do that, it's better to treat none of the virtual memory
- we vend as dirty, versus what we do now, which is treat it all as dirty.
- This dirty memory tracking helps drive the scavenger, so on iOS, having the
- scavenger think its under memory pressure because of memory it can't free isn't
- useful.
-
- * bmalloc/bmalloc.cpp:
- (bmalloc::api::tryLargeZeroedMemalignVirtual):
- (bmalloc::api::freeLargeVirtual):
- * bmalloc/bmalloc.h:
-
-2018-04-05 Saam Barati <sbarati@apple.com>
-
- IsoHeapImpl not IsoHeapImplBase should add itself to AllIsoHeaps
- https://bugs.webkit.org/show_bug.cgi?id=184174
-
- Reviewed by Filip Pizlo.
-
- Otherwise, another thread may see a non-fully formed IsoHeapImpl.
-
- * bmalloc/IsoHeapImpl.cpp:
- (bmalloc::IsoHeapImplBase::IsoHeapImplBase):
- (bmalloc::IsoHeapImplBase::addToAllIsoHeaps):
- * bmalloc/IsoHeapImpl.h:
- * bmalloc/IsoHeapImplInlines.h:
- (bmalloc::IsoHeapImpl<Config>::IsoHeapImpl):
-
-2018-04-05 Yusuke Suzuki <utatane.tea@gmail.com>
-
- bmalloc StaticMutex's constructor should be constexpr
- https://bugs.webkit.org/show_bug.cgi?id=180600
-
- Reviewed by Mark Lam.
-
- StaticMutex and Mutex can be unified. This patch changes std::atomic_flag in StaticMutex
- to std::atomic<bool> to add constexpr constructor to StaticMutex. Then, StaticMutex can
- be initialized in static storage without calling any static initializers.
- And we also rename StaticMutex to Mutex simply.
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/AllIsoHeaps.cpp:
- (bmalloc::AllIsoHeaps::AllIsoHeaps):
- * bmalloc/AllIsoHeaps.h:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::tryAllocate):
- (bmalloc::Allocator::allocateImpl):
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::refillAllocatorSlowCase):
- (bmalloc::Allocator::allocateLarge):
- * bmalloc/CryptoRandom.cpp:
- (bmalloc::ARC4RandomNumberGenerator::ARC4RandomNumberGenerator):
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::scavenge):
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSlowCase):
- * bmalloc/Deallocator.h:
- (bmalloc::Deallocator::lineCache):
- * bmalloc/DebugHeap.cpp:
- (bmalloc::DebugHeap::DebugHeap):
- * bmalloc/DebugHeap.h:
- * bmalloc/Environment.cpp:
- (bmalloc::Environment::Environment):
- * bmalloc/Environment.h:
- * bmalloc/Gigacage.cpp:
- (Gigacage::disablePrimitiveGigacage):
- (Gigacage::addPrimitiveDisableCallback):
- (Gigacage::removePrimitiveDisableCallback):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::freeableMemory):
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::deallocateLineCache):
- (bmalloc::Heap::allocateSmallChunk):
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::allocateSmallBumpRangesByMetadata):
- (bmalloc::Heap::allocateSmallBumpRangesByObject):
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::isLarge):
- (bmalloc::Heap::largeSize):
- (bmalloc::Heap::shrinkLarge):
- (bmalloc::Heap::deallocateLarge):
- (bmalloc::Heap::externalCommit):
- (bmalloc::Heap::externalDecommit):
- * bmalloc/Heap.h:
- (bmalloc::Heap::mutex):
- (bmalloc::Heap::allocateSmallBumpRanges):
- (bmalloc::Heap::derefSmallLine):
- * bmalloc/IsoDeallocator.h:
- * bmalloc/IsoHeap.h:
- * bmalloc/IsoTLSDeallocatorEntry.h:
- * bmalloc/IsoTLSDeallocatorEntryInlines.h:
- (bmalloc::IsoTLSDeallocatorEntry<Config>::IsoTLSDeallocatorEntry):
- * bmalloc/IsoTLSInlines.h:
- (bmalloc::IsoTLS::ensureHeap):
- * bmalloc/IsoTLSLayout.cpp:
- (bmalloc::IsoTLSLayout::IsoTLSLayout):
- (bmalloc::IsoTLSLayout::add):
- * bmalloc/IsoTLSLayout.h:
- * bmalloc/Mutex.cpp: Renamed from Source/bmalloc/bmalloc/StaticMutex.cpp.
- (bmalloc::Mutex::lockSlowCase):
- * bmalloc/Mutex.h:
- (bmalloc::sleep):
- (bmalloc::waitUntilFalse):
- (bmalloc::Mutex::try_lock):
- (bmalloc::Mutex::lock):
- (bmalloc::Mutex::unlock):
- (bmalloc::Mutex::Mutex): Deleted.
- * bmalloc/ObjectType.cpp:
- (bmalloc::objectType):
- * bmalloc/PerProcess.cpp:
- (bmalloc::getPerProcessData):
- * bmalloc/PerProcess.h:
- (bmalloc::PerProcess::mutex):
- (bmalloc::PerProcess::getSlowCase):
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::Scavenger):
- (bmalloc::Scavenger::scavenge):
- (bmalloc::Scavenger::freeableMemory):
- * bmalloc/Scavenger.h:
- * bmalloc/SmallLine.h:
- (bmalloc::SmallLine::refCount):
- (bmalloc::SmallLine::ref):
- (bmalloc::SmallLine::deref):
- * bmalloc/SmallPage.h:
- (bmalloc::SmallPage::refCount):
- (bmalloc::SmallPage::hasFreeLines const):
- (bmalloc::SmallPage::setHasFreeLines):
- (bmalloc::SmallPage::ref):
- (bmalloc::SmallPage::deref):
- * bmalloc/StaticMutex.h: Removed.
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::VMHeap):
- * bmalloc/VMHeap.h:
- * bmalloc/Zone.cpp:
- (bmalloc::Zone::Zone):
- * bmalloc/Zone.h:
- * bmalloc/bmalloc.cpp:
- (bmalloc::api::tryLargeZeroedMemalignVirtual):
- (bmalloc::api::freeLargeVirtual):
- (bmalloc::api::isEnabled):
- (bmalloc::api::setScavengerThreadQOSClass):
- * bmalloc/bmalloc.h:
-
-2018-04-04 Konstantin Tokarev <annulen@yandex.ru>
-
- Enable Gigacage unconditionally when building JSCOnly on macOS (build fix)
- https://bugs.webkit.org/show_bug.cgi?id=184301
-
- Reviewed by Yusuke Suzuki.
-
- bmalloc/ProcessCheck.mm implements specific behavior for Mac and iOS ports,
- which is guarded with BPLATFORM(COCOA). if we don't enable BPLATFORM(MAC)
- or BPLATFORM(IOS) in JSCOnly, then BPLATFORM(COCOA) won't be defined
- as well, and code path from ProcessCheck.mm will not be taken.
-
- * CMakeLists.txt: Exclude ProcessCheck.mm from port-independent file
- list.
- * PlatformMac.cmake: Build ProcessCheck.mm for Mac port.
- * bmalloc/BPlatform.h: Don't enable BPLATFORM(MAC) or BPLATFORM(IOS)
- when building JSCOnly port.
-
-2018-04-03 Saam Barati <sbarati@apple.com>
-
- totalPhysicalSize calculation when splitting a range must account for double rounding effects
- https://bugs.webkit.org/show_bug.cgi?id=184275
-
- Reviewed by Mark Lam.
-
- The rounding error could happen when we split a range where the
- range's total physical size equals the range's total size. The
- rounding may cause the left size to lose a byte, and the right
- size to gain a byte. This caused the right side to be a byte
- large than its size.
-
- * bmalloc/LargeRange.h:
- (bmalloc::LargeRange::LargeRange):
- (bmalloc::LargeRange::split const):
-
-2018-04-02 Saam Barati <sbarati@apple.com>
-
- bmalloc should compute its own estimate of its footprint
- https://bugs.webkit.org/show_bug.cgi?id=184121
-
- Reviewed by Filip Pizlo.
-
- This patch makes it so that bmalloc keeps track of its own physical
- footprint.
-
- Doing this for IsoHeaps is trivial. It allocates/deallocates fixed
- page sizes at a time. IsoHeapImpl just updates a count every time
- a page is committed/decommitted.
-
- Making Heap keep its footprint was a bit trickier because of how
- LargeRange is constructed. Before this patch, LargeRange kept track
- of the amount of physical memory at the start of its range. This
- patch extends large range to also keep track of the total physical memory
- in the range just for footprint bookkeeping. This was needed to make
- Heap's footprint come close to resembling reality, because as we merge and split
- large ranges, the start physical size often becomes wildly inaccurate.
- The total physical size number stored in LargeRange is still just an
- estimate. It's possible that as ranges are split, that the total physical
- size split amongst the two ranges doesn't resemble reality. This can
- happen when the total physical size is really all in one end of the split,
- but we mark it as being proportionally split amongst the resulting two
- ranges. In practice, I did not notice this being a problem. The footprint
- estimate tracks reality very closely (in my testing, within less than 1MB for
- heaps with sizes upwards of 1GB). The other nice thing about total physical
- size is that even if it diverges from reality in terms of how memory is
- using up physical RAM, it stays internally consistent inside bmalloc's
- own data structures.
-
- The main oversight of this patch is how it deals with Wasm memory. All Wasm
- memory will be viewed by bmalloc as taking up physical space even when it
- may not be. Wasm memory starts off as taking up purely virtual pages. When a
- page is first accessed, only then will the OS page it in and cause it to use
- physical RAM. I opened a bug to come up with a solution to this problem:
- https://bugs.webkit.org/show_bug.cgi?id=184207
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/AvailableMemory.cpp:
- (bmalloc::memoryStatus):
- * bmalloc/BPlatform.h:
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::freeableMemory):
- (bmalloc::Heap::footprint):
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::deallocateSmallChunk):
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::shrinkLarge):
- (bmalloc::Heap::deallocateLarge):
- (bmalloc::Heap::externalCommit):
- (bmalloc::Heap::externalDecommit):
- * bmalloc/Heap.h:
- * bmalloc/IsoDirectory.h:
- * bmalloc/IsoDirectoryInlines.h:
- (bmalloc::passedNumPages>::takeFirstEligible):
- (bmalloc::passedNumPages>::didDecommit):
- (bmalloc::passedNumPages>::freeableMemory):
- * bmalloc/IsoHeapImpl.h:
- * bmalloc/IsoHeapImplInlines.h:
- (bmalloc::IsoHeapImpl<Config>::freeableMemory):
- (bmalloc::IsoHeapImpl<Config>::footprint):
- (bmalloc::IsoHeapImpl<Config>::didCommit):
- (bmalloc::IsoHeapImpl<Config>::didDecommit):
- * bmalloc/LargeRange.h:
- (bmalloc::LargeRange::LargeRange):
- (bmalloc::LargeRange::startPhysicalSize const):
- (bmalloc::LargeRange::setStartPhysicalSize):
- (bmalloc::LargeRange::totalPhysicalSize const):
- (bmalloc::LargeRange::setTotalPhysicalSize):
- (bmalloc::merge):
- (bmalloc::LargeRange::split const):
- (bmalloc::LargeRange::physicalSize const): Deleted.
- (bmalloc::LargeRange::setPhysicalSize): Deleted.
- * bmalloc/PhysicalPageMap.h: Added.
- This class is added for debugging purposes. It's useful when hacking
- on the code that calculates the footprint to use this map as a sanity
- check. It's just a simple implementation that has a set of all the committed pages.
-
- (bmalloc::PhysicalPageMap::commit):
- (bmalloc::PhysicalPageMap::decommit):
- (bmalloc::PhysicalPageMap::footprint):
- (bmalloc::PhysicalPageMap::forEachPhysicalPage):
- * bmalloc/Scavenger.cpp:
- (bmalloc::dumpStats):
- (bmalloc::Scavenger::scavenge):
- (bmalloc::Scavenger::freeableMemory):
- This is here just for debugging for now. But we should implement an
- efficient version of this to use when driving when to run the
- scavenger.
-
- (bmalloc::Scavenger::footprint):
- (bmalloc::Scavenger::threadRunLoop):
- * bmalloc/Scavenger.h:
- * bmalloc/VMAllocate.h:
- (bmalloc::physicalPageSizeSloppy):
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::tryAllocateLargeChunk):
- * bmalloc/bmalloc.cpp:
- (bmalloc::api::commitAlignedPhysical):
- (bmalloc::api::decommitAlignedPhysical):
- * bmalloc/bmalloc.h:
-
-2018-03-28 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r230005.
- https://bugs.webkit.org/show_bug.cgi?id=184115
-
- "it caused a huge regression on iOS" (Requested by saamyjoon
- on #webkit).
-
- Reverted changeset:
-
- "memoryStatus() is wrong in certain testing scenarios on iOS"
- https://bugs.webkit.org/show_bug.cgi?id=184050
- https://trac.webkit.org/changeset/230005
-
-2018-03-27 Saam Barati <sbarati@apple.com>
-
- memoryStatus() is wrong in certain testing scenarios on iOS
- https://bugs.webkit.org/show_bug.cgi?id=184050
- <rdar://problem/37959258>
-
- Rubber-stamped by Mark Lam.
-
- This switches us from using "phys_footprint" to using "internal + compressed"
- when computing the dirty memory in the current process. There are iOS testing
- scenarios where phys_footprint doesn't give us a reliable answer. In my testing,
- "internal + compressed" tracks phys_footprint closely (when phys_footprint is
- working). They're usually within much less than 1% of each other. We're making
- this change to ensure testing in our iOS infrastructure is valid.
-
- I opened a bug to move back to phys_footprint when it's feasible:
- https://bugs.webkit.org/show_bug.cgi?id=184050
-
- * bmalloc/AvailableMemory.cpp:
- (bmalloc::memoryStatus):
-
-2018-03-20 Tim Horton <timothy_horton@apple.com>
-
- Add and adopt WK_PLATFORM_NAME and adjust default feature defines
- https://bugs.webkit.org/show_bug.cgi?id=183758
- <rdar://problem/38017644>
-
- Reviewed by Dan Bernstein.
-
- * Configurations/Base.xcconfig:
-
-2018-03-16 Filip Pizlo <fpizlo@apple.com>
-
- Put the DOM in IsoHeaps
- https://bugs.webkit.org/show_bug.cgi?id=183546
-
- Reviewed by Simon Fraser.
-
- Make it easy to runtime-disable IsoHeaps.
-
- * bmalloc/Allocator.h:
- * bmalloc/IsoTLS.cpp:
- (bmalloc::IsoTLS::determineMallocFallbackState):
- * bmalloc/IsoTLS.h:
- * bmalloc/IsoTLSInlines.h:
- (bmalloc::IsoTLS::allocateSlow):
- (bmalloc::IsoTLS::deallocateSlow):
-
-2018-03-16 Michael Catanzaro <mcatanzaro@igalia.com>
-
- Improve error message when Gigacage cannot allocate virtual memory
- https://bugs.webkit.org/show_bug.cgi?id=183329
-
- Reviewed by Filip Pizlo.
-
- We've discovered that Deja Dup monitor sets a virtual memory limit, breaking Gigacage. Since
- it runs in the background on a fresh out-of-the-box install of Ubuntu, this is not good.
- That will have to be fixed by Deja Dup, but there is concern that other applications might
- try this, or that users will set a virtual memory limit for the entire desktop session. Of
- particular concern is the possibility that users might have copypasted a ulimit line into
- a session startup script without understanding it. Let's try to make it slightly easier to
- understand what's going wrong.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
-
-2018-03-13 Tim Horton <timothy_horton@apple.com>
-
- Add and adopt WK_ALTERNATE_FRAMEWORKS_DIR in WTF and bmalloc
- https://bugs.webkit.org/show_bug.cgi?id=183576
- <rdar://problem/38396766>
-
- Reviewed by Dan Bernstein.
-
- * Configurations/Base.xcconfig:
- * Configurations/bmalloc.xcconfig:
- * Configurations/mbmalloc.xcconfig:
-
-2018-03-10 Filip Pizlo <fpizlo@apple.com>
-
- PerProcess<> should be safe by default
- https://bugs.webkit.org/show_bug.cgi?id=183545
-
- Reviewed by Yusuke Suzuki.
-
- This makes PerProcess<> safe by default, so we don't need SafePerProcess<>.
-
- The new PerProcess<> design relies on a hash-consing mechanism for PerProcess<> storage based
- on the __PRETTY_FUNCTION__ from inside PerProcess<>, which captures the instantiated type in
- the string. Therefore, this can be used to runtime-coalesce PerProcess<> instances based on
- type.
-
- I expect this to be perf-neutral. It's an important prerequisite to more bmalloc work, since I
- don't want to have more PerProcess<> vs SafePerProcess<> bugs, and SafePerProcess<> can't be
- used for everything (I don't see how to use it for isoheaps).
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- * bmalloc/IsoDirectoryInlines.h:
- (bmalloc::passedNumPages>::takeFirstEligible):
- (bmalloc::passedNumPages>::didBecome):
- * bmalloc/PerProcess.cpp: Added.
- (bmalloc::stringHash):
- (bmalloc::allocate):
- (bmalloc::getPerProcessData):
- * bmalloc/PerProcess.h:
- (bmalloc::PerProcess::mutex):
- (bmalloc::PerProcess::coalesce):
- (bmalloc::PerProcess::getSlowCase):
- (): Deleted.
- * bmalloc/Scavenger.cpp:
- * bmalloc/Scavenger.h:
- * bmalloc/bmalloc.cpp:
- (bmalloc::api::scavenge):
- (bmalloc::api::setScavengerThreadQOSClass):
-
-2018-03-10 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r229436.
- https://bugs.webkit.org/show_bug.cgi?id=183542
-
- seems to have regressed wasm compile times by 10% (Requested
- by pizlo-mbp on #webkit).
-
- Reverted changeset:
-
- "bmalloc mutex should be adaptive"
- https://bugs.webkit.org/show_bug.cgi?id=177839
- https://trac.webkit.org/changeset/229436
-
-2018-03-08 Filip Pizlo <fpizlo@apple.com>
-
- bmalloc mutex should be adaptive
- https://bugs.webkit.org/show_bug.cgi?id=177839
-
- Reviewed by Michael Saboff.
-
- This pulls the WordLock algorithm into bmalloc, mostly by copy-pasting the code. We need to
- copy paste because sometimes we build WTF without bmalloc, so WTF cannot rely on bmalloc for
- anything other than malloc.
-
- Reland after failing to reproduce the WasmBench crash that caused it to get rolled out. Maybe that fixed
- itself somehow?
-
- * bmalloc/Algorithm.h:
- (bmalloc::compareExchangeWeak):
- (bmalloc::compareExchangeStrong):
- * bmalloc/PerThread.h:
- * bmalloc/StaticMutex.cpp:
- (bmalloc::StaticMutex::lockSlow):
- (bmalloc::StaticMutex::unlockSlow):
- (bmalloc::StaticMutex::lockSlowCase): Deleted.
- * bmalloc/StaticMutex.h:
- (bmalloc::StaticMutex::try_lock):
- (bmalloc::StaticMutex::isLocked const):
- (bmalloc::StaticMutex::init):
- (bmalloc::StaticMutex::tryLock):
- (bmalloc::StaticMutex::lock):
- (bmalloc::StaticMutex::unlock):
- (bmalloc::sleep): Deleted.
- (bmalloc::waitUntilFalse): Deleted.
-
-2018-02-16 Filip Pizlo <fpizlo@apple.com>
-
- Unreviewed, roll out r228306 (custom memcpy/memset) because the bots say that it was not a
- progression.
-
- * bmalloc/Algorithm.h:
- (bmalloc::fastCopy): Deleted.
- (bmalloc::fastZeroFill): Deleted.
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate):
- * bmalloc/Bits.h:
- (bmalloc::BitsWordOwner::operator=):
- (bmalloc::BitsWordOwner::clearAll):
- (bmalloc::BitsWordOwner::set):
- * bmalloc/IsoPageInlines.h:
- (bmalloc::IsoPage<Config>::IsoPage):
- * bmalloc/Vector.h:
- (bmalloc::Vector<T>::reallocateBuffer):
-
-2018-02-09 Carlos Alberto Lopez Perez <clopez@igalia.com>
-
- Improve of string.h include after r228317.
- https://bugs.webkit.org/show_bug.cgi?id=182642
-
- Reviewed by Mark Lam.
-
- * bmalloc/Algorithm.h: Avoid an architecture-specific #include.
-
-2018-02-09 Carlos Alberto Lopez Perez <clopez@igalia.com>
-
- Fix build for !BCPU(X86_64) after r228306
- https://bugs.webkit.org/show_bug.cgi?id=182563
-
- Unreviewed build fix.
-
- * bmalloc/Algorithm.h:
-
-2018-02-08 Filip Pizlo <fpizlo@apple.com>
-
- Experiment with alternative implementation of memcpy/memset
- https://bugs.webkit.org/show_bug.cgi?id=182563
-
- Reviewed by Michael Saboff and Mark Lam.
-
- Add a faster x86_64-specific implementation of memcpy and memset. Ideally, this would just be
- implemented in WTF, but we have to copy it into bmalloc since bmalloc sits below WTF on the
- stack.
-
- * bmalloc/Algorithm.h:
- (bmalloc::fastCopy):
- (bmalloc::fastZeroFill):
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate):
- * bmalloc/Bits.h:
- (bmalloc::BitsWordOwner::operator=):
- (bmalloc::BitsWordOwner::clearAll):
- (bmalloc::BitsWordOwner::set):
- * bmalloc/IsoPageInlines.h:
- (bmalloc::IsoPage<Config>::IsoPage):
- * bmalloc/Vector.h:
- (bmalloc::Vector<T>::reallocateBuffer):
-
-2018-02-05 JF Bastien <jfbastien@apple.com>
-
- Gigacage: enable only for WebContent process and token executables
- https://bugs.webkit.org/show_bug.cgi?id=182457
- <rdar://problem/35875011>
-
- Reviewed by Keith Miller.
-
- Gigacage is a solid security improvement, but it's probably best
- to roll it out incrementally to the most valuable targets first
- and progressively try out more and more over time rather than
- outright enabling it everywhere. We've gotten some reports that it
- has some side-effects that weren't expected, so for now let's
- enable it for the WebContent process, JSC, and other executables
- we know, and then later we'll enable more gigacage uses.
-
- For now I've chosen the following bundles:
-
- - com.apple.WebKit.WebContent.Development
- - com.apple.WebKit.WebContent
- - com.apple.WebProcess
-
- And the following processes:
-
- - jsc
- - wasm
- - anything starting with "test", to match the JSC tests
-
- I tried a different approach first, where I add a function to turn
- gigacage on or off and crash if gigacage is initialized without
- having been told what to do. Doing this in ChildProcess and a
- bunch of the process initialization methods isn't sufficient. I
- got MiniBrowser working, but some other builds use static globals
- which themselves use hash and string which are allocate with
- bmalloc and therefore which initialize gigacage before main is
- called and before the process gets a chance to opt in our out. It
- gets tricky with API calls too, because we have to do the right
- thing in any entry an API user could plausibly use, even the
- private ones, so I endend up having to initialize gigacage in e.g.
- WebPreferencesExperimentalFeatures.cpp.erb.
-
- Another approach could be to create a free-for-all gigacage
- entitlement, and opt-in the processes we want..
-
- As a follow-up we can also check that gigacage allocation always
- succeeds if it was allowed for that process. With my change I
- expect it to always succeed.
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/BPlatform.h:
- * bmalloc/Gigacage.cpp:
- (Gigacage::shouldBeEnabled):
- * bmalloc/ProcessCheck.h: Added.
- (bmalloc::gigacageEnabledForProcess):
- * bmalloc/ProcessCheck.mm: Added.
- (bmalloc::gigacageEnabledForProcess):
-
-2018-02-05 Joseph Pecoraro <pecoraro@apple.com>
-
- Multiple bmalloc scavenger threads is unexpected
- https://bugs.webkit.org/show_bug.cgi?id=182474
- <rdar://problem/37175526>
-
- Reviewed by Filip Pizlo.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- * bmalloc/IsoDirectoryInlines.h:
- (bmalloc::passedNumPages>::takeFirstEligible):
- (bmalloc::passedNumPages>::didBecome):
- * bmalloc/bmalloc.cpp:
- (bmalloc::api::scavenge):
- (bmalloc::api::setScavengerThreadQOSClass):
- Switch to SafePerProcess for Scavenger to ensure one instance
- for the entire process.
-
- * bmalloc/PerProcess.h:
- (bmalloc::PerProcess::get):
- (bmalloc::PerProcess::getFastCase):
- (bmalloc::PerProcess::getSlowCase):
- (bmalloc::SafePerProcess::get):
- (bmalloc::SafePerProcess::getFastCase):
- (bmalloc::SafePerProcess::getSlowCase):
- Duplicate the class with a version that can ensure
- single instances by requiring exporting symbols that
- can be created with macros.
-
- * bmalloc/Scavenger.cpp:
- * bmalloc/Scavenger.h:
- Export symbols to ensure all images get the same instance.
-
-2018-01-31 Saam Barati <sbarati@apple.com>
-
- Replace tryLargeMemalignVirtual with tryLargeZeroedMemalignVirtual and use it to allocate large zeroed memory in Wasm
- https://bugs.webkit.org/show_bug.cgi?id=182064
- <rdar://problem/36840132>
-
- Reviewed by Geoffrey Garen.
-
- This patch replaces the tryLargeMemalignVirtual API with tryLargeZeroedMemalignVirtual.
- By doing that, we're able to remove the AllocationKind enum. To zero the memory,
- tryLargeZeroedMemalignVirtual uses mmap(... MAP_ANON ...) over previously mmapped
- memory. This both purges the any resident memory for the virtual range and ensures
- that the pages in the range are zeroed. Most OSs should implement this by taking a
- page fault and zero filling on first access. Therefore, this API is returning pages
- that will result in page faults on first access. Hence, the name 'virtual' in the API.
- This API differs from the old API in that users of it need not call madvise themselves.
- The memory is ready to go.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/AllocationKind.h: Removed.
- * bmalloc/DebugHeap.cpp:
- (bmalloc::DebugHeap::memalignLarge):
- (bmalloc::DebugHeap::freeLarge):
- * bmalloc/DebugHeap.h:
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::shrinkLarge):
- (bmalloc::Heap::deallocateLarge):
- * bmalloc/Heap.h:
- * bmalloc/IsoPage.cpp:
- (bmalloc::IsoPageBase::allocatePageMemory):
- * bmalloc/VMAllocate.h:
- (bmalloc::vmZeroAndPurge):
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::tryAllocateLargeChunk):
- * bmalloc/VMHeap.h:
- * bmalloc/bmalloc.cpp:
- (bmalloc::api::tryLargeZeroedMemalignVirtual):
- (bmalloc::api::freeLargeVirtual):
- (bmalloc::api::tryLargeMemalignVirtual): Deleted.
- * bmalloc/bmalloc.h:
-
-2018-01-19 Keith Miller <keith_miller@apple.com>
-
- HaveInternalSDK includes should be "#include?"
- https://bugs.webkit.org/show_bug.cgi?id=179670
-
- Reviewed by Dan Bernstein.
-
- * Configurations/Base.xcconfig:
-
-2018-01-18 Dan Bernstein <mitz@apple.com>
-
- [Xcode] Streamline and future-proof target-macOS-version-dependent build setting definitions
- https://bugs.webkit.org/show_bug.cgi?id=181803
-
- Reviewed by Tim Horton.
-
- * Configurations/Base.xcconfig: Updated.
- * Configurations/DebugRelease.xcconfig: Ditto.
-
-2018-01-16 Michael Catanzaro <mcatanzaro@igalia.com>
-
- mbmalloc should only be built in developer mode
- https://bugs.webkit.org/show_bug.cgi?id=181654
-
- Reviewed by Carlos Garcia Campos.
-
- * CMakeLists.txt:
-
-2018-01-15 Michael Catanzaro <mcatanzaro@igalia.com>
-
- Improve use of ExportMacros
- https://bugs.webkit.org/show_bug.cgi?id=181652
-
- Reviewed by Konstantin Tokarev.
-
- Disable BEXPORT on Linux ports.
-
- * bmalloc/BExport.h: Check for BUSE(EXPORT_MACROS).
- * bmalloc/BPlatform.h: Add BUSE(EXPORT_MACROS) and define it on macOS and iOS.
-
-2017-12-20 Ting-Wei Lan <lantw44@gmail.com>
-
- Include stdio.h before using stderr and _IONBF
- https://bugs.webkit.org/show_bug.cgi?id=181046
-
- Reviewed by Alex Christensen.
-
- * bmalloc/IsoTLS.cpp:
-
-2017-12-14 David Kilzer <ddkilzer@apple.com>
-
- Enable -Wstrict-prototypes for WebKit
- <https://webkit.org/b/180757>
- <rdar://problem/36024132>
-
- Rubber-stamped by Joseph Pecoraro.
-
- * Configurations/Base.xcconfig:
- (CLANG_WARN_STRICT_PROTOTYPES): Add. Set to YES.
-
-2017-12-14 Saam Barati <sbarati@apple.com>
-
- logVMFailure should not simulate crash on iOS
- https://bugs.webkit.org/show_bug.cgi?id=180790
-
- Reviewed by JF Bastien.
-
- The Gigacage allocation on iOS is expected to fail in certain circumstances.
- Let's not simulate a crash on failure because since this is expected behavior.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::tryVMAllocate):
-
-2017-12-11 Tim Horton <timothy_horton@apple.com>
-
- Stop using deprecated target conditional for simulator builds
- https://bugs.webkit.org/show_bug.cgi?id=180662
- <rdar://problem/35136156>
-
- Reviewed by Simon Fraser.
-
- * bmalloc/BPlatform.h:
-
-2017-12-08 Saam Barati <sbarati@apple.com>
-
- Enable gigacage on iOS with a 32GB runway and ensure it doesn't break WasmBench
- https://bugs.webkit.org/show_bug.cgi?id=178557
-
- Reviewed by Mark Lam.
-
- * bmalloc/Algorithm.h:
- (bmalloc::isPowerOfTwo):
- * bmalloc/Gigacage.cpp:
- * bmalloc/Gigacage.h:
-
-2017-12-05 Andy Estes <aestes@apple.com>
-
- [Darwin] Simplify use of TargetConditionals
- https://bugs.webkit.org/show_bug.cgi?id=180455
- <rdar://problem/35142971>
-
- Reviewed by Tim Horton.
-
- There's no need to check if TARGET_* macros are defined on Darwin platforms, since
- TargetConditionals.h always defines them. Also, we can simplify
- (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) to TARGET_OS_IPHONE.
-
- * bmalloc/BPlatform.h:
-
-2017-12-05 Filip Pizlo <fpizlo@apple.com>
-
- bmalloc IsoHeap needs to allow a thread to deallocate some size for the first time
- https://bugs.webkit.org/show_bug.cgi?id=180443
-
- Reviewed by Saam Barati.
-
- It's true that we can expect a heap to already be initialized if we try to deallocate in it. But it
- may not have its deallocator initialized on this thread yet.
-
- This is easily fixed by adding a null check on the deallocate path. That's probably not going to
- change perf at all. But doing that allows me to get rid of a lot of weird stuff I previously did to
- avoid that null check, like creating a dummy TLS in the DebugHeap case.
-
- * bmalloc/IsoTLS.cpp:
- (bmalloc::IsoTLS::debugFree):
- (bmalloc::IsoTLS::deallocateSlow): Deleted.
- * bmalloc/IsoTLS.h:
- * bmalloc/IsoTLSInlines.h:
- (bmalloc::IsoTLS::allocateImpl):
- (bmalloc::IsoTLS::allocateSlow):
- (bmalloc::IsoTLS::deallocateImpl):
- (bmalloc::IsoTLS::deallocateSlow):
- (bmalloc::IsoTLS::ensureHeapAndEntries):
-
-2017-12-01 Michael Saboff <msaboff@apple.com>
-
- Gigacage should not be enabled for ARM64_32
- https://bugs.webkit.org/show_bug.cgi?id=180265
-
- Reviewed by Saam Barati.
-
- Disabled Gigacage for ARM64_32.
- In the process, restructured Gigacage::shouldBeEnabled() with GIGACAGE_ENABLED set
- to 0 to avoid a dead code compiler warning.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::shouldBeEnabled):
- * bmalloc/Gigacage.h:
-
-2017-11-29 JF Bastien <jfbastien@apple.com>
-
- WTF / bmalloc: don't write to 0xbbadbeef when ASAN is looking
- https://bugs.webkit.org/show_bug.cgi?id=180175
-
- Reviewed by Mark Lam.
-
- ASAN knows that 0xbbadbeef is a bbad aaddress, and tells us so
- when we write to it, say in an assert. That creates bbad error
- reports where ASAN thinks we write to an invalid address, instead
- of thinking that we hit an assertion. In some cases, tooling that
- use fuzzers aggregate similar issues, and think that we just have
- the one bug and not a bunch of different asserts.
-
- At the same time, bmalloc's version of CRASH just writes to
- 0xbbadbeef and assumes that's invalid and will crash, which isn't
- necessarily true on non-Mac platforms. WTF's version then makes
- sure there's a crash, so bmalloc should do the same.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/BAssert.h:
- * bmalloc/BCompiler.h: Added.
- * bmalloc/BPlatform.h:
-
-2017-11-27 Filip Pizlo <fpizlo@apple.com>
-
- Don't crash in forEachEntry when DebugHeap is enabled.
-
- Unreviewed, fixing crashes on leaks bots by removing an assertion.
-
- * bmalloc/IsoTLS.cpp:
- (bmalloc::IsoTLS::forEachEntry):
- * test/testbmalloc.cpp: Make this test work with DebugHeap so I can catch this kind of problem in the future.
-
-2017-11-16 Filip Pizlo <fpizlo@apple.com>
-
- Isolated Heaps caused an increase in reported leaks on the bots
- https://bugs.webkit.org/show_bug.cgi?id=179463
-
- Reviewed by Darin Adler.
-
- This fixes the way isoheaps interact with system tools:
-
- - Opts into the VMHeap API so that the leaks tool can find isoheap memory.
-
- - Opts into the DebugHeap/Environment APIs so that we turn off isoheap allocation if memory
- debugging options are in use.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/DebugHeap.h:
- * bmalloc/IsoHeap.h:
- * bmalloc/IsoPage.cpp: Added.
- (bmalloc::IsoPageBase::allocatePageMemory):
- * bmalloc/IsoPage.h:
- * bmalloc/IsoPageInlines.h:
- (bmalloc::IsoPage<Config>::tryCreate):
- * bmalloc/IsoTLS.cpp:
- (bmalloc::IsoTLS::deallocateSlow):
- (bmalloc::IsoTLS::ensureEntries):
- (bmalloc::IsoTLS::isUsingDebugHeap):
- (bmalloc::IsoTLS::debugMalloc):
- * bmalloc/IsoTLS.h:
- * bmalloc/IsoTLSInlines.h:
- (bmalloc::IsoTLS::allocate):
- (bmalloc::IsoTLS::deallocate):
- (bmalloc::IsoTLS::allocateImpl):
- (bmalloc::IsoTLS::allocateFast):
- (bmalloc::IsoTLS::allocateSlow):
- (bmalloc::IsoTLS::deallocateImpl):
- (bmalloc::IsoTLS::deallocateFast):
- (bmalloc::IsoTLS::ensureHeapAndEntries):
- (bmalloc::IsoTLS::allocator): Deleted.
- (bmalloc::IsoTLS::deallocator): Deleted.
- * bmalloc/bmalloc.cpp:
- (bmalloc::api::tryLargeMemalignVirtual):
- (bmalloc::api::freeLargeVirtual):
- (bmalloc::api::scavenge):
- (bmalloc::api::isEnabled):
- (bmalloc::api::setScavengerThreadQOSClass):
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryLargeMemalignVirtual): Deleted.
- (bmalloc::api::freeLargeVirtual): Deleted.
- (bmalloc::api::scavenge): Deleted.
- (bmalloc::api::isEnabled): Deleted.
- (bmalloc::api::setScavengerThreadQOSClass): Deleted.
-
-2017-11-14 Saam Barati <sbarati@apple.com>
-
- Make the gigacage runway 32GB
- https://bugs.webkit.org/show_bug.cgi?id=175062
-
- Reviewed by Mark Lam.
-
- Making the gigacage runway 32GB defends us against buffer overflows in the
- cage reaching memory outside the cage assuming indices are 32-bit unsigned
- integers and the type they're indexing into has size <= 8 bytes. This is
- exactly the case for many things in JSC. For example, butterfly access in
- JSC meet this criteria, as does typed array access.
-
- The 32GB comes from 8 * 2^32 = 32GB.
-
- * bmalloc/Gigacage.cpp:
-
-2017-11-08 Michael Catanzaro <mcatanzaro@igalia.com>
-
- Gigacage.cpp:44:46: warning: ‘*’ in boolean context, suggest ‘&&’ instead [-Wint-in-bool-context]
- https://bugs.webkit.org/show_bug.cgi?id=179427
-
- Reviewed by Saam Barati.
-
- Tweak the conditional to suppress the warning.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
-
-2017-11-07 Saam Barati <sbarati@apple.com>
-
- We should PROT_NONE the Gigacage runway so OOB accesses crash
- https://bugs.webkit.org/show_bug.cgi?id=179392
-
- Reviewed by Mark Lam.
-
- If we assume that an attacker will exploit JSC and cause OOB accesses,
- we should make OOB accesses in the Gigacage runway crash.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
-
-2017-10-31 Filip Pizlo <fpizlo@apple.com>
-
- bmalloc should support strictly type-segregated isolated heaps
- https://bugs.webkit.org/show_bug.cgi?id=178108
-
- Reviewed by Saam Barati, Simon Fraser, and Ryosuke Niwa.
-
- This introduces a new allocation API in bmalloc called IsoHeap. An IsoHeap is templatized by
- type and created in static storage. When unused, it takes only a few words. When you do use
- it, each IsoHeap gets a bag of virtual pages unique to it. This prevents use-after-free bugs
- in one IsoHeap from affecting any other memory. At worst, two pointers of the same type will
- point to the same object even though they should not have.
-
- IsoHeaps allocate using a first-fit discipline that combines ideas from bmalloc and Riptide
- (the JSC GC):
-
- Like Riptide, it uses a bump'n'pop allocator. What Riptide calls blocks, IsoHeaps calls
- pages. Pages are collected into directories. Directories track pages using bitvectors, so
- that it's easy to quickly find a completely free page or one that has at least one free
- object. I think that the bump'n'pop allocator is as fast as the bmalloc Immix-style (page and
- line) allocator, but is better at allocating in holes. It's guaranteed to follow a first-fit
- discipline. However, the real reason why I wrote it that was is that this is what I'm more
- familiar with. This is a part of the design I want to revisit (bug 179278).
-
- Like bmalloc, it uses a deallocation log. This means that the internal IsoHeap data
- structures can be locked with a coarse-grained lock, since the deallocator only grabs it when
- flushing the log. Similarly, the allocator only grabs it when refilling the bump'n'pop
- FreeList.
-
- This adds a unit test for IsoHeaps. In this change, IsoHeaps are adopted only by WebCore's
- RenderObject.
-
- Note that despite the use of GC concepts, it's not a goal to make this code directly sharable
- with GC. The GC will probably have to do isolated heaps its own way (likely a special
- Subspace or something like that).
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Algorithm.h:
- (bmalloc::findBitInWord):
- * bmalloc/AllIsoHeaps.cpp: Added.
- (bmalloc::AllIsoHeaps::AllIsoHeaps):
- (bmalloc::AllIsoHeaps::add):
- (bmalloc::AllIsoHeaps::head):
- * bmalloc/AllIsoHeaps.h: Added.
- * bmalloc/AllIsoHeapsInlines.h: Added.
- (bmalloc::AllIsoHeaps::forEach):
- * bmalloc/BMalloced.h: Added.
- * bmalloc/Bits.h: Added.
- (bmalloc::bitsArrayLength):
- (bmalloc::BitsWordView::BitsWordView):
- (bmalloc::BitsWordView::numBits const):
- (bmalloc::BitsWordView::word const):
- (bmalloc::BitsWordOwner::BitsWordOwner):
- (bmalloc::BitsWordOwner::view const):
- (bmalloc::BitsWordOwner::operator=):
- (bmalloc::BitsWordOwner::setAll):
- (bmalloc::BitsWordOwner::clearAll):
- (bmalloc::BitsWordOwner::set):
- (bmalloc::BitsWordOwner::numBits const):
- (bmalloc::BitsWordOwner::arrayLength const):
- (bmalloc::BitsWordOwner::word const):
- (bmalloc::BitsWordOwner::word):
- (bmalloc::BitsWordOwner::words const):
- (bmalloc::BitsWordOwner::words):
- (bmalloc::BitsAndWords::BitsAndWords):
- (bmalloc::BitsAndWords::view const):
- (bmalloc::BitsAndWords::numBits const):
- (bmalloc::BitsAndWords::word const):
- (bmalloc::BitsOrWords::BitsOrWords):
- (bmalloc::BitsOrWords::view const):
- (bmalloc::BitsOrWords::numBits const):
- (bmalloc::BitsOrWords::word const):
- (bmalloc::BitsNotWords::BitsNotWords):
- (bmalloc::BitsNotWords::view const):
- (bmalloc::BitsNotWords::numBits const):
- (bmalloc::BitsNotWords::word const):
- (bmalloc::BitsImpl::BitsImpl):
- (bmalloc::BitsImpl::numBits const):
- (bmalloc::BitsImpl::size const):
- (bmalloc::BitsImpl::arrayLength const):
- (bmalloc::BitsImpl::operator== const):
- (bmalloc::BitsImpl::operator!= const):
- (bmalloc::BitsImpl::at const):
- (bmalloc::BitsImpl::operator[] const):
- (bmalloc::BitsImpl::isEmpty const):
- (bmalloc::BitsImpl::operator& const):
- (bmalloc::BitsImpl::operator| const):
- (bmalloc::BitsImpl::operator~ const):
- (bmalloc::BitsImpl::forEachSetBit const):
- (bmalloc::BitsImpl::forEachClearBit const):
- (bmalloc::BitsImpl::forEachBit const):
- (bmalloc::BitsImpl::findBit const):
- (bmalloc::BitsImpl::findSetBit const):
- (bmalloc::BitsImpl::findClearBit const):
- (bmalloc::BitsImpl::wordView const):
- (bmalloc::BitsImpl::atImpl const):
- (bmalloc::Bits::Bits):
- (bmalloc::Bits::operator=):
- (bmalloc::Bits::resize):
- (bmalloc::Bits::setAll):
- (bmalloc::Bits::clearAll):
- (bmalloc::Bits::setAndCheck):
- (bmalloc::Bits::operator|=):
- (bmalloc::Bits::operator&=):
- (bmalloc::Bits::at const):
- (bmalloc::Bits::operator[] const):
- (bmalloc::Bits::BitReference::BitReference):
- (bmalloc::Bits::BitReference::operator bool const):
- (bmalloc::Bits::BitReference::operator=):
- (bmalloc::Bits::at):
- (bmalloc::Bits::operator[]):
- * bmalloc/CryptoRandom.cpp: Replaced with Source/bmalloc/bmalloc/CryptoRandom.cpp.
- (bmalloc::cryptoRandom):
- * bmalloc/CryptoRandom.h: Replaced with Source/bmalloc/bmalloc/CryptoRandom.h.
- * bmalloc/DeferredDecommit.h: Added.
- * bmalloc/DeferredDecommitInlines.h: Added.
- (bmalloc::DeferredDecommit::DeferredDecommit):
- * bmalloc/DeferredTrigger.h: Added.
- (bmalloc::DeferredTrigger::DeferredTrigger):
- * bmalloc/DeferredTriggerInlines.h: Added.
- (bmalloc::DeferredTrigger<trigger>::didBecome):
- (bmalloc::DeferredTrigger<trigger>::handleDeferral):
- * bmalloc/EligibilityResult.h: Added.
- (bmalloc::EligibilityResult::EligibilityResult):
- * bmalloc/EligibilityResultInlines.h: Added.
- (bmalloc::EligibilityResult<Config>::EligibilityResult):
- * bmalloc/FixedVector.h:
- * bmalloc/FreeList.cpp: Added.
- (bmalloc::FreeList::FreeList):
- (bmalloc::FreeList::~FreeList):
- (bmalloc::FreeList::clear):
- (bmalloc::FreeList::initializeList):
- (bmalloc::FreeList::initializeBump):
- (bmalloc::FreeList::contains const):
- * bmalloc/FreeList.h: Added.
- (bmalloc::FreeCell::scramble):
- (bmalloc::FreeCell::descramble):
- (bmalloc::FreeCell::setNext):
- (bmalloc::FreeCell::next const):
- (bmalloc::FreeList::allocationWillFail const):
- (bmalloc::FreeList::allocationWillSucceed const):
- (bmalloc::FreeList::originalSize const):
- (bmalloc::FreeList::head const):
- * bmalloc/FreeListInlines.h: Added.
- (bmalloc::FreeList::allocate):
- (bmalloc::FreeList::forEach const):
- * bmalloc/IsoAllocator.h: Added.
- * bmalloc/IsoAllocatorInlines.h: Added.
- (bmalloc::IsoAllocator<Config>::IsoAllocator):
- (bmalloc::IsoAllocator<Config>::~IsoAllocator):
- (bmalloc::IsoAllocator<Config>::allocate):
- (bmalloc::IsoAllocator<Config>::allocateSlow):
- (bmalloc::IsoAllocator<Config>::scavenge):
- * bmalloc/IsoConfig.h: Added.
- * bmalloc/IsoDeallocator.h: Added.
- * bmalloc/IsoDeallocatorInlines.h: Added.
- (bmalloc::IsoDeallocator<Config>::IsoDeallocator):
- (bmalloc::IsoDeallocator<Config>::~IsoDeallocator):
- (bmalloc::IsoDeallocator<Config>::deallocate):
- (bmalloc::IsoDeallocator<Config>::scavenge):
- * bmalloc/IsoDirectory.h: Added.
- (bmalloc::IsoDirectoryBaseBase::IsoDirectoryBaseBase):
- (bmalloc::IsoDirectoryBaseBase::~IsoDirectoryBaseBase):
- (bmalloc::IsoDirectoryBase::heap):
- * bmalloc/IsoDirectoryInlines.h: Added.
- (bmalloc::IsoDirectoryBase<Config>::IsoDirectoryBase):
- (bmalloc::passedNumPages>::IsoDirectory):
- (bmalloc::passedNumPages>::takeFirstEligible):
- (bmalloc::passedNumPages>::didBecome):
- (bmalloc::passedNumPages>::didDecommit):
- (bmalloc::passedNumPages>::scavenge):
- (bmalloc::passedNumPages>::forEachCommittedPage):
- * bmalloc/IsoDirectoryPage.h: Added.
- (bmalloc::IsoDirectoryPage::index const):
- * bmalloc/IsoDirectoryPageInlines.h: Added.
- (bmalloc::IsoDirectoryPage<Config>::IsoDirectoryPage):
- (bmalloc::IsoDirectoryPage<Config>::pageFor):
- * bmalloc/IsoHeap.h: Added.
- (bmalloc::api::IsoHeap::allocatorOffset):
- (bmalloc::api::IsoHeap::setAllocatorOffset):
- (bmalloc::api::IsoHeap::deallocatorOffset):
- (bmalloc::api::IsoHeap::setDeallocatorOffset):
- * bmalloc/IsoHeapImpl.cpp: Added.
- (bmalloc::IsoHeapImplBase::IsoHeapImplBase):
- (bmalloc::IsoHeapImplBase::~IsoHeapImplBase):
- (bmalloc::IsoHeapImplBase::scavengeNow):
- (bmalloc::IsoHeapImplBase::finishScavenging):
- * bmalloc/IsoHeapImpl.h: Added.
- * bmalloc/IsoHeapImplInlines.h: Added.
- (bmalloc::IsoHeapImpl<Config>::IsoHeapImpl):
- (bmalloc::IsoHeapImpl<Config>::takeFirstEligible):
- (bmalloc::IsoHeapImpl<Config>::didBecomeEligible):
- (bmalloc::IsoHeapImpl<Config>::scavenge):
- (bmalloc::IsoHeapImpl<Config>::allocatorOffset):
- (bmalloc::IsoHeapImpl<Config>::deallocatorOffset):
- (bmalloc::IsoHeapImpl<Config>::numLiveObjects):
- (bmalloc::IsoHeapImpl<Config>::numCommittedPages):
- (bmalloc::IsoHeapImpl<Config>::forEachDirectory):
- (bmalloc::IsoHeapImpl<Config>::forEachCommittedPage):
- (bmalloc::IsoHeapImpl<Config>::forEachLiveObject):
- * bmalloc/IsoHeapInlines.h: Added.
- (bmalloc::api::IsoHeap<Type>::allocate):
- (bmalloc::api::IsoHeap<Type>::tryAllocate):
- (bmalloc::api::IsoHeap<Type>::deallocate):
- (bmalloc::api::IsoHeap<Type>::scavenge):
- (bmalloc::api::IsoHeap<Type>::isInitialized):
- (bmalloc::api::IsoHeap<Type>::impl):
- * bmalloc/IsoPage.h: Added.
- (bmalloc::IsoPage::index const):
- (bmalloc::IsoPage::directory):
- (bmalloc::IsoPage::isInUseForAllocation const):
- (bmalloc::IsoPage::indexOfFirstObject):
- * bmalloc/IsoPageInlines.h: Added.
- (bmalloc::IsoPage<Config>::tryCreate):
- (bmalloc::IsoPage<Config>::IsoPage):
- (bmalloc::IsoPage<Config>::free):
- (bmalloc::IsoPage<Config>::startAllocating):
- (bmalloc::IsoPage<Config>::stopAllocating):
- (bmalloc::IsoPage<Config>::forEachLiveObject):
- * bmalloc/IsoPageTrigger.h: Added.
- * bmalloc/IsoTLS.cpp: Added.
- (bmalloc::IsoTLS::scavenge):
- (bmalloc::IsoTLS::IsoTLS):
- (bmalloc::IsoTLS::ensureEntries):
- (bmalloc::IsoTLS::destructor):
- (bmalloc::IsoTLS::sizeForCapacity):
- (bmalloc::IsoTLS::capacityForSize):
- (bmalloc::IsoTLS::size):
- (bmalloc::IsoTLS::forEachEntry):
- * bmalloc/IsoTLS.h: Added.
- * bmalloc/IsoTLSAllocatorEntry.h: Added.
- * bmalloc/IsoTLSAllocatorEntryInlines.h: Added.
- (bmalloc::IsoTLSAllocatorEntry<Config>::IsoTLSAllocatorEntry):
- (bmalloc::IsoTLSAllocatorEntry<Config>::~IsoTLSAllocatorEntry):
- (bmalloc::IsoTLSAllocatorEntry<Config>::construct):
- * bmalloc/IsoTLSDeallocatorEntry.h: Added.
- * bmalloc/IsoTLSDeallocatorEntryInlines.h: Added.
- (bmalloc::IsoTLSDeallocatorEntry<Config>::IsoTLSDeallocatorEntry):
- (bmalloc::IsoTLSDeallocatorEntry<Config>::~IsoTLSDeallocatorEntry):
- (bmalloc::IsoTLSDeallocatorEntry<Config>::construct):
- * bmalloc/IsoTLSEntry.cpp: Added.
- (bmalloc::IsoTLSEntry::IsoTLSEntry):
- (bmalloc::IsoTLSEntry::~IsoTLSEntry):
- * bmalloc/IsoTLSEntry.h: Added.
- (bmalloc::IsoTLSEntry::offset const):
- (bmalloc::IsoTLSEntry::alignment const):
- (bmalloc::IsoTLSEntry::size const):
- (bmalloc::IsoTLSEntry::extent const):
- * bmalloc/IsoTLSEntryInlines.h: Added.
- (bmalloc::IsoTLSEntry::walkUpToInclusive):
- (bmalloc::DefaultIsoTLSEntry<EntryType>::DefaultIsoTLSEntry):
- (bmalloc::DefaultIsoTLSEntry<EntryType>::~DefaultIsoTLSEntry):
- (bmalloc::DefaultIsoTLSEntry<EntryType>::move):
- (bmalloc::DefaultIsoTLSEntry<EntryType>::destruct):
- (bmalloc::DefaultIsoTLSEntry<EntryType>::scavenge):
- * bmalloc/IsoTLSInlines.h: Added.
- (bmalloc::IsoTLS::allocate):
- (bmalloc::IsoTLS::deallocate):
- (bmalloc::IsoTLS::scavenge):
- (bmalloc::IsoTLS::allocator):
- (bmalloc::IsoTLS::deallocator):
- (bmalloc::IsoTLS::get):
- (bmalloc::IsoTLS::set):
- (bmalloc::IsoTLS::ensureHeap):
- (bmalloc::IsoTLS::ensureHeapAndEntries):
- * bmalloc/IsoTLSLayout.cpp: Added.
- (bmalloc::IsoTLSLayout::IsoTLSLayout):
- (bmalloc::IsoTLSLayout::add):
- * bmalloc/IsoTLSLayout.h: Added.
- (bmalloc::IsoTLSLayout::head const):
- * bmalloc/PerHeapKind.h:
- * bmalloc/PerProcess.h:
- (bmalloc::PerProcess<T>::getFastCase):
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::scavenge):
- * bmalloc/Scavenger.h:
- * bmalloc/bmalloc.h:
- (bmalloc::api::scavengeThisThread):
- * test: Added.
- * test/testbmalloc.cpp: Added.
- (hiddenTruthBecauseNoReturnIsStupid):
- (usage):
- (assertEmptyPointerSet):
- (assertHasObjects):
- (assertHasOnlyObjects):
- (assertClean):
- (testIsoSimple):
- (testIsoSimpleScavengeBeforeDealloc):
- (testIsoFlipFlopFragmentedPages):
- (testIsoFlipFlopFragmentedPagesScavengeInMiddle):
- (BisoMalloced::BisoMalloced):
- (testBisoMalloced):
- (BisoMallocedInline::BisoMallocedInline):
- (testBisoMallocedInline):
- (run):
- (main):
-
-2017-10-30 Zan Dobersek <zdobersek@igalia.com>
-
- [ARM64][Linux] Re-enable Gigacage
- https://bugs.webkit.org/show_bug.cgi?id=178130
-
- Reviewed by Michael Catanzaro.
-
- * bmalloc/Gigacage.h: Re-enable Gigacage on ARM64 Linux.
-
-2017-10-25 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r222945.
- https://bugs.webkit.org/show_bug.cgi?id=178818
-
- "It made WasmBench crash" (Requested by saamyjoon on #webkit).
-
- Reverted changeset:
-
- "bmalloc mutex should be adaptive"
- https://bugs.webkit.org/show_bug.cgi?id=177839
- https://trac.webkit.org/changeset/222945
-
-2017-10-24 Zan Dobersek <zdobersek@igalia.com>
-
- [Linux] Enable Gigacage in x64 Linux environment
- https://bugs.webkit.org/show_bug.cgi?id=177745
- <rdar://problem/34773148>
-
- Reviewed by Yusuke Suzuki.
-
- Re-enable Gigacage on x86_64 Linux platforms after it was disabled in 223877.
-
- The cause for the revert was problems with huge coredumps being generated
- while Gigacage was enabled. The feature virtually allocates about 80GB of
- memory at the beginning of the process lifetime. This is not a problem in
- itself since the memory range is marked as not needed through madvise(),
- but all this memory was still included upon core dump generation on Linux.
- Since there are reasonable limits enforced upon core dumps, these were
- being truncated every time, not yielding any useful information.
-
- To avoid this, on Linux, invocations of madvise() with the MADV_NORMAL and
- MADV_DONTNEED advice parameters should be accompanied with respectively
- matching MADV_DODUMP and MADV_DONTDUMP madvise() calls. This correctly
- avoids core-dumping any memory that's not yet been physically allocated.
-
- * bmalloc/Gigacage.h:
- * bmalloc/VMAllocate.h:
- (bmalloc::vmDeallocatePhysicalPages):
- (bmalloc::vmAllocatePhysicalPages):
-
-2017-10-24 David Kilzer <ddkilzer@apple.com>
-
- Need to pass non-nil argument to SimulateCrash() in bmalloc::logVMFailure()
- <https://webkit.org/b/178740>
- <rdar://problem/35154943>
-
- Reviewed by Saam Barati.
-
- * bmalloc/BPlatform.h:
- (BUNUSED_PARAM): Define macro.
- * bmalloc/Logging.cpp:
- (SimulateCrash): Change third argument of SimulateCrash() to
- CFStringRef since it's an NSString * in Objective-C.
- (bmalloc::logVMFailure): Create a CFStringRef to use as a
- description string. Use new vmSize parameter to log size.
- * bmalloc/Logging.h:
- (bmalloc::logVMFailure): Update function signature to take a
- size_t parameter representing vmSize.
- * bmalloc/VMAllocate.h:
- (bmalloc::tryVMAllocate): Pass vmSize into logVMFailure().
-
-2017-10-23 Michael Catanzaro <mcatanzaro@igalia.com>
-
- Unreviewed, roll out r222731
- https://bugs.webkit.org/show_bug.cgi?id=177745
- <rdar://problem/34773148>
-
- Unfortunately Gigacage has broken core dump generation.
-
- * bmalloc/Gigacage.h:
-
-2017-10-23 Zan Dobersek <zdobersek@igalia.com>
-
- bmalloc::api::tryLargeMemalignVirtual() shouldn't assert on a failed allocation
- https://bugs.webkit.org/show_bug.cgi?id=178654
-
- Reviewed by Geoffrey Garen.
-
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryLargeMemalignVirtual): Call Heap::tryAllocateLarge()
- instead of Heap::allocateLarge(). The former will return a null pointer
- upon a failed allocation, allowing the caller to fail gracefully just as
- the API entrypoint implies, while the latter currently provokes a crash
- in these circumstances.
-
-2017-10-19 Saam Barati <sbarati@apple.com>
-
- Runtime disable gigacage on iOS because it broke WasmBench
- https://bugs.webkit.org/show_bug.cgi?id=178556
-
- Reviewed by Keith Miller.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::shouldBeEnabled):
-
-2017-10-17 Filip Pizlo <fpizlo@apple.com>
-
- You can't vmDeallocate null
- <rdar://problem/35038926>
-
- Reviewed by Michael Saboff.
-
- After failing allocation, we would try to deallocate the thing we failed to allocate. The fix is to
- not try to deallocate something that is obviously null.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
-
-2017-09-29 Filip Pizlo <fpizlo@apple.com>
-
- Enable gigacage on iOS
- https://bugs.webkit.org/show_bug.cgi?id=177586
-
- Reviewed by JF Bastien.
-
- Introduce the ability to disable gigacage at runtime if allocation fails. If any step of gigacage
- allocation fails, we free all of the gigacages and turn off gigacage support.
-
- Roll this back in after discussion.
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::scavenge):
- * bmalloc/Cache.h:
- (bmalloc::Cache::tryAllocate):
- (bmalloc::Cache::allocate):
- (bmalloc::Cache::deallocate):
- (bmalloc::Cache::reallocate):
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
- (Gigacage::runway):
- (Gigacage::totalSize):
- (Gigacage::shouldBeEnabled):
- (): Deleted.
- (Gigacage::Callback::Callback): Deleted.
- (Gigacage::Callback::function): Deleted.
- (Gigacage::PrimitiveDisableCallbacks::PrimitiveDisableCallbacks): Deleted.
- * bmalloc/Gigacage.h:
- (Gigacage::wasEnabled):
- (Gigacage::isEnabled):
- (Gigacage::runway): Deleted.
- (Gigacage::totalSize): Deleted.
- * bmalloc/HeapKind.cpp: Added.
- (bmalloc::isActiveHeapKind):
- (bmalloc::mapToActiveHeapKind):
- * bmalloc/HeapKind.h:
- (bmalloc::isActiveHeapKindAfterEnsuringGigacage):
- (bmalloc::mapToActiveHeapKindAfterEnsuringGigacage):
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::scavenge):
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryLargeMemalignVirtual):
- (bmalloc::api::freeLargeVirtual):
- (bmalloc::api::isEnabled):
-
-2017-10-11 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r223113 and r223121.
- https://bugs.webkit.org/show_bug.cgi?id=178182
-
- Reintroduced 20% regression on Kraken (Requested by rniwa on
- #webkit).
-
- Reverted changesets:
-
- "Enable gigacage on iOS"
- https://bugs.webkit.org/show_bug.cgi?id=177586
- https://trac.webkit.org/changeset/223113
-
- "Use one virtual allocation for all gigacages and their
- runways"
- https://bugs.webkit.org/show_bug.cgi?id=178050
- https://trac.webkit.org/changeset/223121
-
-2017-10-07 Filip Pizlo <fpizlo@apple.com>
-
- Use one virtual allocation for all gigacages and their runways
- https://bugs.webkit.org/show_bug.cgi?id=178050
-
- Reviewed by Saam Barati.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
- (Gigacage::runway): Deleted.
- (Gigacage::totalSize): Deleted.
- * bmalloc/Gigacage.h:
-
-2017-09-29 Filip Pizlo <fpizlo@apple.com>
-
- Enable gigacage on iOS
- https://bugs.webkit.org/show_bug.cgi?id=177586
-
- Reviewed by JF Bastien.
-
- Introduce the ability to disable gigacage at runtime if allocation fails. If any step of gigacage
- allocation fails, we free all of the gigacages and turn off gigacage support.
-
- Reland this after confirming that the 20% Kraken regression was a one-bot fluke. Local testing on the
- same kind of system did not show the regression. Saam and I both tried independently.
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::scavenge):
- * bmalloc/Cache.h:
- (bmalloc::Cache::tryAllocate):
- (bmalloc::Cache::allocate):
- (bmalloc::Cache::deallocate):
- (bmalloc::Cache::reallocate):
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
- (Gigacage::runway):
- (Gigacage::totalSize):
- (Gigacage::shouldBeEnabled):
- (): Deleted.
- (Gigacage::Callback::Callback): Deleted.
- (Gigacage::Callback::function): Deleted.
- (Gigacage::PrimitiveDisableCallbacks::PrimitiveDisableCallbacks): Deleted.
- * bmalloc/Gigacage.h:
- (Gigacage::wasEnabled):
- (Gigacage::isEnabled):
- (Gigacage::runway): Deleted.
- (Gigacage::totalSize): Deleted.
- * bmalloc/HeapKind.cpp: Added.
- (bmalloc::isActiveHeapKind):
- (bmalloc::mapToActiveHeapKind):
- * bmalloc/HeapKind.h:
- (bmalloc::isActiveHeapKindAfterEnsuringGigacage):
- (bmalloc::mapToActiveHeapKindAfterEnsuringGigacage):
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::scavenge):
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryLargeMemalignVirtual):
- (bmalloc::api::freeLargeVirtual):
- (bmalloc::api::isEnabled):
-
-2017-10-09 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r223015 and r223025.
- https://bugs.webkit.org/show_bug.cgi?id=178093
-
- Regressed Kraken on iOS by 20% (Requested by keith_mi_ on
- #webkit).
-
- Reverted changesets:
-
- "Enable gigacage on iOS"
- https://bugs.webkit.org/show_bug.cgi?id=177586
- http://trac.webkit.org/changeset/223015
-
- "Unreviewed, disable Gigacage on ARM64 Linux"
- https://bugs.webkit.org/show_bug.cgi?id=177586
- http://trac.webkit.org/changeset/223025
-
-2017-10-07 Yusuke Suzuki <utatane.tea@gmail.com>
-
- Unreviewed, disable Gigacage on ARM64 Linux
- https://bugs.webkit.org/show_bug.cgi?id=177586
-
- Gigacage's LLInt change breaks ARM64 Linux.
- Currently we do not have maintainers for this.
- Let's simply disable it.
-
- * bmalloc/Gigacage.h:
-
-2017-09-29 Filip Pizlo <fpizlo@apple.com>
-
- Enable gigacage on iOS
- https://bugs.webkit.org/show_bug.cgi?id=177586
-
- Reviewed by JF Bastien.
-
- Introduce the ability to disable gigacage at runtime if allocation fails. If any step of gigacage
- allocation fails, we free all of the gigacages and turn off gigacage support.
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::scavenge):
- * bmalloc/Cache.h:
- (bmalloc::Cache::tryAllocate):
- (bmalloc::Cache::allocate):
- (bmalloc::Cache::deallocate):
- (bmalloc::Cache::reallocate):
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
- (Gigacage::runway):
- (Gigacage::totalSize):
- (Gigacage::shouldBeEnabled):
- (): Deleted.
- (Gigacage::Callback::Callback): Deleted.
- (Gigacage::Callback::function): Deleted.
- (Gigacage::PrimitiveDisableCallbacks::PrimitiveDisableCallbacks): Deleted.
- * bmalloc/Gigacage.h:
- (Gigacage::wasEnabled):
- (Gigacage::isEnabled):
- (Gigacage::runway): Deleted.
- (Gigacage::totalSize): Deleted.
- * bmalloc/HeapKind.cpp: Added.
- (bmalloc::isActiveHeapKind):
- (bmalloc::mapToActiveHeapKind):
- * bmalloc/HeapKind.h:
- (bmalloc::isActiveHeapKindAfterEnsuringGigacage):
- (bmalloc::mapToActiveHeapKindAfterEnsuringGigacage):
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::scavenge):
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryLargeMemalignVirtual):
- (bmalloc::api::freeLargeVirtual):
- (bmalloc::api::isEnabled):
-
-2017-10-05 Filip Pizlo <fpizlo@apple.com>
-
- Use one Scavenger thread for all Heaps
- https://bugs.webkit.org/show_bug.cgi?id=174973
-
- Reviewed by JF Bastien.
-
- This combines the scavengers from all Heap instances into a single scavenger. It also combines
- the accounting for deciding when to run. Each Heap still controls what it means to scavenge
- itself (it's all in Heap::scavenge) but the policy decisions are all controlled by Scavenger.
- Because Scavenger is also the only thing that needs an AsyncTask, this removes AsyncTask and
- moves all of AsyncTask's logic into Scavenger.
-
- This appears to be a 1% progression on JetStream (with high statistical confidence: p = 0.0049).
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/AsyncTask.h: Removed.
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::allocateSmallChunk):
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::shrinkLarge):
- (bmalloc::Heap::deallocateLarge):
- (bmalloc::Heap::concurrentScavenge): Deleted.
- (bmalloc::Heap::scheduleScavengerIfUnderMemoryPressure): Deleted.
- (bmalloc::Heap::scheduleScavenger): Deleted.
- * bmalloc/Heap.h:
- * bmalloc/Scavenger.cpp:
- (bmalloc::Scavenger::Scavenger):
- (bmalloc::Scavenger::run):
- (bmalloc::Scavenger::runHoldingLock):
- (bmalloc::Scavenger::runSoon):
- (bmalloc::Scavenger::runSoonHoldingLock):
- (bmalloc::Scavenger::didStartGrowing):
- (bmalloc::Scavenger::scheduleIfUnderMemoryPressure):
- (bmalloc::Scavenger::scheduleIfUnderMemoryPressureHoldingLock):
- (bmalloc::Scavenger::schedule):
- (bmalloc::Scavenger::threadEntryPoint):
- (bmalloc::Scavenger::threadRunLoop):
- (bmalloc::Scavenger::setSelfQOSClass):
- * bmalloc/Scavenger.h:
- (bmalloc::Scavenger::willRun):
- (bmalloc::Scavenger::willRunSoon):
-
-2017-10-04 Filip Pizlo <fpizlo@apple.com>
-
- bmalloc mutex should be adaptive
- https://bugs.webkit.org/show_bug.cgi?id=177839
-
- Reviewed by Michael Saboff.
-
- This pulls the WordLock algorithm into bmalloc, mostly by copy-pasting the code. We need to
- copy paste because sometimes we build WTF without bmalloc, so WTF cannot rely on bmalloc for
- anything other than malloc.
-
- Reland after fixing ancient WordLock bug: the notify_one has to happen with the lock held
- to ensure it doesn't run after that thread has died.
-
- * bmalloc/Algorithm.h:
- (bmalloc::compareExchangeWeak):
- (bmalloc::compareExchangeStrong):
- * bmalloc/PerThread.h:
- * bmalloc/StaticMutex.cpp:
- (bmalloc::StaticMutex::lockSlow):
- (bmalloc::StaticMutex::unlockSlow):
- (bmalloc::StaticMutex::lockSlowCase): Deleted.
- * bmalloc/StaticMutex.h:
- (bmalloc::StaticMutex::try_lock):
- (bmalloc::StaticMutex::isLocked const):
- (bmalloc::StaticMutex::init):
- (bmalloc::StaticMutex::tryLock):
- (bmalloc::StaticMutex::lock):
- (bmalloc::StaticMutex::unlock):
- (bmalloc::sleep): Deleted.
- (bmalloc::waitUntilFalse): Deleted.
-
-2017-10-05 Matt Lewis <jlewis3@apple.com>
-
- Unreviewed, rolling out r222893.
-
- This caused multiple API failures.
-
- Reverted changeset:
-
- "bmalloc mutex should be adaptive"
- https://bugs.webkit.org/show_bug.cgi?id=177839
- http://trac.webkit.org/changeset/222893
-
-2017-10-05 Yusuke Suzuki <utatane.tea@gmail.com>
-
- [Linux] Port MallocBench
- https://bugs.webkit.org/show_bug.cgi?id=177856
-
- Reviewed by Filip Pizlo.
-
- * CMakeLists.txt:
-
-2017-10-04 Filip Pizlo <fpizlo@apple.com>
-
- bmalloc mutex should be adaptive
- https://bugs.webkit.org/show_bug.cgi?id=177839
-
- Reviewed by Michael Saboff.
-
- This pulls the WordLock algorithm into bmalloc, mostly by copy-pasting the code. We need to
- copy paste because sometimes we build WTF without bmalloc, so WTF cannot rely on bmalloc for
- anything other than malloc.
-
- * bmalloc/Algorithm.h:
- (bmalloc::compareExchangeWeak):
- (bmalloc::compareExchangeStrong):
- * bmalloc/PerThread.h:
- * bmalloc/StaticMutex.cpp:
- (bmalloc::StaticMutex::lockSlow):
- (bmalloc::StaticMutex::unlockSlow):
- (bmalloc::StaticMutex::lockSlowCase): Deleted.
- * bmalloc/StaticMutex.h:
- (bmalloc::StaticMutex::try_lock):
- (bmalloc::StaticMutex::isLocked const):
- (bmalloc::StaticMutex::init):
- (bmalloc::StaticMutex::tryLock):
- (bmalloc::StaticMutex::lock):
- (bmalloc::StaticMutex::unlock):
- (bmalloc::sleep): Deleted.
- (bmalloc::waitUntilFalse): Deleted.
-
-2017-10-02 Yusuke Suzuki <utatane.tea@gmail.com>
-
- [Linux] Enable Gigacage in x64 Linux environment
- https://bugs.webkit.org/show_bug.cgi?id=177745
-
- Reviewed by Carlos Garcia Campos.
-
- This patch enables Gigacage in x64 Linux environment.
- Gigacage enforces a caged pointer to reference to the
- specific memory region. This reduces the effectiveness
- of some types of attacks setting a pointer to ArrayBuffer
- and modifying arbitrary memory region.
-
- * bmalloc/Gigacage.h:
-
-2017-09-29 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r222625.
- https://bugs.webkit.org/show_bug.cgi?id=177664
-
- causes crashes on iOS (Requested by pizlo-mbp on #webkit).
-
- Reverted changeset:
-
- "Enable gigacage on iOS"
- https://bugs.webkit.org/show_bug.cgi?id=177586
- http://trac.webkit.org/changeset/222625
-
-2017-09-28 Filip Pizlo <fpizlo@apple.com>
-
- Enable gigacage on iOS
- https://bugs.webkit.org/show_bug.cgi?id=177586
-
- Reviewed by Michael Saboff.
-
- This enables Gigacage on iOS using a much smaller cage size. It's not necessary for it to be so
- small, but this is a good conservative starting point to start to exercise the code.
-
- * bmalloc/Gigacage.h:
-
-2017-09-26 Filip Pizlo <fpizlo@apple.com>
-
- Put g_gigacageBasePtr into its own page and make it read-only
- https://bugs.webkit.org/show_bug.cgi?id=174972
-
- Reviewed by Michael Saboff.
-
- This puts the gigacage base pointers into their own page and makes that page read-only.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
- (Gigacage::disablePrimitiveGigacage):
- (Gigacage::addPrimitiveDisableCallback):
- * bmalloc/Gigacage.h:
- (Gigacage::basePtr):
- (Gigacage::basePtrs):
-
-2017-09-04 Adrian Perez de Castro <aperez@igalia.com>
-
- Unreviewed build fix for Clang with libc++
-
- Fixes a build failure when building with Clang, -stdlib=libc++, and gigacage
- support enabled, which resulted in "stderr" being undefined.
-
- * bmalloc/Gigacage.cpp: Add missing <ctsdio> include to pull the definition.
-
-2017-09-03 Yusuke Suzuki <utatane.tea@gmail.com>
-
- Large virtual memory region allocation requires MMAP_NORESERVE in Linux
- https://bugs.webkit.org/show_bug.cgi?id=176211
-
- Reviewed by Geoffrey Garen.
-
- In Linux, we cannot allocate very large memory region without MMAP_NORESERVE.
- Linux kernel needs to reserve swap area for allocated memory region. If the
- swap area is exhausted, kernel fails to allocate the memory region with ENOMEM.
-
- This patch adds MMAP_NORESERVE to mmap flags in Linux. By adding this flag,
- mmap does not need to reserve swap area for the reserved memory region.
- This allows us to reserve very large memory region that is necessary for Gigacage.
-
- * bmalloc/BPlatform.h:
- * bmalloc/VMAllocate.h:
- (bmalloc::tryVMAllocate):
-
-2017-08-22 Filip Pizlo <fpizlo@apple.com>
-
- Strings need to be in some kind of gigacage
- https://bugs.webkit.org/show_bug.cgi?id=174924
-
- Reviewed by Oliver Hunt.
-
- This adds a StringGigacage.
-
- * bmalloc/Gigacage.cpp:
- * bmalloc/Gigacage.h:
- (Gigacage::name):
- (Gigacage::basePtr):
- (Gigacage::forEachKind):
- * bmalloc/HeapKind.h:
- (bmalloc::isGigacage):
- (bmalloc::gigacageKind):
- (bmalloc::heapKind):
-
-2017-08-30 Matt Lewis <jlewis3@apple.com>
-
- Unreviewed, rolling out r221384.
-
- This patch caused multiple 32-bit JSC test failures.
-
- Reverted changeset:
-
- "Strings need to be in some kind of gigacage"
- https://bugs.webkit.org/show_bug.cgi?id=174924
- http://trac.webkit.org/changeset/221384
-
-2017-08-22 Filip Pizlo <fpizlo@apple.com>
-
- Strings need to be in some kind of gigacage
- https://bugs.webkit.org/show_bug.cgi?id=174924
-
- Reviewed by Oliver Hunt.
-
- This adds a StringGigacage.
-
- * bmalloc/Gigacage.cpp:
- * bmalloc/Gigacage.h:
- (Gigacage::name):
- (Gigacage::basePtr):
- (Gigacage::forEachKind):
- * bmalloc/HeapKind.h:
- (bmalloc::isGigacage):
- (bmalloc::gigacageKind):
- (bmalloc::heapKind):
-
-2017-08-25 Daniel Bates <dabates@apple.com>
-
- Demarcate code added due to lack of NSDMI for aggregates
- https://bugs.webkit.org/show_bug.cgi?id=175990
-
- Reviewed by Andy Estes.
-
- * bmalloc/BPlatform.h:
- * bmalloc/List.h: Be explicit when initializing m_node to improve readability.
- (bmalloc::ListNode::ListNode):
-
-2017-08-23 Filip Pizlo <fpizlo@apple.com>
-
- Reduce Gigacage sizes
- https://bugs.webkit.org/show_bug.cgi?id=175920
-
- Reviewed by Mark Lam.
-
- This introduces the ability to have different gigacage sizes for different gigacages, and uses it to reduce the size of both
- gigacages, but to different extents: Primitive gets 32GB with a 16GB runway and JSValue gets 16GB.
-
- This is a ~10% membuster progression on my Mac Pro.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
- * bmalloc/Gigacage.h:
- (Gigacage::size):
- (Gigacage::alignment):
- (Gigacage::mask):
- (Gigacage::runway):
- (Gigacage::totalSize):
- (Gigacage::caged):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::gigacageSize):
- * bmalloc/Heap.h:
-
-2017-08-08 Filip Pizlo <fpizlo@apple.com>
-
- Baseline JIT should do caging
- https://bugs.webkit.org/show_bug.cgi?id=175037
-
- Reviewed by Mark Lam.
-
- This centralizes the notion of permanently enabling the primitive gigacage, which we only do in jsc
- and WebProcess.
-
- This saves the baseline JIT from emitting some code. Otherwise it would always have to emit enabled
- checks on each typed array access.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::primitiveGigacageDisabled):
- (Gigacage::disableDisablingPrimitiveGigacageIfShouldBeEnabled):
- (Gigacage::isDisablingPrimitiveGigacageDisabled):
- * bmalloc/Gigacage.h:
- (Gigacage::isPrimitiveGigacagePermanentlyEnabled):
- (Gigacage::canPrimitiveGigacageBeDisabled):
-
-2017-08-08 Ryan Haddad <ryanhaddad@apple.com>
-
- Unreviewed, rolling out r220368.
-
- This change caused WK1 tests to exit early with crashes.
-
- Reverted changeset:
-
- "Baseline JIT should do caging"
- https://bugs.webkit.org/show_bug.cgi?id=175037
- http://trac.webkit.org/changeset/220368
-
-2017-08-07 Filip Pizlo <fpizlo@apple.com>
-
- Baseline JIT should do caging
- https://bugs.webkit.org/show_bug.cgi?id=175037
-
- Reviewed by Mark Lam.
-
- This centralizes the notion of permanently enabling the primitive gigacage, which we only do in jsc
- and WebProcess.
-
- This saves the baseline JIT from emitting some code. Otherwise it would always have to emit enabled
- checks on each typed array access.
-
- * bmalloc/Gigacage.cpp:
- (Gigacage::primitiveGigacageDisabled):
- (Gigacage::disableDisablingPrimitiveGigacageIfShouldBeEnabled):
- (Gigacage::isDisablingPrimitiveGigacageDisabled):
- * bmalloc/Gigacage.h:
- (Gigacage::isPrimitiveGigacagePermanentlyEnabled):
- (Gigacage::canPrimitiveGigacageBeDisabled):
-
-2017-08-06 Filip Pizlo <fpizlo@apple.com>
-
- Primitive auxiliaries and JSValue auxiliaries should have separate gigacages
- https://bugs.webkit.org/show_bug.cgi?id=174919
-
- Reviewed by Keith Miller.
-
- This introduces two kinds of Gigacage, Primitive and JSValue. This translates to two kinds of
- HeapKind, PrimitiveGigacage and JSValueGigacage.
-
- The new support functionality required turning Inline.h into BInline.h, and INLINE into BINLINE, and
- NO_INLINE into BNO_INLINE.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::refillAllocatorSlowCase):
- (bmalloc::Allocator::refillAllocator):
- (bmalloc::Allocator::allocateLarge):
- (bmalloc::Allocator::allocateLogSizeClass):
- * bmalloc/AsyncTask.h:
- * bmalloc/BInline.h: Copied from Source/bmalloc/bmalloc/Inline.h.
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::tryAllocateSlowCaseNullCache):
- (bmalloc::Cache::allocateSlowCaseNullCache):
- (bmalloc::Cache::deallocateSlowCaseNullCache):
- (bmalloc::Cache::reallocateSlowCaseNullCache):
- * bmalloc/Deallocator.cpp:
- * bmalloc/Gigacage.cpp:
- (Gigacage::PrimitiveDisableCallbacks::PrimitiveDisableCallbacks):
- (Gigacage::ensureGigacage):
- (Gigacage::disablePrimitiveGigacage):
- (Gigacage::addPrimitiveDisableCallback):
- (Gigacage::removePrimitiveDisableCallback):
- (Gigacage::Callbacks::Callbacks): Deleted.
- (Gigacage::disableGigacage): Deleted.
- (Gigacage::addDisableCallback): Deleted.
- (Gigacage::removeDisableCallback): Deleted.
- * bmalloc/Gigacage.h:
- (Gigacage::name):
- (Gigacage::basePtr):
- (Gigacage::forEachKind):
- (Gigacage::caged):
- (Gigacage::isCaged):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::usingGigacage):
- (bmalloc::Heap::gigacageBasePtr):
- * bmalloc/Heap.h:
- * bmalloc/HeapKind.h:
- (bmalloc::isGigacage):
- (bmalloc::gigacageKind):
- (bmalloc::heapKind):
- * bmalloc/Inline.h: Removed.
- * bmalloc/Map.h:
- * bmalloc/PerProcess.h:
- (bmalloc::PerProcess<T>::getFastCase):
- (bmalloc::PerProcess<T>::get):
- (bmalloc::PerProcess<T>::getSlowCase):
- * bmalloc/PerThread.h:
- (bmalloc::PerThread<T>::getFastCase):
- * bmalloc/Vector.h:
- (bmalloc::Vector<T>::push):
- (bmalloc::Vector<T>::shrinkCapacity):
- (bmalloc::Vector<T>::growCapacity):
-
-2017-08-02 Filip Pizlo <fpizlo@apple.com>
-
- If Gigacage is disabled, bmalloc should service large aligned memory allocation requests through vmAllocate
- https://bugs.webkit.org/show_bug.cgi?id=175085
-
- Reviewed by Saam Barati.
-
- This fixes a problem where if we used gmalloc, WebAssembly memory allocations would still use
- bmalloc's large allocator.
-
- We want to use the page allocator for those "large" allocations when the Gigacage is disabled.
-
- * bmalloc/DebugHeap.cpp:
- (bmalloc::DebugHeap::DebugHeap):
- (bmalloc::DebugHeap::memalignLarge):
- (bmalloc::DebugHeap::freeLarge):
- * bmalloc/DebugHeap.h:
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::deallocateLarge):
-
-2017-08-02 Filip Pizlo <fpizlo@apple.com>
-
- We should be OK with the gigacage being disabled on gmalloc
- https://bugs.webkit.org/show_bug.cgi?id=175082
-
- Reviewed by Michael Saboff.
-
- This adds Gigacage::shouldBeEnabled(), which returns false when we're using gmalloc or other things
- that enable DebugHeap.
-
- * bmalloc/Environment.cpp:
- (bmalloc::Environment::Environment):
- * bmalloc/Environment.h:
- * bmalloc/Gigacage.cpp:
- (Gigacage::ensureGigacage):
- (Gigacage::shouldBeEnabled):
- * bmalloc/Gigacage.h:
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- * bmalloc/Heap.h:
-
-2017-08-01 Filip Pizlo <fpizlo@apple.com>
-
- Bmalloc and GC should put auxiliaries (butterflies, typed array backing stores) in a gigacage (separate multi-GB VM region)
- https://bugs.webkit.org/show_bug.cgi?id=174727
-
- Reviewed by Mark Lam.
-
- This adds a mechanism for managing multiple isolated heaps in bmalloc. For now, these isoheaps
- (isolated heaps) have a very simple relationship with each other and with the rest of bmalloc:
-
- - You have to choose how many isoheaps you will have statically. See numHeaps in HeapKind.h.
-
- - Because numHeaps is static, each isoheap gets fast thread-local allocation. Basically, we have a
- Cache for each heap kind.
-
- - Each isoheap gets its own Heap.
-
- - Each Heap gets a scavenger thread.
-
- - Some things, like Zone/VMHeap/Scavenger, are per-process.
-
- Most of the per-HeapKind functionality is handled by PerHeapKind<>.
-
- This approach is ideal for supporting special per-HeapKind behaviors. For now we have two heaps:
- the Primary heap for normal malloc and the Gigacage. The gigacage is a 64GB-aligned 64GB virtual
- region that we now use for variable-length random-access allocations. No Primary allocations will
- go into the Gigacage.
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/AllocationKind.h: Added.
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator):
- (bmalloc::Allocator::tryAllocate):
- (bmalloc::Allocator::allocateImpl):
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::refillAllocatorSlowCase):
- (bmalloc::Allocator::allocateLarge):
- * bmalloc/Allocator.h:
- * bmalloc/BExport.h: Added.
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::scavenge):
- (bmalloc::Cache::Cache):
- (bmalloc::Cache::tryAllocateSlowCaseNullCache):
- (bmalloc::Cache::allocateSlowCaseNullCache):
- (bmalloc::Cache::deallocateSlowCaseNullCache):
- (bmalloc::Cache::reallocateSlowCaseNullCache):
- (bmalloc::Cache::operator new): Deleted.
- (bmalloc::Cache::operator delete): Deleted.
- * bmalloc/Cache.h:
- (bmalloc::Cache::tryAllocate):
- (bmalloc::Cache::allocate):
- (bmalloc::Cache::deallocate):
- (bmalloc::Cache::reallocate):
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::Deallocator):
- (bmalloc::Deallocator::scavenge):
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSlowCase):
- * bmalloc/Deallocator.h:
- * bmalloc/Gigacage.cpp: Added.
- (Gigacage::Callback::Callback):
- (Gigacage::Callback::function):
- (Gigacage::Callbacks::Callbacks):
- (Gigacage::ensureGigacage):
- (Gigacage::disableGigacage):
- (Gigacage::addDisableCallback):
- (Gigacage::removeDisableCallback):
- * bmalloc/Gigacage.h: Added.
- (Gigacage::caged):
- (Gigacage::isCaged):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::usingGigacage):
- (bmalloc::Heap::concurrentScavenge):
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::shrinkLarge):
- (bmalloc::Heap::deallocateLarge):
- * bmalloc/Heap.h:
- (bmalloc::Heap::mutex):
- (bmalloc::Heap::kind const):
- (bmalloc::Heap::setScavengerThreadQOSClass): Deleted.
- * bmalloc/HeapKind.h: Added.
- * bmalloc/ObjectType.cpp:
- (bmalloc::objectType):
- * bmalloc/ObjectType.h:
- * bmalloc/PerHeapKind.h: Added.
- (bmalloc::PerHeapKindBase::PerHeapKindBase):
- (bmalloc::PerHeapKindBase::size):
- (bmalloc::PerHeapKindBase::at):
- (bmalloc::PerHeapKindBase::at const):
- (bmalloc::PerHeapKindBase::operator[]):
- (bmalloc::PerHeapKindBase::operator[] const):
- (bmalloc::StaticPerHeapKind::StaticPerHeapKind):
- (bmalloc::PerHeapKind::PerHeapKind):
- (bmalloc::PerHeapKind::~PerHeapKind):
- * bmalloc/PerThread.h:
- (bmalloc::PerThread<T>::destructor):
- (bmalloc::PerThread<T>::getSlowCase):
- (bmalloc::PerThreadStorage<Cache>::get): Deleted.
- (bmalloc::PerThreadStorage<Cache>::init): Deleted.
- * bmalloc/Scavenger.cpp: Added.
- (bmalloc::Scavenger::Scavenger):
- (bmalloc::Scavenger::scavenge):
- * bmalloc/Scavenger.h: Added.
- (bmalloc::Scavenger::setScavengerThreadQOSClass):
- (bmalloc::Scavenger::requestedScavengerThreadQOSClass const):
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::VMHeap):
- (bmalloc::VMHeap::tryAllocateLargeChunk):
- * bmalloc/VMHeap.h:
- * bmalloc/Zone.cpp:
- (bmalloc::Zone::Zone):
- * bmalloc/Zone.h:
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryMalloc):
- (bmalloc::api::malloc):
- (bmalloc::api::tryMemalign):
- (bmalloc::api::memalign):
- (bmalloc::api::realloc):
- (bmalloc::api::tryLargeMemalignVirtual):
- (bmalloc::api::free):
- (bmalloc::api::freeLargeVirtual):
- (bmalloc::api::scavengeThisThread):
- (bmalloc::api::scavenge):
- (bmalloc::api::isEnabled):
- (bmalloc::api::setScavengerThreadQOSClass):
- * bmalloc/mbmalloc.cpp:
-
-2017-08-01 Daewoong Jang <daewoong.jang@navercorp.com>
-
- Implement __builtin_clzl for MSVC
- https://bugs.webkit.org/show_bug.cgi?id=174232
-
- Reviewed by Geoffrey Garen.
-
- * bmalloc/Algorithm.h:
- (bmalloc::clzl):
- (bmalloc::clzl<1>):
- (bmalloc::__builtin_clzl):
- * bmalloc/BPlatform.h:
-
-2017-07-31 Mark Lam <mark.lam@apple.com>
-
- Fixed some comment typos.
-
- Not reviewed.
-
- * bmalloc/PerProcess.h:
-
-2017-07-14 Filip Pizlo <fpizlo@apple.com>
-
- It should be easy to decide how WebKit yields
- https://bugs.webkit.org/show_bug.cgi?id=174298
-
- Reviewed by Saam Barati.
-
- Use sched_yield() explicitly.
-
- * bmalloc/StaticMutex.cpp:
- (bmalloc::StaticMutex::lockSlowCase):
-
-2017-07-20 Chris Dumez <cdumez@apple.com>
-
- Replace calls to Vector::resize() with calls to more efficient shrink() / grow() when applicable
- https://bugs.webkit.org/show_bug.cgi?id=174660
-
- Reviewed by Geoffrey Garen.
-
- Replace calls to Vector::resize() with calls to more efficient shrink() / grow() when applicable.
- This essentially replaces a branch to figure out if the new size is less or greater than the
- current size by an assertion.
-
- * bmalloc/Map.h:
- (bmalloc::Hash>::rehash):
-
-2017-07-18 Andy Estes <aestes@apple.com>
-
- [Xcode] Enable CLANG_WARN_RANGE_LOOP_ANALYSIS
- https://bugs.webkit.org/show_bug.cgi?id=174631
-
- Reviewed by Tim Horton.
-
- * Configurations/Base.xcconfig:
-
-2017-07-18 Andy Estes <aestes@apple.com>
-
- [Xcode] Enable CLANG_WARN_OBJC_LITERAL_CONVERSION
- https://bugs.webkit.org/show_bug.cgi?id=174631
-
- Reviewed by Sam Weinig.
-
- * Configurations/Base.xcconfig:
-
-2017-07-18 Andy Estes <aestes@apple.com>
-
- [Xcode] Enable CLANG_WARN_NON_LITERAL_NULL_CONVERSION
- https://bugs.webkit.org/show_bug.cgi?id=174631
-
- Reviewed by Dan Bernstein.
-
- * Configurations/Base.xcconfig:
-
-2017-07-18 Andy Estes <aestes@apple.com>
-
- [Xcode] Enable CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING
- https://bugs.webkit.org/show_bug.cgi?id=174631
-
- Reviewed by Darin Adler.
-
- * Configurations/Base.xcconfig:
-
-2017-07-12 Adrian Perez de Castro <aperez@igalia.com>
-
- bmalloc: Failure to build when the compiler specifically targets ARMv8-A / defines __ARM_ARCH_8A__
- https://bugs.webkit.org/show_bug.cgi?id=174424
-
- Reviewed by Michael Catanzaro.
-
- * bmalloc/BPlatform.h: Also check for __ARCH_ARM_8A__ to detect ARMv8.
-
-2017-07-05 Daewoong Jang <daewoong.jang@navercorp.com>
-
- reinterpret_cast does not evaluate to constexpr
- https://bugs.webkit.org/show_bug.cgi?id=173622
-
- Reviewed by Yusuke Suzuki.
-
- * bmalloc/Algorithm.h:
- (bmalloc::mask):
- (bmalloc::roundUpToMultipleOf):
-
-2017-07-03 Andy Estes <aestes@apple.com>
-
- [Xcode] Add an experimental setting to build with ccache
- https://bugs.webkit.org/show_bug.cgi?id=173875
-
- Reviewed by Tim Horton.
-
- * Configurations/DebugRelease.xcconfig: Included ccache.xcconfig.
-
-2017-07-01 Dan Bernstein <mitz@apple.com>
-
- [iOS] Remove code only needed when building for iOS 9.x
- https://bugs.webkit.org/show_bug.cgi?id=174068
-
- Reviewed by Tim Horton.
-
- * bmalloc/BPlatform.h:
- * bmalloc/VMAllocate.h:
- (bmalloc::vmPageSizePhysical):
-
-2017-07-01 Dan Bernstein <mitz@apple.com>
-
- [macOS] Remove code only needed when building for OS X Yosemite
- https://bugs.webkit.org/show_bug.cgi?id=174067
-
- Reviewed by Tim Horton.
-
- * Configurations/Base.xcconfig:
- * Configurations/DebugRelease.xcconfig:
-
-2017-06-30 Ryosuke Niwa <rniwa@webkit.org>
-
- Ran sort-Xcode-project-file.
-
- * bmalloc.xcodeproj/project.pbxproj:
-
-2017-06-19 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Add a per-thread line cache
- https://bugs.webkit.org/show_bug.cgi?id=173552
-
- Reviewed by Darin Adler.
-
- Previously, any thread could allocate out of any page with free lines.
- Now, the first thread to free a line in a page owns that page's free
- lines until the whole page becomes free.
-
- This patch is a big speedup on multi-threaded benchmarks.
- tree_churn --parallel gets 14% faster on a 2-core (4-hyper-core) MacBook
- Air and 2.85X faster on 12-core (24-hyper-core) Mac Pro. Other parallel
- benchmarks show significant but smaller speedups.
-
- Thread affinity is a great predictor of object lifetime. The per-thread
- line cache avoids the pathology of shuffling pages between threads,
- turning predictable lifetimes into unpredictable lifetimes, increasing
- fragmentation. On tree_churn --parallel, the per-thread line cache
- increases free memory found per page scanned by 2.85X.
-
- Free line scanning in fragmented pages is pretty expensive relative to
- other allocate / initialize / free operations. According to Instruments,
- on tree_churn --parallel, scanning is about 10X more expensive than
- freeing. This explains why a 2.85X improvement in scanning efficiency
- translates into a 2.85X overall speedup on tree_churn --parallel.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::refillAllocatorSlowCase): Pass through our line
- cache so the Heap can fill it.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::scavenge): Scavenge our line cache.
-
- (bmalloc::Deallocator::processObjectLog): Deleted.
-
- * bmalloc/Deallocator.h:
- (bmalloc::Deallocator::lineCache): Added a line cache.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::deallocateLineCache): Deallocation function for thread
- destruction.
-
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::allocateSmallBumpRangesByMetadata):
- (bmalloc::Heap::allocateSmallBumpRangesByObject): Consult the new per-thread line
- cache for allocation and deallocation.
-
- * bmalloc/Heap.h:
- (bmalloc::Heap::allocateSmallBumpRanges):
- (bmalloc::Heap::derefSmallLine):
-
- * bmalloc/List.h:
- (bmalloc::List::remove): Remove has always been a logically static
- operation. Declare it static now so that the Heap can remove a page from
- a thread's line cache without holding a direct pointer to the cache.
-
- * bmalloc/SmallPage.h:
-
-2017-06-10 Dan Bernstein <mitz@apple.com>
-
- Reverted r218056 because it made the IDE reindex constantly.
-
- * Configurations/DebugRelease.xcconfig:
-
-2017-06-10 Dan Bernstein <mitz@apple.com>
-
- [Xcode] With Xcode 9 developer beta, everything rebuilds when switching between command-line and IDE
- https://bugs.webkit.org/show_bug.cgi?id=173223
-
- Reviewed by Sam Weinig.
-
- The rebuilds were happening due to a difference in the compiler options that the IDE and
- xcodebuild were specifying. Only the IDE was passing the -index-store-path option. To make
- xcodebuild pass that option, too, set CLANG_INDEX_STORE_ENABLE to YES if it is unset, and
- specify an appropriate path in CLANG_INDEX_STORE_PATH.
-
- * Configurations/DebugRelease.xcconfig:
-
-2017-06-07 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: memory APIs don't need to be heap members
- https://bugs.webkit.org/show_bug.cgi?id=173076
-
- Reviewed by Sam Weinig.
-
- Asking the OS about memory use is unrelated to the state of bmalloc's
- heap, so it's a better separation of concerns if related code is not
- part of the heap.
-
- * bmalloc/AvailableMemory.cpp:
- (bmalloc::memoryStatus):
- * bmalloc/AvailableMemory.h:
- (bmalloc::MemoryStatus::MemoryStatus):
- (bmalloc::isUnderMemoryPressure):
- (bmalloc::memoryFootprint):
- (bmalloc::percentAvailableMemoryInUse):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::updateMemoryInUseParameters): Deleted.
- * bmalloc/Heap.h:
- (bmalloc::Heap::isUnderMemoryPressure): Deleted.
- (bmalloc::Heap::memoryFootprint): Deleted.
- (bmalloc::Heap::percentAvailableMemoryInUse): Deleted.
-
-2017-06-06 Yusuke Suzuki <utatane.tea@gmail.com>
-
- struct does not accept initializer-form if member has initializers in GCC 4.9
- https://bugs.webkit.org/show_bug.cgi?id=172974
-
- Reviewed by Carlos Garcia Campos.
-
- struct cannot accept initializer-form constructor (like, `ListNode<T> t { ... }`) if
- the member of the struct has a default initializer.
- Here is a simple snippet.
-
- template<typename T>
- struct Pair {
- T* prev { nullptr };
- T* next { nullptr };
- };
-
- Pair<int> pair { nullptr, nullptr }; // compile erorr in GCC 4.9.
-
- Instead, we define a default constructor (to invoke default initializers) and a constructor
- to accept the above initialization.
-
- * bmalloc/List.h:
- (bmalloc::ListNode::ListNode):
- (bmalloc::List::iterator::iterator):
-
-2017-06-06 Geoffrey Garen <ggaren@apple.com>
-
- Try to fix the GTK build.
-
- Unreviewed.
-
- * bmalloc/List.h:
- (bmalloc::List::List):
-
-2017-06-05 Geoffrey Garen <ggaren@apple.com>
-
- Try to fix the GTK build.
-
- Unreviewed.
-
- * bmalloc/List.h:
-
-2017-06-02 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Small and large objects should share memory
- https://bugs.webkit.org/show_bug.cgi?id=172880
- <rdar://problem/31494732>
-
- Reviewed by Sam Weinig.
-
- This reduces our high water mark memory usage on JetStream on macOS
- by 10%-20%. It also has the nice side effect that we can free small
- object metadata after returning from a high water mark.
-
- No change in throughput.
-
- Our old algorithm allocated small object chunks and large objects in
- segregated virtual memory and never recycled addresses between them.
- This provided a slight security benefit because we could apply guard
- pages between the segregated ranges and we would never reuse the same
- virtual address for object and metadata memory.
-
- Our new algorithm allocates small object chunks from the large object
- allocator. This naturally recycles memory between small chunks and large
- objects, and between small chunks of different page classes. This allows
- us to shift memory between allocation types as a program moves between
- different phases of allocation, and to delete small object chunk metadata
- when a program shrinks back from a high water mark.
-
- Two intuitions I had about memory use turned out to be backwards in
- this context:
-
- (1) I thought that this optimization would work because it allowed you to
- allocate and free a 4MB object and then reuse that large allocation to
- service small allocations. In practice, the common benefit seems to be
- the opposite: After you allocate and free many small objects, you can
- stitch them together to allocate a large object without growing the heap.
-
- (2) I thought that it would be more memory-efficient to allocate
- fine-grained pages from the large object allocator. In practice, giving
- the large object allocator too many arbitrarily-sized ranges to manage
- leads to fragmentation. Meanwhile, segregated fit is a powerful memory
- optimization. So, it's best to return small object memory to the large
- allocator only when a whole small object chunk is free.
-
- * bmalloc/Chunk.h:
- (bmalloc::Chunk::ref):
- (bmalloc::Chunk::deref):
- (bmalloc::Chunk::refCount):
- (bmalloc::Chunk::freePages): We keep a free list per chunk and refcount
- each chunk so we can notice when a chunk becomes empty, and return it
- to the large allocator.
-
- (bmalloc::forEachPage): A new helper function for iterating the pages
- in a Chunk.
-
- (bmalloc::Chunk::Chunk): Use forEachPage instead of manual iteration.
- Use { } initialization because we don't get zero-initialized by the OS
- anymore.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::concurrentScavenge):
- (bmalloc::Heap::scavenge): Don't bother unlocking while scavenging. I
- wasn't able to show it to be a consistent speedup. A more promising
- approach, if we find a motivating example, is for the scavenger to give
- up and return early if any other client is waiting on the lock.
-
- (bmalloc::Heap::allocateSmallChunk): New helper function for allocating
- a small chunk. It allocates through the large allocator to facilitate
- sharing. We still allocate a chunk at a time instead of a page at a time.
- Surprisingly, more precise page-at-a-time allocation is worse for memory
- use because of fragmentation. Segregated fit is a powerful optimization.
-
- (bmalloc::Heap::deallocateSmallChunk): New helper function for deallocating
- a small chunk.
-
- (bmalloc::Heap::allocateSmallPage): Updated for new APIs.
-
- (bmalloc::Heap::deallocateSmallLine): Updated for new APIs. Note that
- we cache one free chunk per page class. This avoids churn in the large
- allocator when you free(malloc(X)).
-
- (bmalloc::Heap::allocateSmallBumpRangesByMetadata):
- (bmalloc::Heap::allocateSmallBumpRangesByObject):
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::scavengeSmallPages): Deleted.
- (bmalloc::Heap::scavengeLargeObjects): Deleted.
- * bmalloc/Heap.h:
-
- * bmalloc/LargeMap.h:
- (bmalloc::LargeMap::begin):
- (bmalloc::LargeMap::end): Added iteration helpers for scavenging.
-
- * bmalloc/LargeRange.h:
- (bmalloc::LargeRange::physicalSize): Added a comment about something
- that I confused myself about in this patch.
-
- * bmalloc/List.h:
- (bmalloc::List::iterator::operator*):
- (bmalloc::List::iterator::operator->):
- (bmalloc::List::iterator::operator!=):
- (bmalloc::List::iterator::operator++):
- (bmalloc::List::begin):
- (bmalloc::List::end):
- (bmalloc::List::pushFront):
- (bmalloc::List::remove):
- (bmalloc::ListNode::ListNode): Deleted. Added iteration helpers for
- scavenging. Changed the default state of a Node to null pointers instead
- of self pointers to distinguish the null node from the empty node for
- easier debugging.
-
- * bmalloc/Sizes.h: Changed the chunk size to 1MB to increase the chances
- of a chunk becoming free and recyclable.
-
- * bmalloc/SmallPage.h:
- (bmalloc::SmallPage::hasPhysicalPages):
- (bmalloc::SmallPage::setHasPhysicalPages): Track physical state by page
- instead of implicitly by which list a page is in. It's simpler not
- to have to move chunks and pages between physical vs virtual lists.
-
- (bmalloc::SmallPage::SmallPage): Deleted.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::tryAllocateLargeChunk):
- (bmalloc::VMHeap::allocateSmallChunk): Deleted.
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateSmallPage): Deleted.
- (bmalloc::VMHeap::deallocateSmallPage): Deleted. Small chunk allocation
- just forwards to the large allocator now.
-
- * bmalloc/bmalloc.h:
- (bmalloc::api::scavenge):
-
-2017-05-28 Dan Bernstein <mitz@apple.com>
-
- [Xcode] ALWAYS_SEARCH_USER_PATHS is set to YES
- https://bugs.webkit.org/show_bug.cgi?id=172691
-
- Reviewed by Tim Horton.
-
- * Configurations/Base.xcconfig: Set ALWAYS_SEARCH_USER_PATHS to NO.
-
-2017-05-25 Geoffrey Garen <ggaren@apple.com> and Michael Saboff <msaboff@apple.com>
-
- bmalloc: scavenger runs too much on JetStream
- https://bugs.webkit.org/show_bug.cgi?id=172373
-
- Reviewed by Geoffrey Garen.
-
- Instruments says that JetStream on macOS spends about 3% of its time in
- madvise.
-
- In <https://bugs.webkit.org/show_bug.cgi?id=160098>, Ben saw some
- evidence that madvise was the reason that switching to bmalloc for
- DFG::Node allocations was a slowdown the first time around.
-
- In <https://bugs.webkit.org/show_bug.cgi?id=172124>, Michael saw that
- scavening policy can affect JetStream.
-
- Intuitively, it seems wrong for the heap to idle shrink during hardcore
- benchmarking.
-
- The strategy here is to back off in response to any heap growth event,
- and to wait 2s instead of 0.5s for heap growth to take place -- but we
- scavenge immediately in response to critical memory pressure, to avoid
- jetsam.
-
- One hole in this strategy is that a workload with a perfectly
- unfragmented heap that allocates and deallocates ~16kB every 2s will
- never shrink its heap. This doesn't seem to be a problem in practice.
-
- This looks like a 2% - 4% speedup on JetStream on Mac Pro and MacBook Air.
-
- * bmalloc/AsyncTask.h:
- (bmalloc::AsyncTask::willRun):
- (bmalloc::AsyncTask::willRunSoon):
- (bmalloc::Function>::AsyncTask):
- (bmalloc::Function>::run):
- (bmalloc::Function>::runSoon):
- (bmalloc::Function>::threadRunLoop):
- (bmalloc::Function>::runSlowCase): Deleted. Added a "run soon" state
- so that execution delay is modeled directly instead of implicitly
- through sleep events. This enables the Heap to issue a "run now" event
- at any moment in response ot memory pressure.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap): Don't call into our own API -- that's a layering
- violation.
-
- (bmalloc::Heap::updateMemoryInUseParameters): No need for
- m_scavengeSleepDuration anymore.
-
- (bmalloc::Heap::concurrentScavenge): Added a back-off policy when the
- heap is growing.
- (bmalloc::Heap::scavenge):
-
- (bmalloc::Heap::scavengeSmallPages):
- (bmalloc::Heap::scavengeLargeObjects): Don't try to give up in the middle
- of a scavenge event. Our new backoff policy supplants that design. Also,
- it's easier to profile and understand scavenging behavior if it always
- runs to completion once started.
-
- (bmalloc::Heap::scheduleScavenger):
- (bmalloc::Heap::scheduleScavengerIfUnderMemoryPressure): Added a
- synchronous amortized check for memory pressure. This check has the
- benefit that it runs immediately during high rates of heap activity,
- so we can detect memory pressure right away and wake the scavenger
- instead of waiting for the scavenger to wake up.
-
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::shrinkLarge):
- (bmalloc::Heap::deallocateLarge):
- * bmalloc/Heap.h:
- (bmalloc::Heap::isUnderMemoryPressure):
- * bmalloc/Sizes.h:
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::deallocateSmallPage):
- * bmalloc/bmalloc.h:
- (bmalloc::api::scavenge): Updated for API changes above.
-
-2017-05-17 Michael Saboff <msaboff@apple.com>
-
- [iOS] The Garbage Collector shouldn't rely on the bmalloc scavenger for up to date memory footprint info (172186)
- https://bugs.webkit.org/show_bug.cgi?id=172186
-
- Reviewed by Geoffrey Garen.
-
- The calls memoryFootprint() and percentAvailableMemoryInUse() now make a system call to get
- the current memory footprint value.
-
- * bmalloc/Heap.h:
- (bmalloc::Heap::memoryFootprint):
- (bmalloc::Heap::percentAvailableMemoryInUse):
-
-2017-05-16 Michael Saboff <msaboff@apple.com>
-
- REGRESSION(r216763): JetStream is 1% slower on Mac
- https://bugs.webkit.org/show_bug.cgi?id=172124
-
- Reviewed by Filip Pizlo.
-
- It appears that changing maxScavengeSleepDuration from 512 to 250ms in r216763 is
- responsible for the regression.
-
- * bmalloc/Sizes.h:
-
-2017-05-15 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Bump the size of the deallocator log to 512
- https://bugs.webkit.org/show_bug.cgi?id=172143
-
- Reviewed by Michael Saboff.
-
- This is a speedup on parallel workloads for machines with lots of CPUs.
-
- * bmalloc/Sizes.h:
-
-2017-05-12 Michael Saboff <msaboff@apple.com>
-
- [iOS] Use memory footprint to dynamically adjust behavior of allocators
- https://bugs.webkit.org/show_bug.cgi?id=171944
-
- Reviewed by Filip Pizlo.
-
- This change is iOS only.
-
- After the scavenger thread completes scavenging, it asks the OS for how much total memory the
- process is using. This information is used to update the sleep delay for the scanvenger thread,
- as well as to provide memory in use data for other parts of the system.
-
- The scavenger sleep time is calculated using the following quadradic equation.
-
- scavengerSleep = 1.2*percentFreeMemory^2 - percentFreeMemory + 2
-
- Where percentFreeMemory is between 0 and 100. The result is constrained to the values 2 and 250.
-
- This equation empirically works out to providing a 2ms sleep time when we have less than 10%
- memory available, 30ms when 20% is available and 250ms when 50% or more is available. In testing,
- this exponentially agressive scavenging delay by itself reduced memory usage and made it much
- more deterministic when used without the corresponding change in the JSC Heap.
-
- Changed the scavenger thread to use the User Initiated QOS priority to ensure it doesn't
- get starved.
-
- Moved the non-Windows functionality of WTF::RAMSize() to new files AvailableMemory.{cpp,h}
- and implemented in the function availableMemory(). That functions limits the value returned
- on iOS to a maximum of 840MB as that is the jetsam soft memory limit.
- Added a new API availableMemory() so that WTF::RAMSize() will use this value.
-
- * CMakeLists.txt:
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/BPlatform.h:
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::updateMemoryInUseParameters):
- (bmalloc::Heap::concurrentScavenge):
- (bmalloc::Heap::scavenge):
- * bmalloc/Heap.h:
- (bmalloc::Heap::memoryFootprint):
- (bmalloc::Heap::percentAvailableMemoryInUse):
- * bmalloc/Sizes.h:
- * bmalloc/bmalloc.h:
- (bmalloc::api::availableMemory):
- (bmalloc::api::memoryFootprint):
- (bmalloc::api::percentAvailableMemoryInUse):
- * bmalloc/AvailableMemory.cpp: Added.
- (bmalloc::computeAvailableMemory):
- (bmalloc::availableMemory):
- * bmalloc/AvailableMemory.h: Added.
-
-2017-05-05 Joseph Pecoraro <pecoraro@apple.com>
-
- Leaks always reports "WebKit Malloc Memory Pressure Handler" dispatch_queue/source as leaking
- https://bugs.webkit.org/show_bug.cgi?id=171532
-
- Reviewed by Geoffrey Garen.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- * bmalloc/Heap.h:
- Store the dispatch_source_t in a member to avoid a false positive leak.
-
-2017-04-27 Michael Saboff <msaboff@apple.com>
-
- bmalloc scavenger should know what page classes are allocating
- https://bugs.webkit.org/show_bug.cgi?id=171384
-
- Reviewed by Geoffrey Garen.
-
- This change replaces m_isAllocatingPages with a per page class flag to track which page
- classes are currently allocating. When scavenging, we skip page classes that are actively
- allocating and come back to them on a subsequent pass. This reduces the amount of time it
- takes for scavenger to free up pages as well as the total time it takes to handle all
- page classes.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::concurrentScavenge):
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::scavengeSmallPages):
- (bmalloc::Heap::scavengeLargeObjects):
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::deallocateLarge):
- * bmalloc/Heap.h:
- (bmalloc::Heap::takeRequestedScavengerThreadQOSClass): Deleted.
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::deallocateSmallPage):
- * bmalloc/bmalloc.h:
- (bmalloc::api::scavenge):
-
-2017-04-25 Michael Saboff <msaboff@apple.com>
-
- Call bmalloc scavenger first when handling a memory pressure event
- https://bugs.webkit.org/show_bug.cgi?id=171289
-
- Reviewed by Geoffrey Garen.
-
- Registered a critical memory pressure handler. We add this handler in addition to the
- call to release bmalloc memory in the WebCore releaseMemory handler for the case of
- JSC API users that don't use WebCore. When both handlers are in the process, it is
- basically a race. One will win, but the loser won't do any more work, so it is harmless.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
-
-2017-04-14 Mark Lam <mark.lam@apple.com>
-
- Update architectures in xcconfig files.
- https://bugs.webkit.org/show_bug.cgi?id=170867
- <rdar://problem/31628104>
-
- Reviewed by Joseph Pecoraro.
-
- * Configurations/Base.xcconfig:
-
-2017-04-12 Dan Bernstein <mitz@apple.com>
-
- [Mac] Future-proof .xcconfig files
- https://bugs.webkit.org/show_bug.cgi?id=170802
-
- Reviewed by Tim Horton.
-
- * Configurations/Base.xcconfig:
- * Configurations/DebugRelease.xcconfig:
-
-2017-02-03 Ting-Wei Lan <lantw44@gmail.com>
-
- Include cstdlib before using ::malloc and posix_memalign
- https://bugs.webkit.org/show_bug.cgi?id=167800
-
- Reviewed by Geoffrey Garen.
-
- * bmalloc/DebugHeap.cpp:
-
-2017-02-01 Andreas Kling <akling@apple.com>
-
- Implement the alwaysRunsAtBackgroundPriority WK2 setting using thread QoS.
- <https://webkit.org/b/167387>
- <rdar://problem/29711409>
-
- Reviewed by Antti Koivisto.
-
- Support changing the QoS level of the scavenger thread asynchronously through
- a request variable. This is not the most elegant thing in the world, but since
- threads are only allowed to change their own QoS class, our options are limited.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::concurrentScavenge):
- * bmalloc/Heap.h:
- (bmalloc::Heap::takeRequestedScavengerThreadQOSClass):
- (bmalloc::Heap::setScavengerThreadQOSClass):
- * bmalloc/bmalloc.h:
- (bmalloc::api::setScavengerThreadQOSClass):
-
-2017-01-13 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Use a separate zone when using system malloc
- https://bugs.webkit.org/show_bug.cgi?id=167014
-
- Reviewed by Filip Pizlo.
-
- Harris asked for this so he could separate Safari and WebKit memory use
- when doing memory analysis.
-
- This patch adds an explicit DebugHeap class that contains all our
- code for specialized allocation with debugging.
-
- * bmalloc.xcodeproj/project.pbxproj:
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator):
- (bmalloc::Allocator::tryAllocate):
- (bmalloc::Allocator::allocateImpl):
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::allocateSlowCase):
- * bmalloc/Allocator.h: Forward to DebugHeap instead of inlining all the
- code. This is required for our new interface, and it is also a nice
- simplification that moves some not-very-important code out of the way.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::Deallocator):
- (bmalloc::Deallocator::scavenge):
- (bmalloc::Deallocator::deallocateSlowCase):
- * bmalloc/Deallocator.h: Ditto.
-
- * bmalloc/DebugHeap.cpp: Added.
- (bmalloc::DebugHeap::DebugHeap):
- (bmalloc::DebugHeap::malloc):
- (bmalloc::DebugHeap::memalign):
- (bmalloc::DebugHeap::realloc):
- (bmalloc::DebugHeap::free):
- * bmalloc/DebugHeap.h: Added. New class for overriding normal heap
- behavior. Right now, it just adds a malloc zone and then forwards to
- system malloc -- but we can add lots more kinds of debug heaps in the
- future if we find them useful.
-
- * bmalloc/Environment.cpp:
- (bmalloc::Environment::Environment):
- (bmalloc::Environment::computeIsDebugHeapEnabled):
- (bmalloc::Environment::computeIsBmallocEnabled): Deleted.
- * bmalloc/Environment.h:
- (bmalloc::Environment::isDebugHeapEnabled):
- (bmalloc::Environment::isBmallocEnabled): Deleted. Renamed everything to
- reflect our new use of DebugHeap.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- * bmalloc/Heap.h:
- (bmalloc::Heap::debugHeap): Updated to use DebugHeap.
- (bmalloc::Heap::environment): Deleted.
-
- * bmalloc/bmalloc.h:
- (bmalloc::api::isEnabled): Updated to use DebugHeap.
-
-2016-12-15 Myles C. Maxfield <mmaxfield@apple.com>
-
- Sort Xcode project files
- https://bugs.webkit.org/show_bug.cgi?id=165937
-
- Reviewed by Simon Fraser.
-
- * bmalloc.xcodeproj/project.pbxproj:
-
-2016-12-08 David Kilzer <ddkilzer@apple.com>
-
- Always check the return value of pthread_key_create()
- <https://webkit.org/b/165274>
-
- Reviewed by Darin Adler.
-
- * bmalloc/PerThread.h:
- (bmalloc::PerThreadStorage::init): Call BCRASH() if
- pthread_key_create() returns an error. The error code will be
- stored in a register available in a crash log, so no need to log
- the value explicitly.
-
-2016-12-06 Alexey Proskuryakov <ap@apple.com>
-
- Correct SDKROOT values in xcconfig files
- https://bugs.webkit.org/show_bug.cgi?id=165487
- rdar://problem/29539209
-
- Reviewed by Dan Bernstein.
-
- Fix suggested by Dan Bernstein.
-
- * Configurations/DebugRelease.xcconfig:
-
-2016-11-29 Andy Estes <aestes@apple.com>
-
- [Cocoa] Enable two clang warnings recommended by Xcode
- https://bugs.webkit.org/show_bug.cgi?id=164498
-
- Reviewed by Mark Lam.
-
- * Configurations/Base.xcconfig: Enabled CLANG_WARN_INFINITE_RECURSION and CLANG_WARN_SUSPICIOUS_MOVE.
-
-2016-11-10 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc threads should have a non-default QoS
- https://bugs.webkit.org/show_bug.cgi?id=164612
-
- Reviewed by Filip Pizlo.
-
- * bmalloc/AsyncTask.h:
- (bmalloc::Function>::threadEntryPoint): Request user-interactive quality
- of service because user-interactive tasks use malloc.
-
-2016-10-20 Mark Lam <mark.lam@apple.com>
-
- bmalloc api should crash on failure to allocate when !isBmallocEnabled.
- https://bugs.webkit.org/show_bug.cgi?id=163766
-
- Reviewed by Keith Miller and Filip Pizlo.
-
- We want to crash in bmalloc on failure to allocate even when !isBmallocEnabled.
- This is so that failures to allocate memory will manifest as crashes with a
- unique signature (i.e. as a SIGTRAP on release builds, or as a write to illegal
- address 0xbbadbeef on debug builds) and the crash will manifest inside bmalloc.
- This distinguishes allocation failures from other crashing bugs that manifest as
- SIGSEGVs due to random pointer dereferences in the clients of bmalloc.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocateImpl):
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::allocateSlowCase):
-
-2016-09-26 Yoshiaki Jitsukawa <Yoshiaki.Jitsukawa@sony.com>
-
- Avoid implicit conversion from iterator to pointer
- https://bugs.webkit.org/show_bug.cgi?id=162482
-
- Reviewed by Geoffrey Garen.
-
- Not every STL supporting such conversion, we should get a pointer explicitly.
-
- * bmalloc/Chunk.h:
- (bmalloc::Chunk::lines):
- (bmalloc::Chunk::pages):
- * bmalloc/FixedVector.h:
- (bmalloc::FixedVector::begin):
-
-2016-08-31 Filip Pizlo <fpizlo@apple.com>
-
- Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
- https://bugs.webkit.org/show_bug.cgi?id=160125
-
- Reviewed by Geoffrey Garen and Keith Miller.
-
- I needed to tryMemalign, so I added such a thing.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate):
- (bmalloc::Allocator::tryAllocate):
- (bmalloc::Allocator::allocateImpl):
- * bmalloc/Allocator.h:
- * bmalloc/Cache.h:
- (bmalloc::Cache::tryAllocate):
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryMemalign):
-
-2016-08-30 Yusuke Suzuki <utatane.tea@gmail.com>
-
- Unreviewed, build fix for GCC ports
-
- std::forward is declared in <utility> header.
-
- * bmalloc/ScopeExit.h:
-
-2016-08-30 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: speed up the lock slow path
- https://bugs.webkit.org/show_bug.cgi?id=161058
-
- Unreviewed roll-in - with regression fixed.
-
- Revert to using yield() instead of swtch() because very low priority
- background tasks can cause priority inversion and deadlock. In the
- network process, that happened with com.apple.WebKit.Cache.Storage.serialBackground.
-
- Still a big speedup on MallocBench.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/ScopeExit.h: Added.
- (bmalloc::ScopeExit::ScopeExit):
- (bmalloc::ScopeExit::~ScopeExit):
- (bmalloc::makeScopeExit):
- * bmalloc/StaticMutex.cpp:
- (bmalloc::StaticMutex::lockSlowCase):
- * bmalloc/StaticMutex.h:
- (bmalloc::StaticMutex::init):
-
-2016-08-26 Geoffrey Garen <ggaren@apple.com>
-
- Unreviewed build fix.
-
- Fix the CMake build.
-
- * CMakeLists.txt:
-
-2016-08-26 Geoffrey Garen <ggaren@apple.com>
-
- Renamed XLarge* => Large*
- https://bugs.webkit.org/show_bug.cgi?id=161261
-
- Reviewed by Andreas Kling.
-
- XLarge is not a thing anymore: We just have Small and Large.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::shrinkLarge):
- (bmalloc::Heap::deallocateLarge):
- * bmalloc/Heap.h:
- * bmalloc/LargeMap.cpp: Copied from Source/bmalloc/bmalloc/XLargeMap.cpp.
- (bmalloc::LargeMap::remove):
- (bmalloc::LargeMap::add):
- (bmalloc::XLargeMap::remove): Deleted.
- (bmalloc::XLargeMap::add): Deleted.
- * bmalloc/LargeMap.h: Copied from Source/bmalloc/bmalloc/XLargeMap.h.
- (bmalloc::LargeMap::ranges):
- (bmalloc::XLargeMap::ranges): Deleted.
- * bmalloc/LargeRange.h: Copied from Source/bmalloc/bmalloc/XLargeRange.h.
- (bmalloc::LargeRange::LargeRange):
- (bmalloc::LargeRange::operator<):
- (bmalloc::canMerge):
- (bmalloc::merge):
- (bmalloc::LargeRange::split):
- (bmalloc::XLargeRange::XLargeRange): Deleted.
- (bmalloc::XLargeRange::operator<): Deleted.
- (bmalloc::XLargeRange::split): Deleted.
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::tryAllocateLargeChunk):
- * bmalloc/VMHeap.h:
- * bmalloc/XLargeMap.cpp: Removed.
- * bmalloc/XLargeMap.h: Removed.
- * bmalloc/XLargeRange.h: Removed.
-
-2016-08-26 Gavin Barraclough <barraclough@apple.com>
-
- bmalloc: speed up the lock slow path
- https://bugs.webkit.org/show_bug.cgi?id=161058
-
- Unreviewed rollout - this caused regressions <rdar://problem/28026089>.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/ScopeExit.h: Removed.
- * bmalloc/StaticMutex.cpp:
- (bmalloc::StaticMutex::lockSlowCase):
- * bmalloc/StaticMutex.h:
- (bmalloc::StaticMutex::init):
- * bmalloc/ThreadSwitch.h: Removed.
-
-2016-08-24 Andreas Kling <akling@apple.com>
-
- Add bmalloc::api::isEnabled().
- <https://webkit.org/b/160534>
-
- Reviewed by Joseph Pecoraro.
-
- * bmalloc/bmalloc.h:
- (bmalloc::api::isEnabled):
-
-2016-08-24 Filip Pizlo <fpizlo@apple.com>
-
- Unreviewed, roll out r204901, r204897, r204866, r204856, r204854.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate):
- (bmalloc::Allocator::tryAllocate): Deleted.
- (bmalloc::Allocator::allocateImpl): Deleted.
- * bmalloc/Allocator.h:
- * bmalloc/Cache.h:
- (bmalloc::Cache::tryAllocate): Deleted.
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryMemalign): Deleted.
-
-2016-08-12 Filip Pizlo <fpizlo@apple.com>
-
- Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
- https://bugs.webkit.org/show_bug.cgi?id=160125
-
- Reviewed by Geoffrey Garen.
-
- I needed to tryMemalign, so I added such a thing.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate):
- (bmalloc::Allocator::tryAllocate):
- (bmalloc::Allocator::allocateImpl):
- (bmalloc::Allocator::reallocate):
- * bmalloc/Allocator.h:
- * bmalloc/Cache.h:
- (bmalloc::Cache::allocate):
- (bmalloc::Cache::tryAllocate):
- * bmalloc/bmalloc.h:
- (bmalloc::api::malloc):
- (bmalloc::api::tryMemalign):
- (bmalloc::api::memalign):
-
-2016-08-22 Yusuke Suzuki <utatane.tea@gmail.com>
-
- Unreviewed, build fix on GCC environment
- https://bugs.webkit.org/show_bug.cgi?id=161058
-
- std::forward is declared in <utility> header.
-
- * bmalloc/ScopeExit.h:
-
-2016-08-22 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: speed up the lock slow path
- https://bugs.webkit.org/show_bug.cgi?id=161058
-
- Reviewed by Filip Pizlo.
-
- It is generally accepted practice that a lock should yield instead of
- spinning when a lock acquisition fails, to avoid wasting CPU and power.
-
- There are two problems with this generally accepted practice:
-
- (1) It's a fallacy that yielding is free. In reality, yielding itself
- consumes CPU and power -- by performing a syscall, running the OS
- scheduler, and possibly performing a context switch. (Instruments
- traces of MallocBench show the cost of yielding.) Therefore, spinning a
- little to avoid yielding can actually *save* CPU and power.
-
- (2) std::this_thread_yield() on Darwin is way too aggressive: It not only
- yields but also depresses your priority to absolute zero for 10ms. A
- recent PLT trace showed a few spots where the main thread just gave up
- on loading and rendering a page for 10ms so an unimportant background
- task could run.
-
- To correct these problems, this patch adds a little bit of spinning to
- the bmalloc lock slow path.
-
- Below are performance results on various CPUs.
-
- Mac Pro (12 hyperthreaded cores = 24 threads):
-
- Baseline Patch Δ
- Execution Time:
- message_one 173ms 173ms
- message_many 953ms 927ms ^ 1.03x faster
- churn --parallel 60ms 41ms ^ 1.46x faster
- list_allocate --parallel 224ms 143ms ^ 1.57x faster
- tree_allocate --parallel 1,190ms 758ms ^ 1.57x faster
- tree_churn --parallel 1,517ms 906ms ^ 1.67x faster
- facebook --parallel 6,519ms 4,580ms ^ 1.42x faster
- reddit --parallel 5,097ms 3,411ms ^ 1.49x faster
- flickr --parallel 4,903ms 3,501ms ^ 1.4x faster
- theverge --parallel 6,641ms 4,505ms ^ 1.47x faster
-
- <geometric mean> 1,158ms 832ms ^ 1.39x faster
- <arithmetic mean> 2,728ms 1,895ms ^ 1.44x faster
- <harmonic mean> 332ms 240ms ^ 1.38x faster
-
- MacBook Air (2 hyperthreaded cores = 4 threads):
-
- Baseline Patch Δ
- Execution Time:
- message_one 911ms 907ms ^ 1.0x faster
- message_many 515ms 513ms ^ 1.0x faster
- churn --parallel 132ms 134ms ! 1.02x slower
- list_allocate --parallel 104ms 102ms ^ 1.02x faster
- tree_allocate --parallel 117ms 111ms ^ 1.05x faster
- tree_churn --parallel 154ms 151ms ^ 1.02x faster
- facebook --parallel 719ms 687ms ^ 1.05x faster
- reddit --parallel 382ms 341ms ^ 1.12x faster
- flickr --parallel 372ms 345ms ^ 1.08x faster
- theverge --parallel 489ms 444ms ^ 1.1x faster
-
- <geometric mean> 299ms 287ms ^ 1.04x faster
- <arithmetic mean> 390ms 374ms ^ 1.04x faster
- <harmonic mean> 227ms 220ms ^ 1.03x faster
-
- iPad (2 cores = 2 threads):
-
- [ Doesn't run Ruby, so no pretty subtest output. ]
-
- Baseline Patch Δ
- Execution Time: 174.14ms 171.5ms ^ 1.02x faster
-
- * bmalloc.xcodeproj/project.pbxproj:
-
- * bmalloc/ScopeExit.h: Added. A barebones very wimpy version of
- WTF::ScopeExit.
- (bmalloc::ScopeExit::ScopeExit):
- (bmalloc::ScopeExit::~ScopeExit):
- (bmalloc::makeScopeExit):
-
- * bmalloc/StaticMutex.cpp:
- (bmalloc::StaticMutex::lockSlowCase): Spin before yielding -- that's the
- speedup. Don't spin if another CPU is already spinning. In theory, more
- than one spinner accomplishes nothing, and I found that there's a cutoff
- around 8 or 16 spinners that becomes performance negative on Mac Pro.
-
- (Note: Another way to accomplish a similar result, if you don't want to
- use a bit of state in the lock, is to spin for a random duration between
- 0 and aLot. I tested a version of WTF::WeakRandom with unsynchronized
- static state and it worked great. But I ultimately opted for the explicit
- bit because I thought it was clearer.)
-
- * bmalloc/StaticMutex.h:
- (bmalloc::StaticMutex::init): Initialize our new bit.
-
- * bmalloc/ThreadSwitch.h: Added.
- (bmalloc::threadSwitch): Don't call yield() on Darwin because it's too
- aggressive. swtch() does what we want: Go run something else, without
- any other side-effects.
-
-2016-08-03 Geoffrey Garen <ggaren@apple.com>
-
- [bmalloc] Merging of XLargeRanges can leak the upper range
- https://bugs.webkit.org/show_bug.cgi?id=160403
-
- Reviewed by Michael Saboff.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::scavengeLargeObjects): Don't use removePhysical().
- Recorded physical size is a performance optimization. It is not the
- truth. So it might be zero even if a range contains physical pages.
-
- Instead, iterate each range in the map unconditionally.
-
- The map can shrink when we release the lock, so we must clamp our
- iterator each time through the loop.
-
- The map can grow when we release the lock, but we don't care because
- growth restarts the scavenger from the beginning.
-
- * bmalloc/XLargeMap.cpp:
- (bmalloc::XLargeMap::removePhysical): Deleted. Not used anymore.
-
- * bmalloc/XLargeMap.h:
- (bmalloc::XLargeMap::ranges): Added direct access for the sake of
- scavengeLargeObjects. (This violates our naming conventions -- I'll do
- a rename in a follow-up patch.)
-
-2016-07-13 Enrica Casucci <enrica@apple.com>
-
- Update supported platforms in xcconfig files to match the sdk names.
- https://bugs.webkit.org/show_bug.cgi?id=159728
-
- Reviewed by Tim Horton.
-
- * Configurations/Base.xcconfig:
-
-2016-07-11 Geoffrey Garen <ggaren@apple.com>
-
- Crash due to abort() calling libc++.1.dylib: std::__1::thread::detach()
- https://bugs.webkit.org/show_bug.cgi?id=159655
-
- Reviewed by Sam Weinig.
-
- It's not entirely clear what was happening in these crashes, but our
- use of detach() was 100% forward-looking, so we can just remove it for
- now.
-
- This patch removes the ability for the scavenger owner to die before
- the scavenger thread dies (which was unused) and also removes the
- ability for the scavenger thread to exit (which was used, but we
- messed up and did thread joining lazily, so we never got any benefit
- from thread exit.)
-
- We can add these features back when we need them, and make them work then.
-
- * bmalloc/AsyncTask.h:
- (bmalloc::Function>::AsyncTask): We start out in the running state now
- because we know that starting our thread will run it.
-
- (bmalloc::Function>::~AsyncTask): We don't support destruction anymore.
-
- (bmalloc::Function>::runSlowCase): I removed the Exited state.
-
- (bmalloc::Function>::threadRunLoop): I removed the Exited and
- ExitRequested states.
-
- * bmalloc/Heap.h:
-
- * bmalloc/VMHeap.h:
-
-2016-06-12 David Kilzer <ddkilzer@apple.com>
-
- Crash in com.apple.WebKit.WebContent at std::__1::__call_once_proxy<std::__1::tuple<CrashReporterSupportLibrary()::$_0&&> >
- <https://webkit.org/b/158660>
- <rdar://problem/25652686>
-
- Reviewed by Darin Adler.
-
- * bmalloc/Logging.cpp: Switch to use
- BSOFT_LINK_PRIVATE_FRAMEWORK() to link
- CrashReporterSupport.framework.
- * bmalloc/darwin/BSoftLinking.h:
- (BSOFT_LINK_PRIVATE_FRAMEWORK): Rename from BSOFT_LINK_FRAMEWORK.
- Switch to use /System/Library/PrivateFrameworks/.
-
-2016-06-11 David Kilzer <ddkilzer@apple.com>
-
- Implement logging for RELEASE_BASSERT_WITH_MESSAGE() in BAssert.h
- <http://webkit.org/b/155992>
-
- Reviewed by Geoff Garen.
-
- * bmalloc/BAssert.h:
- (BLOG_ERROR): Add method to always log error messages.
- (RELEASE_BASSERT_WITH_MESSAGE): Use BLOG_ERROR() to implement
- logging in Debug builds.
- * bmalloc/BPlatform.h:
- (BPLATFORM_MAC): Add.
- (BUSE): Add BUSE() macro.
- (BATTRIBUTE_PRINTF): Add.
- (BUSE_OS_LOG): Add.
- * bmalloc/Logging.cpp:
- (bmalloc::reportAssertionFailureWithMessage): Add. Logs to
- stderr.
- * bmalloc/Logging.h:
- (bmalloc::reportAssertionFailureWithMessage): Add declaration.
-
-2016-06-07 Pranjal Jumde <pjumde@apple.com>
-
- Prevents integer overflow in Vector.h
- https://bugs.webkit.org/show_bug.cgi?id=158455
- <rdar://problem/20235469>
-
- Reviewed by Mark Lam.
-
- * bmalloc/Vector.h:
- (bmalloc::Vector<T>::reallocateBuffer):
-
-2016-05-27 Konstantin Tokarev <annulen@yandex.ru>
-
- [cmake] Deduplicated bmalloc/Zone.cpp handling.
- https://bugs.webkit.org/show_bug.cgi?id=158154
-
- Reviewed by Alex Christensen.
-
- File bmalloc/Zone.cpp is required on Darwin irrespectively from what
- port is being built.
-
- Also I removed WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS() because it's
- unlikely that bmalloc will ever need port-specific customizations (as
- opposed to OS-specific customizations which should be done in
- CMakeLists.txt).
-
- * CMakeLists.txt: Added bmalloc/Zone.cpp for Darwin.
- * PlatformGTK.cmake: Removed.
- * PlatformMac.cmake: Removed.
-
-2016-05-22 Brady Eidson <beidson@apple.com>
-
- Move to C++14.
- https://bugs.webkit.org/show_bug.cgi?id=157948
-
- Reviewed by Michael Catanzaro.
-
- * Configurations/Base.xcconfig:
-
-2016-05-17 Geoffrey Garen <ggaren@apple.com>
-
- REGRESSION: JetStream crashes on some iPhones
- https://bugs.webkit.org/show_bug.cgi?id=157814
-
- Reviewed by Michael Saboff.
-
- * bmalloc/Sizes.h: Reduce smallMax to 32kB.
-
- Previous justification for 64kB was:
-
- * bmalloc/Sizes.h: Upped smallMax to 64kB. Upping to 32kB is pretty
- reasonable, since sizes between 16kB and 32kB share page sizes. I went
- all the way up to 64kB because the GC uses 64kB blocks, and also just
- for extra padding to ensure that large allocations are indeed rare.
-
- It turns out that the bump to 64kB substantially increases our memory
- high water mark on JetStream, leading to jetsam crashes. Also, there
- doesn't seem to be a practical performance problem to putting objects in
- the (32kB - 64kB) range in the large allocator.
-
-2016-05-16 Geoffrey Garen <ggaren@apple.com>
-
- REGRESSION (200035): changes in "WebKit Malloc" VM regions are causing 'leaks' to spew "Failed to map remote region" messages
- https://bugs.webkit.org/show_bug.cgi?id=157764
-
- Reviewed by Gavin Barraclough.
-
- We need to allow for guard pages and only report unguarded pages to the
- leaks tool -- otherwise, it will try to remote map our guarded pages,
- and crash.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::tryAllocateLargeChunk):
- (bmalloc::VMHeap::allocateSmallChunk): Adopt the new API for reporting
- a range instead of a Chunk*, and report the unguarded range.
-
- This also fixes a separate bug -- very large allocations would not
- fully participate in pointer scanning because they would only report 2MB
- (chunkSize) in size. This could cause false-positive leak reports.
-
- * bmalloc/Zone.cpp:
- (bmalloc::enumerator): Updated to scan ranges instead of fixed-sized
- Chunk pointers.
-
- * bmalloc/Zone.h:
- (bmalloc::Zone::ranges):
- (bmalloc::Zone::addRange): Store ranges instead of fixed-sized Chunk
- pointers because our VM ranges have variable sizes -- both due to guard
- pages and due to large allocations.
-
- (bmalloc::Zone::chunks): Deleted.
- (bmalloc::Zone::addChunk): Deleted.
-
-2016-05-10 David Kilzer <ddkilzer@apple.com>
-
- bmalloc should automatically disable itself when ThreadSanitizer is used
- <https://webkit.org/b/157527>
-
- Reviewed by Michael Catanzaro.
-
- * bmalloc/Environment.cpp:
- (bmalloc::isASanEnabled): Rename to isSanitizerEnabled.
- (bmalloc::isSanitizerEnabled): Rename from isASanEnabled. Add
- support for detecting ThreadSanitizer.
- (bmalloc::Environment::computeIsBmallocEnabled): Switch from
- isASanEnabled to isSanitizerEnabled.
-
-2016-05-03 Geoffrey Garen <ggaren@apple.com>
-
- Assertion failure in bmalloc::vmRevokePermissions(void*, unsigned long).
- https://bugs.webkit.org/show_bug.cgi?id=157047
-
- Reviewed by Filip Pizlo.
-
- Renamed roundUpToMultipleOfSloppy => roundUpToMultipleOfNonPowerOfTwo.
-
- * bmalloc/Algorithm.h:
- (bmalloc::roundUpToMultipleOfNonPowerOfTwo):
- (bmalloc::roundUpToMultipleOfSloppy): Deleted.
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateSmallChunk):
-
-2016-05-03 Geoffrey Garen <ggaren@apple.com>
-
- Assertion failure in bmalloc::vmRevokePermissions(void*, unsigned long).
- https://bugs.webkit.org/show_bug.cgi?id=157047
-
- Reviewed by Filip Pizlo.
-
- The previous fix aligned the guard page sizes correctly but forgot to
- align the guard page start address correctly.
-
- * bmalloc/Algorithm.h:
- (bmalloc::roundUpToMultipleOfSloppy): Use a new helper method to round
- up when not working with a power of two, instead of writing out the
- math by hand.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateSmallChunk): Make sure to round up the guard
- page start address in addition to its size. Assert at the very end to
- try to catch more bugs.
-
-2016-04-27 Geoffrey Garen <ggaren@apple.com>
-
- Assertion failure in bmalloc::vmRevokePermissions(void*, unsigned long).
- https://bugs.webkit.org/show_bug.cgi?id=157047
-
- Reviewed by Darin Adler.
-
- * bmalloc/Chunk.h:
- (bmalloc::Chunk::Chunk):
- (bmalloc::Chunk::get):
- (bmalloc::Chunk::offset):
- (bmalloc::Chunk::address):
- (bmalloc::Object::Object):
- (bmalloc::Object::address):
- (bmalloc::Object::line):
- (bmalloc::Chunk::object): Deleted.
- (bmalloc::Object::begin): Deleted.
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateSmallBumpRangesByObject):
- * bmalloc/Object.h:
- (bmalloc::Object::chunk):
- (bmalloc::Object::offset): Renamed begin() to address() because this is
- not an iterator.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateSmallChunk): Round up pageSize to a vmPageSize
- multiple because pageSize might be smaller than vmPageSize, but we
- think the VM system requires vmPageSize-aligned values.
-
-2016-04-25 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: vm allocations should plant guard pages
- https://bugs.webkit.org/show_bug.cgi?id=156937
-
- Rolling back in r199936 with a fix for the memory regression.
-
-2016-04-23 Gavin Barraclough <barraclough@apple.com>
-
- bmalloc: vm allocations should plant guard pages
- https://bugs.webkit.org/show_bug.cgi?id=156937
-
- Rolling out - looks like this is memory regression.
-
- * bmalloc/Object.h:
- (bmalloc::Object::operator+):
- (bmalloc::Object::operator<=):
- (bmalloc::Object::operator-): Deleted.
- * bmalloc/VMAllocate.h:
- (bmalloc::vmDeallocate):
- (bmalloc::vmRevokePermissions): Deleted.
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateSmallChunk):
-
-2016-04-22 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: vm allocations should plant guard pages
- https://bugs.webkit.org/show_bug.cgi?id=156937
-
- Reviewed by Michael Saboff.
-
- * bmalloc/Object.h:
- (bmalloc::Object::operator-): Added a - helper.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::vmRevokePermissions): Added a helper to revoke permissions on
- a VM region. We use this for guard pages.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateSmallChunk): Add guard pages to the start and
- end of the chunk.
-
- Note that we don't guard large chunks becuase we need to be able to merge
- them. Otherwise, we will run out of virtual addresses.
-
-2016-04-22 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Constify introspect function pointer table
- https://bugs.webkit.org/show_bug.cgi?id=156936
-
- Reviewed by Michael Saboff.
-
- * bmalloc/Zone.cpp:
- (bmalloc::Zone::Zone): Declaring this function pointer table const puts
- it in the read-only section of the binary, providing a little hardening
- against overwriting the function pointers at runtime. (We have to
- const_cast when assigning because the API declares a pointer to non-const,
- but we happen to know it will never try to write through that pointer.
- This is not my favorite API.)
-
-2016-04-19 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: fix up overflow checks
- https://bugs.webkit.org/show_bug.cgi?id=156780
-
- Reviewed by Mark Lam.
-
- We used to try to avoid overflow in large object math by setting a very
- high limit on the largest large object. But that's a bit error-prone
- since the check is far away from the math that might overflow -- and
- we were missing some cases.
-
- This patch removes the limit and instead checks at each math site.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::tryAllocate):
- (bmalloc::Allocator::allocate):
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::allocateSlowCase): Remove the limit. tryAllocateLarge
- will check for overflow for us.
-
- * bmalloc/Chunk.h: This ASSERT was just totally wrong.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::tryAllocateLarge): Check for overflow when adding.
-
- * bmalloc/Sizes.h:
-
- * bmalloc/VMAllocate.h:
- (bmalloc::tryVMAllocate): Check for overflow when adding.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::tryAllocateLargeChunk): Check for overflow when adding.
-
-2016-04-19 Geoffrey Garen <ggaren@apple.com>
-
- Unreviewed, try to fix an ASSERT seen on the bots.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::tryAllocateLarge): This ASSERT is supposed to be about
- alignment, not size. Oops.
-
-2016-04-19 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Merge the large and xlarge allocators
- https://bugs.webkit.org/show_bug.cgi?id=156734
-
- Reviewed by Andreas Kling.
-
- This give us better defense against worst case memory usage:
-
- Baseline Patch Δ
- Peak Memory:
- nimlang 198,132kB 181,468kB ^ 1.09x smaller
-
- It also eliminates inline metadata for large objects, fixing the
- regression introduced in r198675, and more:
-
- run-malloc-benchmarks Baseline:~/OpenSource/WebKitBuildBaseline/Release/ Patch:~/OpenSource/WebKitBuild/Release/
-
- Baseline Patch Δ
- Memory at End:
- big 10,880kB 3,328kB ^ 3.27x smaller
- facebook 3,112kB 2,868kB ^ 1.09x smaller
- fragment --parallel 1,848kB 760kB ^ 2.43x smaller
- fragment_iterate --parallel 4,908kB 776kB ^ 6.32x smaller
- big --parallel 48,076kB 11,892kB ^ 4.04x smaller
-
- Overall memory use looks OK:
-
- run-malloc-benchmarks --memory_warning Baseline:~/OpenSource/WebKitBuildBaseline/Release/ Patch:~/OpenSource/WebKitBuild/Release/
-
- Baseline Patch Δ
- Memory at End:
- <arithmetic mean> 13,992kB 13,987kB ^ 1.0x smaller
-
- Overall throughput looks OK:
-
- run-malloc-benchmarks Baseline:~/OpenSource/WebKitBuildBaseline/Release/ Patch:~/OpenSource/WebKitBuild/Release/
-
- Baseline Patch Δ
- Execution Time:
- <arithmetic mean> 103ms 104ms ! 1.01x slower
-
- We're a bit slower on the "all-out large allocations on all cores"
- benchmark, but I think that's an OK price to pay:
-
- Baseline Patch Δ
- Execution Time:
- big --parallel 125ms 136ms ! 1.09x slower
-
- This patch net removes 1.5k lines of code. It turns out that large
- allocations are rare, and free memory fragments are also rare, so the
- combination is super rare, and a simple O(n) algorithm that ensures good
- memory behavior is the best option.
-
- Fun fact: In practice, the odds that the old code would save memory
- were *worse* than the odds that it would contain a bug that wasted
- memory. :)
-
- * bmalloc.xcodeproj/project.pbxproj:
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::tryAllocate): largeMax is the new xLargeMax since
- xLargeMax is gone now.
-
- (bmalloc::Allocator::allocate): I moved the rounding code into allocateLarge,
- so we don't have to do it here.
-
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::allocateSlowCase):
- (bmalloc::Allocator::allocateXLarge): Deleted. No more XLarge case.
-
- * bmalloc/Allocator.h:
-
- * bmalloc/BeginTag.h: Removed.
- * bmalloc/BoundaryTag.h: Removed.
-
- * bmalloc/Chunk.h:
- (bmalloc::ChunkHash::hash): Added a hash function. The best hash function
- is a unique and monotonically increasing integer, and that's exactly what
- we typically get from the high bits of a Chunk, since the OS allocates
- Chunks at unique and increasing addresses.
- (bmalloc::Chunk::boundaryTags): Deleted.
- (bmalloc::Chunk::objectType): Deleted.
- (bmalloc::Chunk::beginTag): Deleted.
- (bmalloc::Chunk::endTag): Deleted.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::deallocateSlowCase): We no longer know for sure,
- by looking at its bit pattern, whether a pointer is small or large.
- Instead, any pointer with large alignment *might* be large, and when
- we occasionally encounter such an object, we have to consult a hash
- table in the Heap to find out for sure. This turns out to be just as
- cheap in practice.
-
- We don't deallocate large objects on the fast path anymore. We can't,
- because large objects have out-of-line metadata now.
-
- (bmalloc::Deallocator::deallocateXLarge): Deleted.
-
- * bmalloc/Deallocator.h:
- (bmalloc::Deallocator::deallocateFastCase): See deallocateSlowCase.
-
- * bmalloc/EndTag.h: Removed.
- * bmalloc/FreeList.cpp: Removed.
- * bmalloc/FreeList.h: Removed.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateSmallPage): Be sure to track each chunk in
- the object type map, so we can distinguish small vs large objects.
-
- (bmalloc::Heap::deallocateSmallLine): No need to check object type
- because we know object type now by virtue of being on the small object
- path.
-
- (bmalloc::Heap::splitAndAllocate): Be sure to track each chunk in
- the object type map, so we can distinguish small vs large objects. Large
- objects can split across chunks, so we need to add each large object's
- chunk as it is allocated.
-
- (bmalloc::Heap::tryAllocateLarge):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::isLarge):
- (bmalloc::Heap::largeSize):
- (bmalloc::Heap::shrinkLarge):
- (bmalloc::Heap::deallocateLarge): Merged in existing XLarge logic for
- large objects.
-
- (bmalloc::Heap::scavengeXLargeObjects): Deleted.
- (bmalloc::Heap::allocateXLarge): Deleted.
- (bmalloc::Heap::tryAllocateXLarge): Deleted.
- (bmalloc::Heap::xLargeSize): Deleted.
- (bmalloc::Heap::shrinkXLarge): Deleted.
- (bmalloc::Heap::deallocateXLarge): Deleted.
-
- * bmalloc/Heap.h:
- (bmalloc::Heap::LargeObjectHash::hash):
-
- * bmalloc/LargeObject.h: Removed.
-
- * bmalloc/Map.h: Added.
- (bmalloc::Map::size):
- (bmalloc::Map::capacity):
- (bmalloc::Map::get):
- (bmalloc::Map::set):
- (bmalloc::Map::remove):
- (bmalloc::Map::shouldGrow):
- (bmalloc::Map::shouldShrink):
- (bmalloc::Map::find):
- (bmalloc::Hash>::rehash): Simple hash table.
-
- * bmalloc/Object.h:
-
- * bmalloc/ObjectType.cpp:
- (bmalloc::objectType):
- * bmalloc/ObjectType.h:
- (bmalloc::mightBeLarge): See deallocateSlowCase.
- (bmalloc::isXLarge): Deleted.
-
- * bmalloc/SegregatedFreeList.cpp: Removed.
- * bmalloc/SegregatedFreeList.h: Removed.
-
- * bmalloc/Sizes.h: Upped smallMax to 64kB. Upping to 32kB is pretty
- reasonable, since sizes between 16kB and 32kB share page sizes. I went
- all the way up to 64kB because the GC uses 64kB blocks, and also just
- for extra padding to ensure that large allocations are indeed rare.
-
- * bmalloc/SortedVector.h: Removed.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::tryAllocateLargeChunk):
- (bmalloc::VMHeap::allocateSmallChunk):
- (bmalloc::VMHeap::VMHeap): Deleted.
- (bmalloc::VMHeap::allocateChunk): Deleted.
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::deallocateSmallPage):
- (bmalloc::VMHeap::allocateLargeObject): Deleted.
- (bmalloc::VMHeap::deallocateLargeObject): Deleted. Nixed all the boundary
- tag logic since metadata is out of line now.
-
- * bmalloc/VMState.h: Removed. Instead of an abstract state, we track
- the precise amount of committed physical pages at the head of a VM
- range. This allows us to merge aggressively without triggering an madvise
- storm most of the time.
-
- * bmalloc/Vector.h:
- (bmalloc::Vector<T>::Vector):
- (bmalloc::Vector<T>::insert):
- (bmalloc::Vector<T>::remove):
- (bmalloc::Vector<T>::resize): Filled out some missing helpers.
-
- * bmalloc/XLargeMap.cpp:
- (bmalloc::XLargeMap::remove):
- (bmalloc::XLargeMap::add):
- (bmalloc::XLargeMap::removePhysical):
- (bmalloc::XLargeMap::takeFree): Deleted.
- (bmalloc::XLargeMap::addFree): Deleted.
- (bmalloc::XLargeMap::addAllocated): Deleted.
- (bmalloc::XLargeMap::getAllocated): Deleted.
- (bmalloc::XLargeMap::takeAllocated): Deleted.
- (bmalloc::XLargeMap::shrinkToFit): Deleted.
- (bmalloc::XLargeMap::takePhysical): Deleted.
- (bmalloc::XLargeMap::addVirtual): Deleted.
- * bmalloc/XLargeMap.h:
- (bmalloc::XLargeMap::Allocation::operator<): Deleted. We don't track
- object sizes anymore -- just free space. (The Heap tracks object sizes.)
- We use plain old linear search for free space. (See intro.)
-
- * bmalloc/XLargeRange.h:
- (bmalloc::XLargeRange::physicalSize):
- (bmalloc::XLargeRange::setPhysicalSize):
- (bmalloc::merge):
- (bmalloc::XLargeRange::split):
- (bmalloc::XLargeRange::vmState): Deleted.
- (bmalloc::XLargeRange::setVMState): Deleted. See VMState.h.
-
-2016-04-11 Fujii Hironori <Hironori.Fujii@jp.sony.com>
-
- [CMake] Make FOLDER property INHERITED
- https://bugs.webkit.org/show_bug.cgi?id=156460
-
- Reviewed by Brent Fulgham.
-
- * CMakeLists.txt:
- Set FOLDER property as a directory property not a target property
-
-2016-04-08 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: stress_aligned test fails if you increase smallMax
- https://bugs.webkit.org/show_bug.cgi?id=156414
-
- Reviewed by Oliver Hunt.
-
- When size exceeds alignment and is a multiple of alignment and is not
- a power of two, such as 24kB with 8kB alignment, the small allocator
- did not always guarantee alignment. Let's fix that.
-
- * bmalloc/Algorithm.h:
- (bmalloc::divideRoundingUp): Math is hard.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate): Align to the page size unconditionally.
- Even if the page size is not a power of two, it might be a multiple of
- a power of two, and we want alignment to that smaller power of two to
- be guaranteed.
-
-2016-04-06 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: handle aligned allocations on the fast path
- https://bugs.webkit.org/show_bug.cgi?id=156302
-
- Reviewed by Michael Saboff.
-
- This helps keep the JavaScriptCore GC on the fast path, and it also
- helps avoid fragmentation on our website stress test:
-
- nimlang 209,584kB 198,076kB ^ 1.06x smaller
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate): Because we arrange for power-of-two size
- classes to allocate at power-of-two alignments, we can allocate any
- small aligned request on the small path.
-
- * bmalloc/Chunk.h:
- (bmalloc::Chunk::bytes):
- (bmalloc::Chunk::lines):
- (bmalloc::Chunk::pages):
- (bmalloc::Chunk::boundaryTags):
- (bmalloc::Chunk::objectType): Moved some code around to provide better
- API.
-
- (bmalloc::Chunk::Chunk): Moved this code to VMHeap.
-
- (bmalloc::Chunk::offset):
- (bmalloc::Chunk::object): Use our new bytes() helper function.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateChunk): Moved code here from Chunk.
-
- (bmalloc::VMHeap::allocateSmallChunk): Ensure that power-of-two page
- sizes always begin allocation at the same alignment. Power-of-two object
- sizes always request power-of-two page sizes (since that's the least
- wasteful option), so if we also ensure that power-of-two page sizes get
- power-of-two alignment, then everything is aligned for all small objects.
-
-2016-04-03 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: segregate small and large objects again, and allocate more objects on the small path
- https://bugs.webkit.org/show_bug.cgi?id=156152
-
- Reviewed by Sam Weinig.
-
- Microbenchmark data suggested that it was a good idea for small and large
- objects to share memory. But r198675 did not improve memory use in
- full browser benchmarks.
-
- This patch reverts to segregating small and large objects -- but without
- going back to doubled VM usage -- in order to capture a few benefits:
-
- (*) Small pages fragment the large heap. Separating them out saves a lot
- of memory in our worst case fragmentation recording:
-
- nimlang 276,076kB 209,636kB ^ 1.32x smaller
-
- (*) Small objects are common enough that even their slow paths benefit
- from simpler code:
-
- Execution Time:
- ...
- facebook 234ms 216ms ^ 1.08x faster
- reddit 114ms 108ms ^ 1.06x faster
- flickr 118ms 111ms ^ 1.06x faster
- theverge 146ms 140ms ^ 1.04x faster
- ...
- <arithmetic mean> 107ms 102ms ^ 1.04x faster
-
- (*) We can use less metadata:
-
- Memory at End:
- ...
- list_allocate 460kB 384kB ^ 1.2x smaller
- tree_allocate 492kB 424kB ^ 1.16x smaller
- tree_churn 480kB 404kB ^ 1.19x smaller
- fragment 532kB 452kB ^ 1.18x smaller
- fragment_iterate 712kB 588kB ^ 1.21x smaller
- medium 15,152kB 11,796kB ^ 1.28x smaller
- big 15,044kB 10,976kB ^ 1.37x smaller
- ...
- <arithmetic mean> 7,724kB 7,190kB ^ 1.07x smaller
-
- This patch also takes advantage of our support for varying the page size
- at runtime by allocating more objects on the small object path:
-
- medium 178ms 150ms ^ 1.19x faster
-
- Some microbenchmarks report memory use increases from this change -- like
- they reported memory use decreases from r198675 -- but I'm ignoring them
- for now because I expect our full browser memory benchmarks to confirm
- that this patch is fine.
-
- * bmalloc/BumpAllocator.h:
- (bmalloc::BumpAllocator::BumpAllocator): Use a full unsigned because we
- can allocate objects larger than 16kB - 1, and a full unsigned does not
- make BumpAllocator any larger on 64bit systems.
-
- * bmalloc/Chunk.h:
- (bmalloc::Chunk::begin):
- (bmalloc::Chunk::end):
- (bmalloc::Chunk::size):
- (bmalloc::Chunk::objectType): Store ObjectType in the Chunk, since it only
- varies by Chunk now, and not from page to page within a Chunk. Also,
- union together small and large object metadata, since we will only use
- one or the other. This saves memory.
-
- (bmalloc::Chunk::Chunk): Conditionalize initialization based on object
- type, since only one kind of metadata or the other can be used at runtime.
-
- (bmalloc::Object::Object):
- (bmalloc::Object::begin):
- (bmalloc::SmallPage::end): Deleted.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::initializeLineMetadata): Save a little space, since we
- know that lines are only 256 bytes long.
-
- (bmalloc::Heap::initializePageMetadata): Store a dynamic page size for
- each size class. We used to use only one page size (the system page size)
- but that limited our ability to allocate objects larger than 1kB on the
- small object path. Now we can handle any object size we want by storing
- objects of that size in a custom page size.
-
- (bmalloc::Heap::concurrentScavenge):
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::scavengeSmallPages): Revert to our old linked list
- strategy for storing small pages.
-
- (bmalloc::Heap::splitAndAllocate): Object type is per Chunk now.
-
- (bmalloc::Heap::allocateLarge): Don't nuke the small page list when
- allocating a large object because the two don't share memory anymore.
-
- (bmalloc::Heap::allocateSmallPage): Revert to our old linked list
- strategy for storing small pages.
-
- (bmalloc::Heap::deallocateSmallLine): Don't return early in the case
- where this is the first free object in the page. In the case of large-ish
- objects, the first free object might also be the last free object,
- since there's one object per page.
-
- (bmalloc::Heap::allocateSmallBumpRangesByMetadata): Split out some helper
- lambdas to make this code clearer.
-
- (bmalloc::Heap::allocateSmallBumpRangesByObject): Added a fast scan
- for objects larger than the line size. When multiple objects fit in
- a single line, it's an optimization to scan a line at a time. But when
- it's one object per line, or one object per 64 lines, it's better just
- to scan an object at a time.
-
- * bmalloc/Heap.h:
- (bmalloc::Heap::allocateSmallBumpRanges):
- (bmalloc::Heap::derefSmallLine): Match the changes above.
-
- * bmalloc/LineMetadata.h: We weren't using all those bits.
-
- * bmalloc/List.h:
- (bmalloc::List::remove): Put a removed Node fully back into the default
- (empty) state it was in before it entered the list. This change is not
- observable, but it makes things clearer when you're debugging.
-
- * bmalloc/Object.h:
- (bmalloc::Object::Object):
- (bmalloc::Object::chunk):
- (bmalloc::Object::offset):
- (bmalloc::Object::operator+):
- (bmalloc::Object::operator<=): Added some helpers for iterating by object.
-
- * bmalloc/ObjectType.cpp:
- (bmalloc::objectType): Updated for API change.
-
- * bmalloc/Sizes.h:
- (bmalloc::Sizes::maskObjectSize):
- (bmalloc::Sizes::objectSize):
- (bmalloc::Sizes::pageSize): Support more page sizes.
-
- * bmalloc/SmallPage.h:
- (bmalloc::SmallPage::SmallPage):
- (bmalloc::SmallPage::objectType): Deleted.
- (bmalloc::SmallPage::setObjectType): Deleted.
- (bmalloc::SmallPage::smallPageCount): Deleted.
- (bmalloc::SmallPage::setSmallPageCount): Deleted. Object type is per
- Chunk now, and we can infer page count from size class.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateChunk):
- (bmalloc::VMHeap::allocateSmallChunk):
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateSmallPage):
- (bmalloc::VMHeap::deallocateSmallPage):
- (bmalloc::VMHeap::allocateLargeObject): Support our old behavior of
- storing free pages in linked lists.
-
-2016-03-29 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: support physical page sizes that don't match the virtual page size (take 2)
- https://bugs.webkit.org/show_bug.cgi?id=156003
-
- Reviewed by Andreas Kling.
-
- This is a memory savings on iOS devices where the virtual page size
- is 16kB but the physical page size is 4kB.
-
- Take 1 was a memory regression on 16kB virtual / 16kB physical systems
- because it used a 4kB page size within a 16kB page size, allowing up to
- 4 different object types to mix within a physical page. Because objects
- of the same type tend to deallocate at the same time, mixing objects of
- different types made pages less likely to become completely empty.
-
- (Take 1 also had a bug where it used a platform #ifdef that didn't exist.
- Oops.)
-
- Take 2 allocates units of SmallPages equal to the physical page size.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::initializeLineMetadata):
- (bmalloc::Heap::allocateSmallBumpRanges):
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateXLarge):
- (bmalloc::Heap::shrinkXLarge):
- * bmalloc/Heap.h: Use the physical page size for our VM operations because
- we're only concerned with returning physical pages to the OS.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::vmPageSize):
- (bmalloc::vmPageShift):
- (bmalloc::vmSize):
- (bmalloc::vmValidate):
- (bmalloc::vmPageSizePhysical):
- (bmalloc::vmValidatePhysical):
- (bmalloc::tryVMAllocate):
- (bmalloc::vmDeallocatePhysicalPages):
- (bmalloc::vmAllocatePhysicalPages):
- (bmalloc::vmDeallocatePhysicalPagesSloppy):
- (bmalloc::vmAllocatePhysicalPagesSloppy): Use the physical page size.
-
-2016-03-29 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: page size should be configurable at runtime
- https://bugs.webkit.org/show_bug.cgi?id=155993
-
- Reviewed by Andreas Kling.
-
- This is a memory win on 32bit iOS devices, since their page sizes are
- 4kB and not 16kB.
-
- It's also a step toward supporting 64bit iOS devices that have a
- 16kB/4kB virtual/physical page size split.
-
- * bmalloc/Chunk.h: Align to largeAlignment since 2 * smallMax isn't
- required by the boundary tag allocator.
-
- (bmalloc::Chunk::page): Account for the slide when accessing a page.
- Each SmallPage hashes 4kB of memory. When we want to allocate a region
- of memory larger than 4kB, we store our metadata in the first SmallPage
- in the region and we assign a slide to the remaining SmallPages, so
- they forward to that first SmallPage when accessed.
-
- NOTE: We could use a less flexible technique that just hashed by
- vmPageSize() instead of 4kB at runtime, with no slide, but I think we'll
- be able to use this slide technique to make even more page sizes
- dynamically at runtime, which should save some memory and simplify
- the allocator.
-
- (bmalloc::SmallPage::begin): It's invalid to access a SmallPage with
- a slide, since such SmallPages do not contain meaningful data.
-
- (bmalloc::SmallPage::end): Account for smallPageCount when computing
- the size of a page.
-
- (bmalloc::Chunk::pageBegin): Deleted.
- (bmalloc::Chunk::pageEnd): Deleted.
- (bmalloc::Object::pageBegin): Deleted.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap): Cache vmPageSize because computing it might require
- a syscall.
-
- (bmalloc::Heap::initializeLineMetadata): Line metadata is a vector instead
- of a 2D array because we don't know how much metadata we'll need until
- we know the page size.
-
- (bmalloc::Heap::scavengeSmallPage): Be sure to revert the slide when
- deallocating a page. Otherwise, the next attempt to allocate the page
- will slide when initializing it, sliding to nowhere.
-
- (bmalloc::Heap::allocateSmallBumpRanges): Account for vector change to
- line metadata.
-
- (bmalloc::Heap::allocateSmallPage): Initialize slide and smallPageCount
- since they aren't constant anymore.
-
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateXLarge):
- (bmalloc::Heap::shrinkXLarge): Adopt dynamic page size.
-
- * bmalloc/Heap.h:
-
- * bmalloc/Sizes.h: smallPageSize is no longer equal to the VM page
- size -- it's just the smallest VM page size we're interested in supporting.
-
- * bmalloc/SmallPage.h:
- (bmalloc::SmallPage::slide):
- (bmalloc::SmallPage::setSlide):
- (bmalloc::SmallPage::smallPageCount):
- (bmalloc::SmallPage::setSmallPageCount):
- (bmalloc::SmallPage::ref):
- (bmalloc::SmallPage::deref): Support slide and small page count as
- dynamic values. This doesn't increase metadata size since sizeof(SmallPage)
- rounds up to alignment anyway.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::vmPageSize):
- (bmalloc::vmPageShift):
- (bmalloc::vmSize):
- (bmalloc::vmValidate):
- (bmalloc::tryVMAllocate):
- (bmalloc::vmDeallocatePhysicalPagesSloppy):
- (bmalloc::vmAllocatePhysicalPagesSloppy): Treat page size as a variable.
-
- * bmalloc/Vector.h:
- (bmalloc::Vector::initialCapacity):
- (bmalloc::Vector<T>::insert):
- (bmalloc::Vector<T>::grow):
- (bmalloc::Vector<T>::shrink):
- (bmalloc::Vector<T>::shrinkCapacity):
- (bmalloc::Vector<T>::growCapacity): Treat page size as a variable.
-
-2016-03-29 David Kilzer <ddkilzer@apple.com>
-
- bmalloc: add logging for mmap() failures
- <http://webkit.org/b/155409>
- <rdar://problem/24568515>
-
- Reviewed by Saam Barati.
-
- This patch causes additional logging to be generated on internal
- iOS builds when mmap() fails. We are trying to track down an
- issue where the WebContent process runs out of VM address space
- before it is killed by jetsam.
-
- * CMakeLists.txt: Add Logging.cpp.
- * bmalloc.xcodeproj/project.pbxproj: Add new files.
-
- * bmalloc/BAssert.h:
- (RELEASE_BASSERT_WITH_MESSAGE): Add macro.
- * bmalloc/Logging.cpp: Added.
- (bmalloc::logVMFailure): Implementation.
- * bmalloc/Logging.h: Added.
- (bmalloc::logVMFailure): Declaration.
- * bmalloc/VMAllocate.h:
- (bmalloc::tryVMAllocate): Call logVMFailure() on mmap() failure.
- * bmalloc/darwin/BSoftLinking.h: Copied from Source/WebCore/platform/mac/SoftLinking.h.
-
-2016-03-26 Geoffrey Garen <ggaren@apple.com>
-
- Unreviewed, rolling out r198702, r198704.
-
- Caused a memory regression on PLUM.
-
- Reverted changeset:
-
- bmalloc: fix an ASSERT on iOS
- https://bugs.webkit.org/show_bug.cgi?id=155911
- http://trac.webkit.org/changeset/198704
-
- bmalloc: support physical page sizes that don't match the virtual page size
- https://bugs.webkit.org/show_bug.cgi?id=155898
- http://trac.webkit.org/changeset/198702
-
-2016-03-25 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: fix an ASSERT on iOS
- https://bugs.webkit.org/show_bug.cgi?id=155911
-
- Reviewed by Gavin Barraclough.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::vmValidatePhysical): Call through to vmValidatePhysical because
- the vmValidate function validates virtual sizes rather than physical
- sizes.
-
-2016-03-25 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: support physical page sizes that don't match the virtual page size
- https://bugs.webkit.org/show_bug.cgi?id=155898
-
- Reviewed by Gavin Barraclough.
-
- This is a memory savings on iOS devices where the virtual page size
- is 16kB but the physical page size is 4kB.
-
- * bmalloc/Chunk.h:
- (bmalloc::Chunk::Chunk): smallPageSize is now unrelated to the OS's
- page size -- it just reflects the optimal unit of memory to recycle
- between small objects.
-
- We only need to round up to largeAlignment because small objects allocate
- as subsets of large objects now.
-
- (bmalloc::Chunk::page):
- (bmalloc::Object::pageBegin):
- (bmalloc::Object::line): Adopt smallPageSize.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::initializeLineMetadata):
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::allocateLarge): Adopt smallPageSize.
-
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::tryAllocateXLarge):
- (bmalloc::Heap::shrinkXLarge): Adopt vmPageSizePhysical(). We want the
- physical page size because that's the unit at which the hardware MMU
- will recycle memory.
-
- * bmalloc/Sizes.h: Adopt smallPageSize.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::vmPageSizePhysical):
- (bmalloc::vmPageSize): Distinguish between page size, which is the virtual
- memory page size advertised by the OS, and physical page size, which the
- true hardware page size.
-
- (bmalloc::vmSize):
- (bmalloc::vmValidate):
- (bmalloc::vmValidatePhysical):
- (bmalloc::tryVMAllocate):
- (bmalloc::vmDeallocatePhysicalPages):
- (bmalloc::vmAllocatePhysicalPages):
- (bmalloc::vmDeallocatePhysicalPagesSloppy):
- (bmalloc::vmAllocatePhysicalPagesSloppy): Adopt vmPageSize() and
- vmPageSizePhyiscal().
-
- * bmalloc/Vector.h:
- (bmalloc::Vector::initialCapacity):
- (bmalloc::Vector<T>::shrink):
- (bmalloc::Vector<T>::shrinkCapacity):
- (bmalloc::Vector<T>::growCapacity): Adopt vmPageSize(). We'd prefer to
- use vmPageSizePhysical() but mmap() doesn't support it.
-
- * bmalloc/XLargeMap.cpp: #include.
-
-2016-03-25 Geoffrey Garen <ggaren@apple.com>
-
- Unreviewed, rolling in r198679.
-
- r198679 was just a rename. The regression was caused by r198675 and then
- fixed in r198693.
-
- Restored changeset:
-
- "bmalloc: Renamed LargeChunk => Chunk"
- https://bugs.webkit.org/show_bug.cgi?id=155894
- http://trac.webkit.org/changeset/198679
-
-2016-03-25 Geoffrey Garen <ggaren@apple.com>
-
- Unreviewed, try to fix a crash seen on the bots.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate): We have to take the lock even if we're
- only reading our own data becuse LargeObject contains validation code
- that will read our neighbors' data as well.
-
-2016-03-25 Ryan Haddad <ryanhaddad@apple.com>
-
- Unreviewed, rolling out r198679.
-
- This change caused flaky LayoutTest crashes
-
- Reverted changeset:
-
- "bmalloc: Renamed LargeChunk => Chunk"
- https://bugs.webkit.org/show_bug.cgi?id=155894
- http://trac.webkit.org/changeset/198679
-
-2016-03-25 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: stress_aligned fails when allocating a zero-sized object with XLarge alignment
- https://bugs.webkit.org/show_bug.cgi?id=155896
-
- Reviewed by Andreas Kling.
-
- We normally filter zero-sized allocations into small allocations, but
- a zero-sized allocation can sneak through if it requires sufficiently
- large alignment.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::tryAllocateXLarge): Set a floor on allocation size to
- catch zero-sized allocations.
-
-2016-03-25 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Renamed LargeChunk => Chunk
- https://bugs.webkit.org/show_bug.cgi?id=155894
-
- Reviewed by Michael Saboff.
-
- A Chunk can contain both small and large objects now.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate):
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::isFree):
- * bmalloc/Chunk.h: Copied from Source/bmalloc/bmalloc/LargeChunk.h.
- (bmalloc::Chunk::pages):
- (bmalloc::Chunk::begin):
- (bmalloc::Chunk::end):
- (bmalloc::Chunk::Chunk):
- (bmalloc::Chunk::get):
- (bmalloc::Chunk::beginTag):
- (bmalloc::Chunk::endTag):
- (bmalloc::Chunk::offset):
- (bmalloc::Chunk::object):
- (bmalloc::Chunk::page):
- (bmalloc::Chunk::line):
- (bmalloc::SmallLine::begin):
- (bmalloc::SmallPage::begin):
- (bmalloc::SmallPage::end):
- (bmalloc::Object::Object):
- (bmalloc::Object::begin):
- (bmalloc::LargeChunk::pages): Deleted.
- (bmalloc::LargeChunk::begin): Deleted.
- (bmalloc::LargeChunk::end): Deleted.
- (bmalloc::LargeChunk::LargeChunk): Deleted.
- (bmalloc::LargeChunk::get): Deleted.
- (bmalloc::LargeChunk::beginTag): Deleted.
- (bmalloc::LargeChunk::endTag): Deleted.
- (bmalloc::LargeChunk::offset): Deleted.
- (bmalloc::LargeChunk::object): Deleted.
- (bmalloc::LargeChunk::page): Deleted.
- (bmalloc::LargeChunk::line): Deleted.
- * bmalloc/Deallocator.cpp:
- * bmalloc/FreeList.cpp:
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateLarge):
- * bmalloc/LargeChunk.h: Removed.
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::LargeObject):
- (bmalloc::LargeObject::merge):
- (bmalloc::LargeObject::split):
- * bmalloc/Object.h:
- (bmalloc::Object::chunk):
- * bmalloc/ObjectType.cpp:
- * bmalloc/Sizes.h:
- * bmalloc/SmallAllocator.h: Removed.
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::VMHeap):
- (bmalloc::VMHeap::allocateChunk):
- (bmalloc::VMHeap::allocateLargeChunk): Deleted.
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateLargeObject):
- (bmalloc::VMHeap::deallocateLargeObject):
- * bmalloc/Zone.cpp:
- (bmalloc::enumerator):
- * bmalloc/Zone.h:
- (bmalloc::Zone::chunks):
- (bmalloc::Zone::addChunk):
- (bmalloc::Zone::largeChunks): Deleted.
- (bmalloc::Zone::addLargeChunk): Deleted.
-
-2016-03-24 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: small and large objects should share memory
- https://bugs.webkit.org/show_bug.cgi?id=155866
-
- Reviewed by Andreas Kling.
-
- This patch cuts our VM footprint in half. (VM footprint usually doesn't
- matter, but on iOS there's an artificial VM limit around 700MB, and if
- you hit it you jetsam / crash.)
-
- It's also a step toward honoring the hardware page size at runtime,
- which will reduce memory usage on iOS.
-
- This patch is a small improvement in peak memory usage because it allows
- small and large objects to recycle each other's memory. The tradeoff is
- that we require more metadata, which causes more memory usage after
- shrinking down from peak memory usage. In the end, we have some memory
- wins and some losses, and a small win in the mean on our standard memory
- benchmarks.
-
- * bmalloc.xcodeproj/project.pbxproj: Removed SuperChunk.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate): Adopt a new Heap API for shrinking
- large objects because it's a little more complicated than it used to be.
-
- Don't check for equality in the XLarge case because we don't do it in
- other cases, and it's unlikely that we'll be called for no reason.
-
- * bmalloc/BumpAllocator.h:
- (bmalloc::BumpAllocator::allocate): Don't ASSERT isSmall because that's
- an old concept from when small and large objects were in distinct memory
- regions.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::deallocateSlowCase): Large objects are not
- segregated anymore.
-
- (bmalloc::Deallocator::deallocateLarge): Deleted.
-
- * bmalloc/Deallocator.h:
- (bmalloc::Deallocator::deallocateFastCase): Don't ASSERT isSmall(). See
- above.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::scavengeSmallPage):
- (bmalloc::Heap::scavengeSmallPages): New helpers for returning cached
- small pages to the large object heap.
-
- (bmalloc::Heap::allocateSmallPage): Allocate small pages from the large
- object heap. This is how we accomplish sharing.
-
- (bmalloc::Heap::deallocateSmallLine): Handle large objects since we can
- encounter them on this code path now.
-
- (bmalloc::Heap::splitAndAllocate): Fixed a bug where we would sometimes
- not split even though we could.
-
- Allocating a large object also requires ref'ing its small line so that
- we can alias memory between small and large objects.
-
- (bmalloc::Heap::allocateLarge): Return cached small pages before
- allocating a large object that would fit in a cached small page. This
- allows some large allocations to reuse small object memory.
-
- (bmalloc::Heap::shrinkLarge): New helper.
-
- (bmalloc::Heap::deallocateLarge): Deleted.
-
- * bmalloc/Heap.h:
-
- * bmalloc/LargeChunk.h:
- (bmalloc::LargeChunk::pageBegin):
- (bmalloc::LargeChunk::pageEnd):
- (bmalloc::LargeChunk::lines):
- (bmalloc::LargeChunk::pages):
- (bmalloc::LargeChunk::begin):
- (bmalloc::LargeChunk::end):
- (bmalloc::LargeChunk::LargeChunk):
- (bmalloc::LargeChunk::get):
- (bmalloc::LargeChunk::endTag):
- (bmalloc::LargeChunk::offset):
- (bmalloc::LargeChunk::object):
- (bmalloc::LargeChunk::page):
- (bmalloc::LargeChunk::line):
- (bmalloc::SmallLine::begin):
- (bmalloc::SmallLine::end):
- (bmalloc::SmallPage::begin):
- (bmalloc::SmallPage::end):
- (bmalloc::Object::Object):
- (bmalloc::Object::begin):
- (bmalloc::Object::pageBegin):
- (bmalloc::Object::line):
- (bmalloc::Object::page): I merged all the SmallChunk metadata and code
- into LargeChunk. Now we use a single class to track both small and large
- metadata, so we can share memory between small and large objects.
-
- I'm going to rename this class to Chunk in a follow-up patch.
-
- * bmalloc/Object.h:
- (bmalloc::Object::chunk): Updated for LargeChunk transition.
-
- * bmalloc/ObjectType.cpp:
- (bmalloc::objectType):
- * bmalloc/ObjectType.h:
- (bmalloc::isXLarge):
- (bmalloc::isSmall): Deleted. The difference between small and large
- objects is now stored in metadata and is not a property of their
- virtual address range.
-
- * bmalloc/SegregatedFreeList.h: One more entry because we cover all of
- what used to be the super chunk in a large chunk now.
-
- * bmalloc/Sizes.h: Removed bit masking helpers because we don't use
- address masks to distinguish small vs large object type anymore.
-
- * bmalloc/SmallChunk.h: Removed.
-
- * bmalloc/SmallPage.h:
- (bmalloc::SmallPage::SmallPage): Store object type per page because any
- given page can be used for large objects or small objects.
-
- * bmalloc/SuperChunk.h: Removed.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::VMHeap):
- (bmalloc::VMHeap::allocateLargeChunk):
- (bmalloc::VMHeap::allocateSmallChunk): Deleted.
- (bmalloc::VMHeap::allocateSuperChunk): Deleted.
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateLargeObject):
- (bmalloc::VMHeap::deallocateLargeObject):
- (bmalloc::VMHeap::allocateSmallPage): Deleted.
- (bmalloc::VMHeap::deallocateSmallPage): Deleted. Removed super chunk and
- small chunk support.
-
- * bmalloc/Zone.cpp:
- (bmalloc::enumerator):
- * bmalloc/Zone.h:
- (bmalloc::Zone::largeChunks):
- (bmalloc::Zone::addLargeChunk):
- (bmalloc::Zone::superChunks): Deleted.
- (bmalloc::Zone::addSuperChunk): Deleted. Removed super chunk and
- small chunk support.
-
-2016-03-23 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Added an Object helper class
- https://bugs.webkit.org/show_bug.cgi?id=155818
-
- Reviewed by Gavin Barraclough.
-
- Object is an abstraction that breaks out a void* into its component
- metadata pointers.
-
- This is slightly faster than recomputing them, and it enables a future
- patch in which Object will tell us whether it is small or large.
-
- * bmalloc.xcodeproj/project.pbxproj: Added to the project.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate): Use Object to compute size.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::processObjectLog):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::deallocateSmallLine):
- * bmalloc/Heap.h:
- (bmalloc::Heap::derefSmallLine): Use Object to deallocate.
-
- * bmalloc/Object.h: Added.
- (bmalloc::Object::Object):
- (bmalloc::Object::chunk):
- (bmalloc::Object::line):
- (bmalloc::Object::page): Helper class to break out a void* into its
- component metadata pointers.
-
- * bmalloc/SmallChunk.h:
- (bmalloc::SmallChunk::SmallChunk): SmallPage::get doesn't exist anymore
- so we use our new helper functions instead.
-
- (bmalloc::SmallChunk::offset):
- (bmalloc::SmallChunk::object):
- (bmalloc::SmallChunk::page):
- (bmalloc::SmallChunk::line):
- (bmalloc::SmallLine::begin):
- (bmalloc::SmallLine::end):
- (bmalloc::SmallPage::begin): New helpers that operate on the data
- stored in Object.
-
- (bmalloc::SmallLine::get): Deleted.
- (bmalloc::SmallPage::get): Deleted.
-
- * bmalloc/SmallLine.h:
- (bmalloc::SmallLine::refCount): Added a default ref value for convenience.
-
- * bmalloc/SmallPage.h:
- (bmalloc::SmallPage::SmallPage):
-
-2016-03-23 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: process the object log before asking for new memory
- https://bugs.webkit.org/show_bug.cgi?id=155801
-
- Reviewed by Gavin Barraclough.
-
- This is a step toward merging large and small objects: In future, if we
- have large objects in the log, we need to process them right away to
- avoid pushing up peak memory use.
-
- But it also appears to be a speedup and memory use improvement now.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate):
- (bmalloc::Allocator::refillAllocatorSlowCase):
- (bmalloc::Allocator::allocateLarge): Process the log before asking for
- more memory.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSlowCase):
- * bmalloc/Deallocator.h: Provide a public API for processing the object log.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateSmallPage): Pop fragmented pages from the front
- instead of from the back. This resolves a regression on tree_churn
- --parallel. Popping from the front gives us the oldest pages. The oldest
- pages have had the most time to accumulate free lines. They are therefore
- the least fragmented on average.
-
- * bmalloc/List.h:
- (bmalloc::List::popFront):
- (bmalloc::List::insertAfter): New API to pop from front.
-
-2016-03-22 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: use a log scale for large-ish size classes
- https://bugs.webkit.org/show_bug.cgi?id=155770
-
- Reviewed by Michael Saboff.
-
- At larger sizes, precise allocation sizes don't save much memory -- and
- they can cost memory when objects of distinct size classes can't
- allocate together.
-
- This is a small savings up to our current allocation limits, and it may
- enable changing those limits in the long term.
-
- * bmalloc/Algorithm.h:
- (bmalloc::log2): We use this to compute large-ish size classes.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator): Iterate by size class instead of by
- object size so we can change object size limits without breaking stuff.
-
- (bmalloc::Allocator::scavenge): Ditto.
-
- (bmalloc::Allocator::allocateLogSizeClass): New helper function for
- allocating based on log size classes.
-
- (bmalloc::Allocator::allocateSlowCase): Account for extra size class
- possibilities.
-
- * bmalloc/Allocator.h:
- (bmalloc::Allocator::allocateFastCase): We only handle up to 512b on
- the fastest fast path now.
-
- * bmalloc/BumpAllocator.h:
- (bmalloc::BumpAllocator::validate): Deleted. I noticed that this function
- had been refactored not to do anything anymore.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::initializeLineMetadata): Iterate by size class. (See
- Allocator::Allocator.)
-
- * bmalloc/Heap.h: Use the sizeClassCount constant instead of hard coding
- things.
-
- * bmalloc/Sizes.h:
- (bmalloc::Sizes::maskSizeClass):
- (bmalloc::Sizes::maskObjectSize):
- (bmalloc::Sizes::logSizeClass):
- (bmalloc::Sizes::logObjectSize):
- (bmalloc::Sizes::sizeClass):
- (bmalloc::Sizes::objectSize): Separate size class calculation between
- simple size classes that can be computed with a mask and are 8-byte-precise
- and complex size classes that require more math and are less precise.
-
- * bmalloc/SmallLine.h:
- (bmalloc::SmallLine::ref):
- * bmalloc/SmallPage.h:
- (bmalloc::SmallPage::SmallPage):
- (bmalloc::SmallPage::ref):
- (bmalloc::SmallPage::deref): Cleaned up some ASSERTs that triggered
- while working on this patch.
-
- * bmalloc/Zone.cpp:
- (bmalloc::statistics):
- (bmalloc::zoneSize):
- (bmalloc::Zone::Zone):
- (bmalloc::size): Deleted. Renamed these symbols to work around an lldb
- bug that makes it impossible to print out variables named 'size' -- which
- can be a problem when working on malloc.
-
-2016-03-22 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: shrink largeMax
- https://bugs.webkit.org/show_bug.cgi?id=155759
-
- Reviewed by Michael Saboff.
-
- If a largeChunk contains N bytes and we allocate objects of size
- N / 2 + 8 bytes, then we waste 50% of physical memory at peak.
-
- This patch sets largeMax to N / 2, reducing maximum waste to 25%.
-
- * bmalloc/BoundaryTag.h:
- * bmalloc/LargeChunk.h:
- (bmalloc::LargeChunk::LargeChunk):
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::SegregatedFreeList):
- (bmalloc::SegregatedFreeList::insert): Honor largeMax vs largeObjectMax.
-
- * bmalloc/Sizes.h: Distinguish between the largest thing we can store
- in a free list (largeObjectMax) and the largest thing we're willing to
- allocate (largeMax).
-
-2016-03-20 Dan Bernstein <mitz@apple.com>
-
- [Mac] Determine TARGET_MAC_OS_X_VERSION_MAJOR from MACOSX_DEPLOYMENT_TARGET rather than from MAC_OS_X_VERSION_MAJOR
- https://bugs.webkit.org/show_bug.cgi?id=155707
- <rdar://problem/24980691>
-
- Reviewed by Darin Adler.
-
- * Configurations/Base.xcconfig: Set TARGET_MAC_OS_X_VERSION_MAJOR based on the last
- component of MACOSX_DEPLOYMENT_TARGET.
- * Configurations/DebugRelease.xcconfig: For engineering builds, preserve the behavior of
- TARGET_MAC_OS_X_VERSION_MAJOR being the host’s OS version.
-
-2016-03-20 Dan Bernstein <mitz@apple.com>
-
- Update build settings
-
- Rubber-stamped by Andy Estes.
-
- * Configurations/DebugRelease.xcconfig:
-
-2016-03-14 Geoffrey Garen <ggaren@apple.com>
-
- Unreviewed, rolling out r197955.
-
- I decided to go in another direction
-
- Reverted changeset:
-
- "bmalloc: Rename SmallPage to SmallRun"
- https://bugs.webkit.org/show_bug.cgi?id=155320
- http://trac.webkit.org/changeset/197955
-
-2016-03-10 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Rename SmallPage to SmallRun
- https://bugs.webkit.org/show_bug.cgi?id=155320
-
- Reviewed by Alex Christensen.
-
- A page is a fixed-size set of lines.
-
- A run is an variable-sized set of lines.
-
- We want to start using runs because:
-
- (a) we want to support varying the hardware page size by OS;
-
- (b) we want to support allocations larger than our current page size.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::initializeSmallRunMetadata):
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::scavengeSmallRuns):
- (bmalloc::Heap::allocateSmallBumpRanges):
- (bmalloc::Heap::allocateSmallRun):
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::initializeLineMetadata): Deleted.
- (bmalloc::Heap::scavengeSmallPages): Deleted.
- (bmalloc::Heap::allocateSmallPage): Deleted.
- * bmalloc/Heap.h:
- * bmalloc/LineMetadata.h:
- * bmalloc/SmallChunk.h:
- (bmalloc::SmallChunk::begin):
- (bmalloc::SmallChunk::end):
- (bmalloc::SmallChunk::lines):
- (bmalloc::SmallChunk::runs):
- (bmalloc::SmallChunk::SmallChunk):
- (bmalloc::SmallLine::end):
- (bmalloc::SmallRun::get):
- (bmalloc::SmallRun::begin):
- (bmalloc::SmallRun::end):
- (bmalloc::SmallChunk::pages): Deleted.
- (bmalloc::SmallPage::get): Deleted.
- (bmalloc::SmallPage::begin): Deleted.
- (bmalloc::SmallPage::end): Deleted.
- * bmalloc/SmallPage.h: Removed.
- * bmalloc/SmallRun.h: Copied from Source/bmalloc/bmalloc/SmallPage.h.
- (bmalloc::SmallRun::SmallRun):
- (bmalloc::SmallRun::ref):
- (bmalloc::SmallRun::deref):
- (bmalloc::SmallPage::SmallPage): Deleted.
- (bmalloc::SmallPage::ref): Deleted.
- (bmalloc::SmallPage::deref): Deleted.
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateSmallChunk):
- (bmalloc::VMHeap::allocateLargeChunk):
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateSmallRun):
- (bmalloc::VMHeap::allocateLargeObject):
- (bmalloc::VMHeap::deallocateSmallRun):
- (bmalloc::VMHeap::deallocateLargeObject):
- (bmalloc::VMHeap::allocateSmallPage): Deleted.
- (bmalloc::VMHeap::deallocateSmallPage): Deleted.
-
-2016-03-08 Geoffrey Garen <ggaren@apple.com>
-
- Unreviewed, rolling in r197722.
- https://bugs.webkit.org/show_bug.cgi?id=155171
-
- The right calculation for our static_assert is actually:
-
- sizeof(SmallChunk) % vmPageSize + 2 * smallMax <= vmPageSize
-
- instead of:
-
- sizeof(SmallChunk) % vmPageSize + smallMax <= vmPageSize
-
- smallMax is not enough because line metadata might require us to begin
- allocation at an offset as large as smallMax, so we need 2 * smallMax.
-
- Once correct, this static_assert fires, and we fix it by increasing
- the alignment of SmallChunk.
-
- Restored changeset:
-
- "bmalloc: Use List<T> instead of Vector<T> in some places"
- https://bugs.webkit.org/show_bug.cgi?id=155150
- http://trac.webkit.org/changeset/197722
-
-2016-03-08 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r197722.
- https://bugs.webkit.org/show_bug.cgi?id=155171
-
- This change caused 800+ JSC test failures (Requested by
- ryanhaddad on #webkit).
-
- Reverted changeset:
-
- "bmalloc: Use List<T> instead of Vector<T> in some places"
- https://bugs.webkit.org/show_bug.cgi?id=155150
- http://trac.webkit.org/changeset/197722
-
-2016-03-07 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Use List<T> instead of Vector<T> in some places
- https://bugs.webkit.org/show_bug.cgi?id=155150
-
- Reviewed by Andreas Kling.
-
- Vector<T> is expensive when you want a lot of them because our minimum
- allocation size is the system page size.
-
- * bmalloc.xcodeproj/project.pbxproj: Added a List<T> class.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::scavengeSmallPages):
- (bmalloc::Heap::allocateSmallPage): Use the List<T> API. No need to check
- for stale entries anymore because List<T> supports O(1) eager removal
- and we remove eagerly now.
-
- (bmalloc::Heap::deallocateSmallLine): Remove eagerly. This simplifies
- the allocation code and it is also required for correctness since we
- only have enough metadata to be in one list at a time.
-
- * bmalloc/Heap.h: List!
-
- * bmalloc/SmallChunk.h: Made this assert a little more precise since this
- patch triggered the old version in a benign way.
-
- (bmalloc::SmallChunk::SmallChunk): This code moved to the SmallPage
- constructor.
-
- * bmalloc/SmallPage.h:
- (bmalloc::SmallPage::SmallPage): Accomodate the List<T> data structure.
- This is a net memory savings on Mac for heaps smaller than ~128MB and on
- iOS for heaps smaller than ~512MB. The maximum memory saved is 512kB on
- Mac and 2MB on iOS. For larger heaps, there's a memory cost of 0.4% on
- Mac and 0.1% on iOS.
-
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateSmallPage): Use List<T> API.
-
-2016-03-03 Geoffrey Garen <ggaren@apple.com>
-
- Unreviewed, rolling in r197174.
- https://bugs.webkit.org/show_bug.cgi?id=154762
-
- The right calculation for alignment is actually:
-
- vmAlignment - getpagesize() + vmSize
-
- instead of:
-
- vmAlignment - vmPageSize + vmSize
-
- The vmPageSize might be larger than getpagesize().
-
- Restored changeset:
-
- "bmalloc: Added a fast XLarge allocator"
- https://bugs.webkit.org/show_bug.cgi?id=154720
- http://trac.webkit.org/changeset/197174
-
-2016-02-26 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r197174.
- https://bugs.webkit.org/show_bug.cgi?id=154762
-
- This change caused LayoutTests to crash on iOS simulator
- (Requested by ryanhaddad on #webkit).
-
- Reverted changeset:
-
- "bmalloc: Added a fast XLarge allocator"
- https://bugs.webkit.org/show_bug.cgi?id=154720
- http://trac.webkit.org/changeset/197174
-
-2016-02-25 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Added a fast XLarge allocator
- https://bugs.webkit.org/show_bug.cgi?id=154720
-
- Reviewed by Andreas Kling.
-
- This is a big speedup for XLarge allocations because it avoids mmap
- and page fault churn. It also enables future design changes to handle
- a smaller size range on the fast path.
-
- * bmalloc.xcodeproj/project.pbxproj:
-
- * bmalloc/Algorithm.h:
- (bmalloc::roundUpToMultipleOf):
- (bmalloc::roundDownToMultipleOf): Added a non-constant round down.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::tryAllocate): XLarge no longer requires the caller
- to align things.
-
- (bmalloc::Allocator::allocate): Tweaked the alignment calculation for
- clarity. When alignment and largeAlignment are equal, no adjustment
- is necessary since all allocations guarantee largeAlignment.
-
- (bmalloc::Allocator::reallocate): Updated for interface change.
-
- Note that the new interface fixes some concurrency bugs. The old code
- kept an iterator into the XLarge allocator across lock drop and acquisition,
- which is not cool.
-
- (bmalloc::Allocator::allocateXLarge): XLarge no longer requires the caller
- to align things.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::scavengeXLargeObjects): Added scavenging for XLarge.
-
- (bmalloc::Heap::allocateXLarge):
-
- (bmalloc::Heap::splitAndAllocate): Split XLarge objects to xLargeAlignment.
-
- (bmalloc::Heap::tryAllocateXLarge):
- (bmalloc::Heap::xLargeSize):
- (bmalloc::Heap::shrinkXLarge):
- (bmalloc::Heap::deallocateXLarge): Allocate from our map before going
- to the OS.
-
- (bmalloc::Heap::findXLarge): Deleted.
-
- * bmalloc/Heap.h:
-
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::split):
-
- * bmalloc/ObjectType.h:
- (bmalloc::isXLarge): Give XLarge objects an explicit alignment for clarity.
-
- * bmalloc/Range.h:
- (bmalloc::Range::size):
- (bmalloc::Range::operator!):
- (bmalloc::Range::operator bool):
- (bmalloc::Range::operator<):
- (bmalloc::canMerge):
- (bmalloc::merge): Some helpers that were useful in writing this patch.
-
- * bmalloc/Sizes.h:
-
- * bmalloc/SortedVector.h: Added.
- (bmalloc::SortedVector::Bucket::Bucket):
- (bmalloc::SortedVector::Bucket::operator<):
- (bmalloc::SortedVector::iterator::iterator):
- (bmalloc::SortedVector::iterator::operator++):
- (bmalloc::SortedVector::iterator::operator!=):
- (bmalloc::SortedVector::iterator::operator*):
- (bmalloc::SortedVector::iterator::operator->):
- (bmalloc::SortedVector::iterator::skipDeletedBuckets):
- (bmalloc::SortedVector::begin):
- (bmalloc::SortedVector::end):
- (bmalloc::SortedVector<T>::insert):
- (bmalloc::SortedVector<T>::find):
- (bmalloc::SortedVector<T>::get):
- (bmalloc::SortedVector<T>::take):
- (bmalloc::SortedVector<T>::shrinkToFit): A simple abstraction for keeping
- a sorted vector. Insertion is average amortized log(n) because we keep
- deleted buckets that we can reuse.
-
- This is better than a tree because we get better locality, less memory
- use, and simpler code. Also, trees require a node memory allocator, and
- implementing a memory allocator in a memory allocator is no fun.
-
- Arguably we should use a hash table instead. But that's more code, and
- sorted vector has other nice properties that we might want to take
- adavantage of in the future.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::tryVMAllocate): Fixed an inaccuracy in the alignment calculation
- here. This code was sort of trying to enforce the alignment that the
- XLarge allocator enforces -- but it's better to enforce that alignment
- there.
-
- The right calculation is:
-
- vmAlignment - vmPageSize + vmSize
-
- because the worst case is when you are aligned to 0 + vmPageSize, and
- you must walk forward vmAlignment - vmPageSize to reach the next
- vmAlignment.
-
- (bmalloc::tryVMExtend): Deleted. No need to go back to the OS for VM
- since we manage our own.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateLargeChunk): Updated for clarity. When we
- grow the large heap we know that grown region is where the next allocation
- will take place, so we return it directly instead of pushing it to the
- free list.
-
- This fixes a subtle bug where an overly conservative aligned allocation
- algorithm can fail to allocate at all when it grows the heap.
-
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateLargeObject): Ditto.
- (bmalloc::VMHeap::allocateLargeObject): Ditto.
-
- * bmalloc/VMState.h:
- (bmalloc::merge): Added a helper.
-
- * bmalloc/Vector.h:
- (bmalloc::Vector::begin):
- (bmalloc::Vector::end):
- (bmalloc::Vector::size):
- (bmalloc::Vector::capacity):
- (bmalloc::Vector::last):
- (bmalloc::Vector::pop):
- (bmalloc::Vector<T>::push):
- (bmalloc::Vector<T>::pop):
- (bmalloc::Vector<T>::shrink): Use a proper iterator API to play nice
- with std algorithms.
-
- (bmalloc::Vector<T>::insert): New function required by SortedVector.
-
- (bmalloc::Vector<T>::reallocateBuffer):
- (bmalloc::Vector<T>::shrinkCapacity): Allow for shrinking back all the way
- to 0 because that's what shrinkToFit wants.
- (bmalloc::Vector<T>::growCapacity):
- (bmalloc::Vector<T>::shrinkToFit):
-
- * bmalloc/XLargeMap.cpp: Added. Helper data structure for managing XLarge
- objects. We have enough granularity in our metadata to represent any
- kind of address range.
-
- We store free ranges in a flat vector because most programs have very
- few individual free XLarge ranges. (They usually merge.)
-
- We store allocated ranges in a sorted vector because programs might
- allocate lots of XLarge ranges. For example, if the XLarge minimum is
- 128kB, and you have a 1GB process, that's 8192 ranges. Linear scan would
- examine 8192 items but binary search only 13.
-
- Empirically, this is 1.5X faster than our current large allocator if you
- modify MallocBench/big to allocate XLarge objects and not to initialize
- objects and you allocate 128kB-256kB objects in a 1GB address space.
-
- (bmalloc::XLargeMap::takeFree): Be careful about overflow in this function
- because we support super huge pointers, alignments, and sizes.
-
- (bmalloc::XLargeMap::addFree): Merge eagerly on free because the cost
- of missing an XLarge opportunity is catastrophic. Also, I discovered
- by experiment that any allocator that doesn't merge eagerly can create
- lots of subtle opportunities for snowballing fragmentation, as
- fragmentation in range A forces you to chop up range B, and so on.
-
- We allocate "first fit" (allocating the lowest address) because someone
- wrote a paper once that said that it's the best algorithm to combat
- fragmentation (even though worst case fragmentation is unavoidable
- regardless of algorithm).
-
- (bmalloc::XLargeMap::addAllocated):
- (bmalloc::XLargeMap::getAllocated):
- (bmalloc::XLargeMap::takeAllocated):
- (bmalloc::XLargeMap::shrinkToFit):
- (bmalloc::XLargeMap::takePhysical):
- (bmalloc::XLargeMap::addVirtual):
- * bmalloc/XLargeMap.h: Added.
- (bmalloc::XLargeMap::Allocation::operator<):
-
- * bmalloc/XLargeRange.h: Added.
- (bmalloc::XLargeRange::XLargeRange):
- (bmalloc::XLargeRange::vmState):
- (bmalloc::XLargeRange::setVMState):
- (bmalloc::canMerge):
- (bmalloc::merge):
- (bmalloc::XLargeRange::split): Helper for tracking VMState in a range.
-
-2016-02-23 Dan Bernstein <mitz@apple.com>
-
- [Xcode] Linker errors display mangled names, but no longer should
- https://bugs.webkit.org/show_bug.cgi?id=154632
-
- Reviewed by Sam Weinig.
-
- * Configurations/Base.xcconfig: Stop setting LINKER_DISPLAYS_MANGLED_NAMES to YES.
-
-2016-02-22 Konstantin Tokarev <annulen@yandex.ru>
-
- Fixed compilation of bmalloc with GCC 4.8 after r196873.
- https://bugs.webkit.org/show_bug.cgi?id=154534
-
- Reviewed by Mark Lam.
-
- See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55382.
-
- * bmalloc/LargeChunk.h:
- * bmalloc/SmallChunk.h:
-
-2016-02-21 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Don't use a whole page for metadata
- https://bugs.webkit.org/show_bug.cgi?id=154510
-
- Reviewed by Andreas Kling.
-
- (1) Don't round up metadata to a page boundary. This saves 1.5% dirty
- memory on iOS and 0.2% on Mac. It also enables a future patch to allocate
- smaller chunks without wasting memory.
-
- (2) Initialize metadata lazily. This saves dirty memory when the program
- allocates primarily small or large objects (but not both), leaving some
- metadata uninitialized.
-
- * bmalloc.xcodeproj/project.pbxproj: Medium objects are gone now.
-
- * bmalloc/BumpAllocator.h:
- (bmalloc::BumpAllocator::refill): Added an ASSERT to help debug a bug
- I cause while working on this patch.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateSmallBumpRanges): Ditto.
-
- (bmalloc::Heap::splitAndAllocate):
- (bmalloc::Heap::allocateLarge): Updated for interface change.
-
- * bmalloc/LargeChunk.h: Changed the boundaryTagCount calculation to
- a static_assert.
-
- Don't round up to page boundary. (See above.)
-
- (bmalloc::LargeChunk::LargeChunk): Moved code here from LargeChunk::init.
- A constructor is a more natural / automatic way to do this initialization.
-
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::init): Deleted. Moved to LargeChunk.
-
- * bmalloc/Sizes.h: Chagned largeChunkMetadataSize to a simpler constant
- because metadata size no longer varies by page size.
-
- * bmalloc/SmallChunk.h:
- (bmalloc::SmallChunk::begin):
- (bmalloc::SmallChunk::end):
- (bmalloc::SmallChunk::lines):
- (bmalloc::SmallChunk::pages): Use std::array to make begin/end
- calculations easier.
-
- (bmalloc::SmallChunk::SmallChunk): Treat our metadata like a series
- of allocated objects. We used to avoid trampling our metadata by
- starting object memory at the next page. Now we share the first page
- between metadata and objects, and we account for metadata explicitly.
-
- * bmalloc/SuperChunk.h:
- (bmalloc::SuperChunk::SuperChunk):
- (bmalloc::SuperChunk::smallChunk):
- (bmalloc::SuperChunk::largeChunk):
- (bmalloc::SuperChunk::create): Deleted. Don't eagerly run the SmallChunk
- and LargeChunk constructors. We'll run them lazily as needed.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::VMHeap):
- (bmalloc::VMHeap::allocateSmallChunk):
- (bmalloc::VMHeap::allocateLargeChunk):
- (bmalloc::VMHeap::allocateSuperChunk):
- (bmalloc::VMHeap::grow): Deleted. Track small and large chunks explicitly
- so we can initialize them lazily.
-
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateSmallPage):
- (bmalloc::VMHeap::allocateLargeObject): Specify whether we're allocating
- a small or large chunk since we don't allocate both at once anymore.
-
-2016-02-20 Mark Lam <mark.lam@apple.com>
-
- Use of inlined asm statements causes problems for -std=c99 builds.
- https://bugs.webkit.org/show_bug.cgi?id=154507
-
- Reviewed by Dan Bernstein.
-
- * bmalloc/BAssert.h:
-
-2016-02-19 Joonghun Park <jh718.park@samsung.com>
-
- Unreviewed. Fix debug build error since r196847
-
- Fix gcc build warning appeared as below
- by removing BASSERT(refCount <= maxRefCount).
- error: comparison is always true due to limited range of data type
- [-Werror=type-limits]
-
- * bmalloc/SmallLine.h:
- (bmalloc::SmallLine::ref): Deleted.
-
-2016-02-19 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Chunk, Page, and Line don't need to be class templates
- https://bugs.webkit.org/show_bug.cgi?id=154480
-
- Reviewed by Gavin Barraclough.
-
- We needed class templates to distinguish between small and medium,
- but medium is gone now.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Chunk.h: Removed.
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::initializeLineMetadata):
- (bmalloc::Heap::allocateSmallBumpRanges):
- * bmalloc/Heap.h:
- * bmalloc/Line.h: Removed.
- * bmalloc/Page.h: Removed.
- * bmalloc/Sizes.h:
- * bmalloc/SmallChunk.h: Replaced with Source/bmalloc/bmalloc/Chunk.h.
- (bmalloc::SmallChunk::begin):
- (bmalloc::SmallChunk::end):
- (bmalloc::SmallChunk::lines):
- (bmalloc::SmallChunk::pages):
- (bmalloc::SmallChunk::get):
- (bmalloc::SmallLine::get):
- (bmalloc::SmallLine::begin):
- (bmalloc::SmallLine::end):
- (bmalloc::SmallPage::get):
- (bmalloc::SmallPage::begin):
- (bmalloc::SmallPage::end):
- (bmalloc::Chunk::begin): Deleted.
- (bmalloc::Chunk::end): Deleted.
- (bmalloc::Chunk::lines): Deleted.
- (bmalloc::Chunk::pages): Deleted.
- * bmalloc/SmallLine.h: Replaced with Source/bmalloc/bmalloc/Line.h.
- (bmalloc::SmallLine::ref):
- (bmalloc::SmallLine::deref):
- (bmalloc::Line<Traits>::begin): Deleted.
- (bmalloc::Line<Traits>::end): Deleted.
- (bmalloc::Line<Traits>::ref): Deleted.
- (bmalloc::Line<Traits>::deref): Deleted.
- * bmalloc/SmallPage.h: Replaced with Source/bmalloc/bmalloc/Page.h.
- (bmalloc::SmallPage::hasFreeLines):
- (bmalloc::SmallPage::setHasFreeLines):
- (bmalloc::SmallPage::ref):
- (bmalloc::SmallPage::deref):
- (bmalloc::Page::hasFreeLines): Deleted.
- (bmalloc::Page::setHasFreeLines): Deleted.
- (bmalloc::Page<Traits>::ref): Deleted.
- (bmalloc::Page<Traits>::deref): Deleted.
- * bmalloc/SmallTraits.h: Removed.
-
-2016-02-18 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Remove the concept of medium objects
- https://bugs.webkit.org/show_bug.cgi?id=154436
-
- Reviewed by Sam Weinig.
-
- There's no need to distinguish medium objects from small: Small object
- metadata works naturally for both as long as we allow an object to
- span more than two small lines. (We already allow an object to span
- more than one small line.)
-
- This change reduces memory use because it eliminates the 1kB line size,
- so we don't have to hold down 1kB lines for individual 264+ byte objects.
-
- 1kB lines were always a bit of a compromise. The main point of bump
- allocation is to take advantage of cache lines. Cache lines are usually
- 64 bytes, so line sizes above 256 bytes are a bit of a stretch.
-
- This change speeds up small object benchmarks because it eliminates the
- branch to detect medium objects in deallocation log processing.
-
- This change reduces virtual memory use from worst cast 4X to worst case
- 2X because the medium chunk is gone. iOS cares about virtual memory use
- and terminates apps above ~1GB, so this change gives us more breathing room.
-
- This change slows down medium benchmarks a bit because we end up doing
- more work to recycle fragmented medium objects. Overall, the tradeoff
- seems justified, since we have a net speedup and a memory use savings.
-
- * bmalloc.xcodeproj/project.pbxproj: Removed all the medium files. We
- can simplify even further in a follow-up patch, removing the base class
- templates for Chunk, Page, and Line as well.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator):
- (bmalloc::Allocator::allocate):
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::scavenge):
- (bmalloc::Allocator::refillAllocatorSlowCase):
- (bmalloc::Allocator::refillAllocator):
- (bmalloc::Allocator::allocateSlowCase): Medium is gone. Small max is the
- new medium max.
-
- * bmalloc/Allocator.h:
- (bmalloc::Allocator::allocateFastCase): Ditto.
-
- * bmalloc/BumpAllocator.h:
- (bmalloc::BumpAllocator::validate):
- (bmalloc::BumpAllocator::allocate): No more medium.
-
- * bmalloc/Chunk.h: No more medium.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::processObjectLog): No check for medium. This is
- a speedup.
-
- (bmalloc::Deallocator::deallocateSlowCase): No more medium.
-
- * bmalloc/Deallocator.h:
- (bmalloc::Deallocator::deallocateFastCase): Ditto.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::initializeLineMetadata): The algorithm here changed from
- iterating each line to iterating each object. This helps us accomodate
- objects that might span more than two lines -- i.e., all objects between
- (512 bytes, 1024 bytes].
-
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::scavengeSmallPages):
- (bmalloc::Heap::scavengeLargeObjects): Medium is gone.
-
- (bmalloc::Heap::allocateSmallBumpRanges): Allow for lines that allocate
- zero objects. This happens when an object spans more than two lines --
- the middle lines allocate zero objects.
-
- Also set the "has free lines" bit to false if we consume the last free
- line. This needs to be a bit now because not all pages agree on their
- maximum refcount anymore, so we need an explicit signal for the transition
- from maximum to maximum - 1.
-
- (bmalloc::Heap::allocateSmallPage): This code didn't change; I just removed
- the medium code.
-
- (bmalloc::Heap::deallocateSmallLine): Changed the algorithm to check
- hasFreeLines. See allocateSmallBumpRanges.
-
- (bmalloc::Heap::scavengeMediumPages): Deleted.
- (bmalloc::Heap::allocateMediumBumpRanges): Deleted.
- (bmalloc::Heap::allocateMediumPage): Deleted.
- (bmalloc::Heap::deallocateMediumLine): Deleted.
- * bmalloc/Heap.h:
- (bmalloc::Heap::derefMediumLine): Deleted.
-
- * bmalloc/LargeChunk.h:
- (bmalloc::LargeChunk::get):
- (bmalloc::LargeChunk::endTag):
- * bmalloc/Line.h: No more medium.
-
- * bmalloc/MediumChunk.h: Removed.
- * bmalloc/MediumLine.h: Removed.
- * bmalloc/MediumPage.h: Removed.
- * bmalloc/MediumTraits.h: Removed.
-
- * bmalloc/ObjectType.cpp:
- (bmalloc::objectType):
- * bmalloc/ObjectType.h:
- (bmalloc::isSmall):
- (bmalloc::isXLarge):
- (bmalloc::isSmallOrMedium): Deleted.
- (bmalloc::isMedium): Deleted. No more medium.
-
- * bmalloc/Page.h:
- (bmalloc::Page::sizeClass):
- (bmalloc::Page::setSizeClass):
- (bmalloc::Page::hasFreeLines):
- (bmalloc::Page::setHasFreeLines): Add the free lines bit. You get better
- codegen if you make it the low bit, since ref / deref can then add / sub
- 2. So do that.
-
- * bmalloc/Sizes.h:
- (bmalloc::Sizes::sizeClass): Expand the small size class to include the
- medium size class.
-
- * bmalloc/SuperChunk.h:
- (bmalloc::SuperChunk::SuperChunk):
- (bmalloc::SuperChunk::smallChunk):
- (bmalloc::SuperChunk::largeChunk):
- (bmalloc::SuperChunk::mediumChunk): Deleted. No more medium.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateSmallPage): Set the has free lines bit before
- returning a Page to the Heap since this is the correct default state
- when we first allocate a page.
-
- (bmalloc::VMHeap::allocateMediumPage): Deleted.
- (bmalloc::VMHeap::deallocateMediumPage): Deleted.
-
-2016-02-19 Michael Saboff <msaboff@apple.com>
-
- bmalloc: Unify VMHeap and Heap LargeObjects free lists to reduce fragmentation
- https://bugs.webkit.org/show_bug.cgi?id=154192
-
- Reviewed by Geoffrey Garen.
-
- Change the operation of Heap and VMHeap LargeObject free lists.
- Renamed Owner to VMState to track the state of each LargeObject.
- Physical - The pages have been allocated.
- Virtual - The pages have not been allocated.
- Mixed - The object contains a mixture of Physical and Virtual pages.
- VMState uses one bit each for Physical and Virtual to simplify merging states
- when merging two adjacent blocks. This change enforces the rule that objects in
- the Heap free list must have have the Physical bit set in their VMState while objects
- in the VMHeap free list must have the Physical bit clear. Thie means that the Heap
- can have LargeObjects in Physical or Mixed VMState, but the VMHeap's free list can
- only contain Virtual LargeObjects.
-
- In both Heap::allocateLarge(), we now allocate physical pages if the LargeObject we
- pull from the free list has any Virtual pages before we possilby split the
- object. When we merge objects, the result might be made up of Mixed page allocations.
- When allocating a Mixed LargeObject, we need to allocate memory for them as well.
- The scavenger deallocates both Physical and Mixed LargeObjects, placing them back into
- the VMHeap's free list.
-
- When we allocate or deallocate Mixed LargeObjects, there are pages that within these
- objects that will be redundantly modified. It would require additional metadata to
- eliminate this redundancy.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::vmState): New helper.
- (bmalloc::BoundaryTag::setVMState): New helper.
- (bmalloc::BoundaryTag::owner): Deleted.
- (bmalloc::BoundaryTag::setOwner): Deleted.
- * bmalloc/Heap.h:
- (bmalloc::Heap::splitAndAllocate): New helpers.
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::vmState): New helper.
- (bmalloc::LargeObject::setVMState): New helper.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::splitAndAllocate): New helpers.
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::deallocatePhysicalPages): Refactored from VMHeap::deallocateLargeObjectMemory.
-
- * bmalloc/FreeList.cpp:
- (bmalloc::FreeList::takeGreedy):
- (bmalloc::FreeList::take):
- (bmalloc::FreeList::removeInvalidAndDuplicateEntries):
- * bmalloc/FreeList.h:
- (bmalloc::FreeList::FreeList):
- (bmalloc::FreeList::push):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::scavengeLargeObjects):
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::isValidAndFree):
- (bmalloc::LargeObject::validateSelf):
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::SegregatedFreeList): Changed to initialize our required Physical state.
- * bmalloc/SegregatedFreeList.h:
- (bmalloc::SegregatedFreeList::SegregatedFreeList):
- (bmalloc::SegregatedFreeList::insert):
- (bmalloc::SegregatedFreeList::takeGreedy):
- (bmalloc::SegregatedFreeList::take):
- Replaced Owner parameters and checks with VMState::HasPhysical.
-
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::prevCanMerge): Removed owner from tests.
- (bmalloc::LargeObject::nextCanMerge): Removed owner from tests.
- (bmalloc::LargeObject::merge): Removed owner from tests. Updated to merge VMStates andset the
- VMState after the merge.
-
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::owner): Deleted.
- (bmalloc::LargeObject::setOwner): Deleted.
-
- * bmalloc/Owner.h: Removed.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::vmAllocatePhysicalPagesSloppy): Changed to round begin down to eliminate the left to right
- allocation constraint.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow): Large space managed like small or medium as a vector of LargeChunks.
- (bmalloc::VMHeap::VMHeap): Changed to initialize our required Physical state.
-
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateLargeObject): These no longer allocate memory.
- (bmalloc::VMHeap::deallocateLargeObject): Removed setOwner. Now we set the VMState after any merges.
-
- * bmalloc/VMState.h: Copied from Source/bmalloc/bmalloc/Owner.h.
- (bmalloc::VMState::VMState):
- (bmalloc::VMState::hasPhysical):
- (bmalloc::VMState::hasVirtual):
- (bmalloc::VMState::merge):
- (bmalloc::VMState::operator ==):
- (bmalloc::VMState::operator unsigned):
- New class with various helpers.
-
-2016-02-12 Michael Saboff <msaboff@apple.com>
-
- BASSERTs added in r196421 are causing debug test failures
- https://bugs.webkit.org/show_bug.cgi?id=154113
-
- Reviewed by Geoffrey Garen.
-
- In VMHeap::deallocateLargeObject(), we drop the lock to deallocate the physical pages.
- If the scavenger thread is running at the same time a synchronous call to scavenge()
- comes in, we could call VMHeap::deallocateLargeObject() for an adjacent object while the
- lock in the other thread is dropped. We fix this by checking for adjacent objects we
- can merge with and loop if we have one.
-
- * bmalloc/FreeList.h:
- (bmalloc::FreeList::push): Added BASSERT to catch adding unmerged free objects
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateLarge): Changed to use nextCanMerge().
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::prevCanMerge): Repurposed prevIsAllocated.
- (bmalloc::LargeObject::nextCanMerge): Repurposed nextIsAllocated.
- (bmalloc::LargeObject::prevIsAllocated): Deleted.
- (bmalloc::LargeObject::nextIsAllocated): Deleted.
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateLargeObject): Moved adding the extra object back to the free list
- to after we set the object we'll return as being allocated.
- (bmalloc::VMHeap::deallocateLargeObject):
-
-2016-02-12 Mark Lam <mark.lam@apple.com>
-
- Make BCRASH() use breakpoint traps too for non-debug OS(DARWIN).
- https://bugs.webkit.org/show_bug.cgi?id=154184
-
- Reviewed by Saam Barati.
-
- This makes it behave consistently with WTFCrash().
-
- * bmalloc/BAssert.h:
- * bmalloc/BPlatform.h:
-
-2016-02-11 Michael Saboff <msaboff@apple.com>
-
- Unreviewed build fix after r196421.
-
- Removed BASSERTs that are firing to eliminate Debug build crashes. I'll debug locally and
- enable or alter after the issue is understood.
-
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::merge): Removed BASSERTs that are firing.
-
-2016-02-11 Michael Saboff <msaboff@apple.com>
-
- bmalloc: large aligned allocations will put 1 or 2 free object on free list without merging with free neighbors
- https://bugs.webkit.org/show_bug.cgi?id=154091
-
- Reviewed by Geoffrey Garen.
-
- If we split off any unused free object in the aligned version of Heap::allocateLarge(), we merge them with
- free neighbors before putting them back on the free list. Added helpers to verify that when we
- add LargeObjects to the free list their neighbors are allocated.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateLarge): Deleted private helper version and rolled it into the two the
- two public versions of allocateLarge().
- * bmalloc/Heap.h:
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::prevIsAllocated): New helper.
- (bmalloc::LargeObject::nextIsAllocated): New helper.
- (bmalloc::LargeObject::merge): Check that the merge object has allocated neighbors.
-
-2016-02-05 Saam barati <sbarati@apple.com>
-
- bmalloc: largeMax calculation is wrong on iOS
- https://bugs.webkit.org/show_bug.cgi?id=153923
-
- Reviewed by Mark Lam.
-
- Our number for largeMax was larger than what we had
- space to actually allocate inside the LargeChunk. This made
- it so that we would allocate a large object for something
- that really should be extra large. Previously:
- largeMax + sizeof(LargeChunk) > 1MB
- which meant that when we would grow() to accommodate an allocation
- of a particular size inside a LargeObject despite the fact that
- the allocation size would be too large to actually fit in the LargeObject.
- This would manifest when we had an allocation size in the range:
- 1MB - sizeof(LargeChunk) < allocation size < largeMax
-
- We fix this bug by being precise in our calculation of largeMax
- instead of just assuming largeChunkSize * 99/100 is enough
- space for the metadata.
-
- * bmalloc/LargeChunk.h:
- (bmalloc::LargeChunk::get):
- * bmalloc/Sizes.h:
-
-2016-01-31 Dan Bernstein <mitz@apple.com>
-
- [Cocoa] Remove unused definition of HAVE_HEADER_DETECTION_H
- https://bugs.webkit.org/show_bug.cgi?id=153729
-
- Reviewed by Sam Weinig.
-
- After r141700, HAVE_HEADER_DETECTION_H is no longer used.
-
- * Configurations/Base.xcconfig:
-
-2015-12-19 Dan Bernstein <mitz@apple.com>
-
- [Mac] WebKit contains dead source code for OS X Mavericks and earlier
- https://bugs.webkit.org/show_bug.cgi?id=152462
-
- Reviewed by Alexey Proskuryakov.
-
- * Configurations/DebugRelease.xcconfig: Removed definition of MACOSX_DEPLOYMENT_TARGET for
- OS X 10.9.
-
-2015-12-03 Anders Carlsson <andersca@apple.com>
-
- Remove Objective-C GC support
- https://bugs.webkit.org/show_bug.cgi?id=151819
- rdar://problem/23746991
-
- Reviewed by Dan Bernstein.
-
- * Configurations/Base.xcconfig:
-
-2015-12-03 Michael Saboff <msaboff@apple.com>
-
- bmalloc: extra large allocations could be more efficient
- https://bugs.webkit.org/show_bug.cgi?id=151817
-
- Reviewed by Geoffrey Garen.
-
- Reduced the super chunk size from 4MB to 2MB.
-
- Added path to reallocate() of an extra large object to see if we can extend the allocation.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate):
- * bmalloc/SegregatedFreeList.h:
- * bmalloc/Sizes.h:
- * bmalloc/VMAllocate.h:
- (bmalloc::tryVMAllocate):
- (bmalloc::tryVMExtend):
- (bmalloc::vmAllocate):
-
-2015-11-11 Akos Kiss <akiss@inf.u-szeged.hu>
-
- bmalloc: Add libdl dependency
- https://bugs.webkit.org/show_bug.cgi?id=151140
-
- Reviewed by Csaba Osztrogonác.
-
- Make sure that the linker links libdl and finds the references to
- dlopen, dlsym and dlclose in Environment.cpp.
-
- * CMakeLists.txt:
-
-2015-11-02 Andy Estes <aestes@apple.com>
-
- [Cocoa] Add tvOS and watchOS to SUPPORTED_PLATFORMS
- https://bugs.webkit.org/show_bug.cgi?id=150819
-
- Reviewed by Dan Bernstein.
-
- This tells Xcode to include these platforms in its Devices dropdown, making it possible to build in the IDE.
-
- * Configurations/Base.xcconfig:
-
-2015-11-01 Philip Chimento <philip.chimento@gmail.com>
-
- [GTK] Fix combinations of PLATFORM(GTK) and OS(DARWIN)
- https://bugs.webkit.org/show_bug.cgi?id=144560
-
- Reviewed by Darin Adler.
-
- * PlatformGTK.cmake: Added. This adds Zone.cpp to the PlatformGTK
- build, on Darwin only. Since there was previously nothing for the
- build system to do that was specific to the GTK platform in
- bmalloc, we need to create this file.
-
-2015-10-29 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: AsyncTask should handle destruction
- https://bugs.webkit.org/show_bug.cgi?id=150648
-
- Reviewed by Mark Lam.
-
- So we can use it in more places.
-
- * bmalloc/AsyncTask.h: Use std::thread instead of pthread because it
- should be more portable.
-
- (bmalloc::Function>::AsyncTask): Renamed Signaled to RunRequested for
- clarity. Added an ExitRequested state.
-
- (bmalloc::Function>::~AsyncTask): Wait for our child thread to exit
- before destroying ourselves because our child thread will modify our
- data (and might modify our client's data). Note that we only need to
- wait for the last child thread since any prior child thread, having
- reached the Exited condition, is guaranteed not to read or write any
- data.
-
- (bmalloc::Function>::run):
- (bmalloc::Function>::runSlowCase): Updated for interface changes. Also
- changed to use our WebKit style for condition signal: Hold the lock
- during the signal and always notify all. Technically, neither is necessary,
- but it is easier to understand the code this way, and harder to make
- mistakes.
-
- (bmalloc::Function>::threadEntryPoint):
- (bmalloc::Function>::threadRunLoop): Handle the new ExitRequested state.
- Technically, this state has no meaningful difference from the Exited
- state, but it is nice to be explicit.
-
- (bmalloc::Function>::join): Deleted.
- (bmalloc::Function>::pthreadEntryPoint): Deleted.
- (bmalloc::Function>::entryPoint): Deleted.
-
-2015-10-15 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: per-thread cache data structure should be smaller
- https://bugs.webkit.org/show_bug.cgi?id=150218
-
- Reviewed by Andreas Kling.
-
- Reduce the number of entries in the range cache because it's really
- big, and the bigness only helps in cases of serious fragmentation, and
- it only saves us a little bit of lock acquisition time.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::scavenge):
- (bmalloc::Allocator::refillAllocatorSlowCase):
- (bmalloc::Allocator::refillAllocator):
- (bmalloc::Allocator::allocateLarge):
- (bmalloc::Allocator::allocateSlowCase):
- (bmalloc::Allocator::allocateBumpRangeSlowCase): Deleted.
- (bmalloc::Allocator::allocateBumpRange): Deleted.
- * bmalloc/Allocator.h: Pass through the empty allocator and the range
- cache when refilling, and refill both. Otherwise, we always immediately
- pop the last item in the range cache, wasting that slot of capacity.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateSmallBumpRanges):
- (bmalloc::Heap::allocateMediumBumpRanges): Account for the fact that
- the range cache is no longer big enough to guarantee that it can hold
- all the ranges in a page.
-
- (bmalloc::Heap::refillSmallBumpRangeCache): Deleted.
- (bmalloc::Heap::refillMediumBumpRangeCache): Deleted.
-
- * bmalloc/Heap.h: Move VMHeap to the end of the object because it
- contains a lot of unused / wasted space, and we want to pack our data
- together in memory.
-
- * bmalloc/Sizes.h: Make the range cache smaller.
-
-2015-10-13 Chris Dumez <cdumez@apple.com>
-
- Avoid useless copies in range-loops that are using 'auto'
- https://bugs.webkit.org/show_bug.cgi?id=150091
-
- Reviewed by Sam Weinig.
-
- Avoid useless copies in range-loops that are using 'auto'. Also use
- 'auto*' instead of 'auto' when range values are pointers for clarity.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::processObjectLog):
-
-2015-10-12 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Don't ASSERT that all syscalls succeed
- https://bugs.webkit.org/show_bug.cgi?id=150047
- <rdar://problem/22649531>
-
- Reviewed by Mark Lam.
-
- madvise can fail due to VM behaviors outside of our control:
- copy-on-write, fork, mprotect, and other stuff.
-
- Older darwin kernels sometimes return this error value, and new kernels
- might again in future.
-
- We haven't gained much from this ASSERT so far, so let's remove it.
-
- Perhaps in future we can come up with a scheme that makes madvise
- never fail, or that responds to failure.
-
- * bmalloc/Syscall.h:
-
-2015-10-10 Dan Bernstein <mitz@apple.com>
-
- [iOS] Remove project support for iOS 8
- https://bugs.webkit.org/show_bug.cgi?id=149993
-
- Reviewed by Alexey Proskuryakov.
-
- * Configurations/Base.xcconfig:
- * Configurations/bmalloc.xcconfig:
- * Configurations/mbmalloc.xcconfig:
-
-2015-08-31 Michael Catanzaro <mcatanzaro@igalia.com>
-
- Implement bmalloc::isASanEnabled for generic Unix
- https://bugs.webkit.org/show_bug.cgi?id=148623
-
- Reviewed by Geoffrey Garen.
-
- * bmalloc/BPlatform.h: Add BOS_UNIX to detect whether the OS is a Unix.
- * bmalloc/Environment.cpp:
- (bmalloc::isASanEnabled): Implement a runtime check that should work on any Unix.
-
-2015-08-19 Geoffrey Garen <ggaren@apple.com>
-
- Crash @ bmalloc::Environment::computeIsBmallocEnabled
- https://bugs.webkit.org/show_bug.cgi?id=148183
-
- Reviewed by NOBODY Michael Saboff.
-
- CrashTracer says we have some crashes beneath computeIsBmallocEnabled
- dereferencing null in strstr. We null check getenv but not
- _dyld_get_image_name, so deduction indicates that _dyld_get_image_name
- must be returning null. _dyld_get_image_name isn't really documented,
- so let's assume it can return null.
-
- * bmalloc/Environment.cpp:
- (bmalloc::isASanEnabled): Check _dyld_get_image_name's return value for
- null because we can't prove it won't be null.
-
-2015-07-24 Geoffrey Garen <ggaren@apple.com>
-
- vmmap crash at JavaScriptCore: 0x31cd12f6 (the JavaScript malloc zone enumerator)
- https://bugs.webkit.org/show_bug.cgi?id=147274
-
- Reviewed by Anders Carlsson.
-
- It's not really clear why vmmap sometimes fails to read the target
- process, but we can avoid a crash when it does. This is useful because
- you'll still get all the non-bmalloc data out of the target process,
- and bmalloc might not even be relevant to your investigation.
-
- * bmalloc/Zone.cpp:
- (bmalloc::remoteRead): Check for failure.
-
-2015-07-24 Geoffrey Garen <ggaren@apple.com>
-
- JavaScriptCore bmalloc should not register its malloc zone more than once
- https://bugs.webkit.org/show_bug.cgi?id=147273
-
- Reviewed by Andreas Kling.
-
- This was a goof: The Zone constructor, by virtue of running automatically,
- was registering a Zone inside the analysis process.
-
- * bmalloc/Zone.cpp:
- (bmalloc::remoteRead): Clarify that the pointer is remote.
-
- (bmalloc::enumerator):
- (bmalloc::Zone::Zone):
- * bmalloc/Zone.h: Separate the normal constructor and the remote constructor.
- The remote constructor skips zone registration since its goal is not
- to register a zone in the current process or do any allocation but rather
- to mirror the bytes of the zone from the target process.
-
-2015-07-23 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Shrink the super chunk size (again)
- https://bugs.webkit.org/show_bug.cgi?id=147240
-
- Reviewed by Andreas Kling.
-
- Shrinking to 8MB reduced VM exhaustion crashes but did not eliminate them.
- Let's try 4MB.
-
- (My previous comment was that the maximum fast object was 2MB. But it
- was 4MB! Now it's 2MB for realsies.)
-
- * bmalloc/Sizes.h:
-
-2015-07-03 Dan Bernstein <mitz@apple.com>
-
- [Xcode] Update some build settings as recommended by Xcode 7
- https://bugs.webkit.org/show_bug.cgi?id=146597
-
- Reviewed by Sam Weinig.
-
- * Configurations/Base.xcconfig: Enabled CLANG_WARN_UNREACHABLE_CODE, GCC_NO_COMMON_BLOCKS,
- and ENABLE_STRICT_OBJC_MSGSEND. Removed GCC_MODEL_TUNING.
-
- * bmalloc.xcodeproj/project.pbxproj: Updated LastUpgradeCheck.
-
-2015-07-02 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Shrink the super chunk size
- https://bugs.webkit.org/show_bug.cgi?id=146519
-
- Reviewed by Andreas Kling.
-
- We have lots of reports of crashing due to failed VM allocation on iOS.
- (This VM limit on iOS is usually 1GB-2GB, and has been as low as 256MB.)
-
- Shrink the super chunk size in case fragmentation is the reason for
- VM allocation failure.
-
- This has the downside that >= 2MB allocations will now be super slow,
- but they are also super rare (as in never on most websites), so this
- is probably an OK tradeoff.
-
- * bmalloc/Sizes.h:
-
-2015-07-01 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: realloc of an XLarge range can unmap adjacent VM ranges
- https://bugs.webkit.org/show_bug.cgi?id=146535
-
- Reviewed by Anders Carlsson.
-
- This bug causes a crash when running fast/css/large-list-of-rules-crash.html
- with the fix applied for https://bugs.webkit.org/show_bug.cgi?id=146519.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate): Start at object + newSize since starting
- at object + oldSize means deleting the adjacent VM range.
-
-2015-05-26 Geoffrey Garen <ggaren@apple.com>
-
- Integer overflow in XLarge allocation (due to unchecked roundUpToMultipleOf)
- https://bugs.webkit.org/show_bug.cgi?id=145385
-
- Reviewed by Andreas Kling.
-
- Added some checking to verify that round-up operations will not overflow
- a size_t.
-
- The simplest way to do this was to introduce a notion of xLargeMax, like
- we have for smallMax, mediumMax, and largeMax. It's a bit surprising at
- first to think that there is an xLargeMax, since xLarge is what we use
- to handle the biggest things. But computers have limits, so it makes sense.
-
- FWIW, TCMalloc used to have an xLargeMax too, which it called kMaxValidPages.
-
- No test because this bug was found by code inspection and I don't know
- of a practical way to convince WebKit to make an allocation this large.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::tryAllocate):
- (bmalloc::Allocator::allocate):
- (bmalloc::Allocator::reallocate):
- (bmalloc::Allocator::allocateSlowCase): Check against xLargeMax to avoid
- overflow when rounding up.
-
- * bmalloc/BAssert.h: Added support for explicit crashing.
-
- * bmalloc/Sizes.h:
-
-2015-05-26 Dan Bernstein <mitz@apple.com>
-
- <rdar://problem/21104551> Update build settings
-
- Reviewed by Anders Carlsson.
-
- * Configurations/DebugRelease.xcconfig:
-
-2015-05-23 Dan Bernstein <mitz@apple.com>
-
- Remove unused definitions of WEBKIT_VERSION_MIN_REQUIRED
- https://bugs.webkit.org/show_bug.cgi?id=145345
-
- Reviewed by Sam Weinig.
-
- * Configurations/Base.xcconfig: Also changed to use $(inherited).
-
-2015-05-07 Geoffrey Garen <ggaren@apple.com>
-
- Release assert in com.apple.WebKit.WebContent under JavaScriptCore: JSC::JSONProtoFuncStringify
- https://bugs.webkit.org/show_bug.cgi?id=144758
-
- Reviewed by Andreas Kling.
-
- This was an out-of-memory error when trying to shrink a string builder.
- bmalloc was missing the optimization that allowed realloc() to shrink
- without copying. So, let's add it.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate): Added Large and XLarge cases for
- shrinking without copying. This isn't possible for small and medium
- objects, and probably not very profitable, either.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::findXLarge):
- (bmalloc::Heap::deallocateXLarge):
- * bmalloc/Heap.h: Refactored this code to return a reference to an
- XLarge range. This makes the code reusable, and also makes it easier
- for realloc() to update metadata.
-
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::split): Allow allocated objects to split because
- that's what realloc() wants to do, and there's nothing intrinsically
- wrong with it.
-
-2015-05-07 Dan Bernstein <mitz@apple.com>
-
- <rdar://problem/19317140> [Xcode] Remove usage of AspenFamily.xcconfig in Source/
- https://bugs.webkit.org/show_bug.cgi?id=144727
-
- Reviewed by Darin Adler.
-
- * Configurations/Base.xcconfig: Dont’s include AspenFamily.xcconfig, and define
- INSTALL_PATH_PREFIX for the iOS 8.x Simulator.
-
-2015-04-01 Alex Christensen <achristensen@webkit.org>
-
- Progress towards CMake on Windows and Mac.
- https://bugs.webkit.org/show_bug.cgi?id=143293
-
- Reviewed by Filip Pizlo.
-
- * bmalloc/BAssert.h:
- Removed ellipses from macros to appease Visual Studio.
-
-2015-03-13 Alex Christensen <achristensen@webkit.org>
-
- Progress towards CMake on Mac.
- https://bugs.webkit.org/show_bug.cgi?id=142680
-
- Reviewed by Gyuyoung Kim.
-
- * CMakeLists.txt:
- * PlatformMac.cmake:
- Added Zone.cpp to Mac CMake builds.
-
-2015-03-12 Geoffrey Garen <ggaren@apple.com>
-
- Assertion failure in bmalloc::LargeObject::validateSelf on Mavericks Debug layout test bot
- https://bugs.webkit.org/show_bug.cgi?id=142642
-
- Reviewed by Michael Saboff.
-
- The typical backtrace to this crash shows the main thread trying to
- realloc a large string while a DFG compiler thread tries to
- free a large vector buffer.
-
- I believe that this is a race condition -- at least in debug builds --
- since the main thread will try to validate its object's neighbors
- without holding a lock, even though those neighbors might be in the
- midst of changing.
-
- In general, there may be sneaky times when it is valid to look at an
- object's metadata without holding the heap lock, but it is best not to
- do so unless we have a really really good reason to.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate): Take a lock before reading the metadata
- for this object, since we generally require any access to shared heap
- metadata to take a lock.
-
-2015-03-10 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: tryFastMalloc shouldn't crash
- https://bugs.webkit.org/show_bug.cgi?id=142443
-
- Reviewed by Sam Weinig.
-
- Rolling back in r181307 with a check for whether bmalloc is enabled, to
- avoid crashes when running with ASan and GuardMalloc.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::tryAllocate):
- * bmalloc/Allocator.h:
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::tryAllocateSlowCaseNullCache):
- * bmalloc/Cache.h:
- (bmalloc::Cache::tryAllocate):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateXLarge):
- (bmalloc::Heap::tryAllocateXLarge):
- * bmalloc/Heap.h:
- * bmalloc/VMAllocate.h:
- (bmalloc::tryVMAllocate):
- (bmalloc::vmAllocate):
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryMalloc):
- (bmalloc::api::realloc):
- (bmalloc::api::free):
-
-2015-03-09 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r181307.
- https://bugs.webkit.org/show_bug.cgi?id=142525
-
- Broke ASan tests (Requested by ap on #webkit).
-
- Reverted changeset:
-
- "bmalloc: tryFastMalloc shouldn't crash"
- https://bugs.webkit.org/show_bug.cgi?id=142443
- http://trac.webkit.org/changeset/181307
-
-2015-03-09 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: tryFastMalloc shouldn't crash
- https://bugs.webkit.org/show_bug.cgi?id=142443
-
- Reviewed by Darin Adler.
-
- Added support for tryMalloc.
-
- We assume that non-x-large allocations always succeed, and we crash
- otherwise, since normal allocation failure will just cause the next
- non-try allocation or internal metadata allocation to fail, and it's
- hard and not really useful to keep limping along after that. But
- extra-large allocations can meaningfully fail, and we can recover.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateXLarge):
- (bmalloc::Heap::tryAllocateXLarge):
- * bmalloc/Heap.h: Added support for non-crashy x-large allocation.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::tryVMAllocate):
- (bmalloc::vmAllocate): Added support for non-crashy VM allocation.
-
- * bmalloc/bmalloc.h:
- (bmalloc::api::tryMalloc):
- (bmalloc::api::realloc):
- (bmalloc::api::free): Tried to clarify our behavior with some comments.
- Unfortunately, calling what we do "malloc" is still not quite right, since
- malloc returns null on failure and we don't.
-
-2015-03-03 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Don't branch when setting the owner of a large object
- https://bugs.webkit.org/show_bug.cgi?id=142241
-
- Reviewed by Andreas Kling.
-
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::owner):
- (bmalloc::BoundaryTag::setOwner):
-
-2015-03-03 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc should implement malloc introspection (to stop false-positive leaks when MallocStackLogging is off)
- https://bugs.webkit.org/show_bug.cgi?id=141802
-
- Reviewed by Andreas Kling.
-
- Re-enabled this feature on iOS, now that the iOS crash should be fixed.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
- * bmalloc/VMHeap.h:
-
-2015-03-03 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Added missing features to the malloc zone introspection API
- https://bugs.webkit.org/show_bug.cgi?id=142235
-
- Reviewed by Andreas Kling.
-
- This should fix the crash we saw on the iOS PLT bot
- (c.f. http://trac.webkit.org/changeset/180604).
-
- * bmalloc/Zone.cpp:
- (bmalloc::good_size):
- (bmalloc::check):
- (bmalloc::print):
- (bmalloc::log):
- (bmalloc::force_lock):
- (bmalloc::force_unlock):
- (bmalloc::statistics):
- (bmalloc::size):
- (bmalloc::enumerator): Provide all of these functions since they are called
- indiscriminately on all zones.
-
- (bmalloc::Zone::Zone):
- (bmalloc::Zone::size): Deleted.
- (bmalloc::Zone::enumerator): Deleted. Moved these functions out of the
- Zone class since they can stand alone.
-
- * bmalloc/Zone.h:
-
-2015-03-03 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc should implement malloc introspection (to stop false-positive leaks when MallocStackLogging is off)
- https://bugs.webkit.org/show_bug.cgi?id=141802
-
- Reviewed by Andreas Kling.
-
- Rolling back in but disabled on iOS until I can debug why the iOS PLT crashes.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
- * bmalloc/VMHeap.h:
- * bmalloc/Zone.cpp:
- (bmalloc::Zone::size):
- (bmalloc::Zone::Zone):
- * bmalloc/Zone.h:
-
-2015-03-03 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Miscellaneous cleanup
- https://bugs.webkit.org/show_bug.cgi?id=142231
-
- Reviewed by Andreas Kling.
-
- No performance change -- maybe a tiny reduction in memory use.
-
- * bmalloc/Heap.cpp: Moved the sleep function into StaticMutex, since
- it's a helper for working with mutexes.
-
- (bmalloc::Heap::scavenge): Make sure to wait before we start any
- scavenging, since individual scavenging functions now always scavenge
- at least one page before waiting themselves.
-
- (bmalloc::Heap::scavengeSmallPages):
- (bmalloc::Heap::scavengeMediumPages):
- (bmalloc::Heap::scavengeLargeObjects): Use the new wait helper to
- simplify this code. Also, we now require our caller to wait until at
- least one deallocation is desirable. This simplifies our loop.
-
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::allocateMediumPage):
- (bmalloc::Heap::allocateXLarge):
- (bmalloc::Heap::allocateLarge): Don't freak out any time the heap does
- an allocation. Only consider the heap to be growing if it actually needs
- to allocate new VM. This allows us to shrink the heap back down from a
- high water mark more reliably even if heap activity continues.
-
- (bmalloc::sleep): Deleted.
- (bmalloc::Heap::scavengeLargeRanges): Renamed to match our use of
- "LargeObject".
-
- * bmalloc/Heap.h:
-
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::operator bool): Added to simplify a while loop.
-
- * bmalloc/StaticMutex.h:
- (bmalloc::sleep):
- (bmalloc::waitUntilFalse): New helper for waiting until a condition
- becomes reliably false.
-
- * bmalloc/Vector.h:
- (bmalloc::Vector<T>::~Vector): Oops! Don't deallocate the null pointer.
- We don't actually run any Vector destructors, but an iteration of this
- patch did, and then crashed. So, let's fix that.
-
-2015-03-02 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Eagerly remove allocated objects from the free list
- https://bugs.webkit.org/show_bug.cgi?id=142194
-
- Reviewed by Andreas Kling.
-
- This reduces the pressure to garbage collect the free list.
-
- Might be a 1% speedup on MallocBench.
-
- * bmalloc/FreeList.cpp: Put this comment at the top of the file instead
- of repeating it inside of each function. Tried to clarify the details.
-
- (bmalloc::FreeList::takeGreedy): Matched the other iteration code in this
- file for consistency -- even though either direction works fine in this
- function.
-
- (bmalloc::FreeList::take): Change to iterate from low to high so that we
- can maintain an index into the vector that is not disturbed even if we
- pop from the middle (which invalidates the last index in the vector).
-
- Decrement i when popping from the middle to make sure that we don't
- skip the next item after popping.
-
- (bmalloc::FreeList::removeInvalidAndDuplicateEntries): Ditto.
-
-2015-02-27 Ryosuke Niwa <rniwa@webkit.org>
-
- Fixed a typo in the previous commit.
-
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::setOwner):
-
-2015-02-27 Ryosuke Niwa <rniwa@webkit.org>
-
- EFL build fix after r180797.
-
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::owner):
- (bmalloc::BoundaryTag::setOwner):
-
-2015-02-27 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Pathological madvise churn on the free(malloc(x)) benchmark
- https://bugs.webkit.org/show_bug.cgi?id=142058
-
- Reviewed by Andreas Kling.
-
- The churn was caused by repeatedly splitting an object with physical
- pages from an object without, and then merging them back together again.
- The merge would conservatively forget that we had physical pages, forcing
- a new call to madvise on the next allocation.
-
- This patch more strictly segregates objects in the heap from objects in
- the VM heap, with these changes:
-
- (1) Objects in the heap are not allowed to merge with objects in the VM
- heap, and vice versa -- since that would erase our precise knowledge of
- which physical pages had been allocated.
-
- (2) The VM heap is exclusively responsible for allocating and deallocating
- physical pages.
-
- (3) The heap free list must consider entries for objects that are in the
- VM heap to be invalid, and vice versa. (This condition can arise
- because the free list does not eagerly remove items.)
-
- With these changes, we can know that any valid object in the heap's free
- list already has physical pages, and does not need to call madvise.
-
- Note that the VM heap -- as before -- might sometimes contain ranges
- or pieces of ranges that have physical pages, since we allow splitting
- of ranges at granularities smaller than the VM page size. These ranges
- can eventually merge with ranges in the heap during scavenging.
-
- * bmalloc.xcodeproj/project.pbxproj:
-
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::owner):
- (bmalloc::BoundaryTag::setOwner):
- (bmalloc::BoundaryTag::initSentinel):
- (bmalloc::BoundaryTag::hasPhysicalPages): Deleted.
- (bmalloc::BoundaryTag::setHasPhysicalPages): Deleted. Replaced the concept
- of "has physical pages" with a bit indicating which heap owns the large
- object. This is a more precise concept, since the old bit was really a
- Yes / Maybe bit.
-
- * bmalloc/Deallocator.cpp:
-
- * bmalloc/FreeList.cpp: Adopt
- (bmalloc::FreeList::takeGreedy):
- (bmalloc::FreeList::take):
- (bmalloc::FreeList::removeInvalidAndDuplicateEntries):
- * bmalloc/FreeList.h:
- (bmalloc::FreeList::push): Added API for considering the owner when
- deciding if a free list entry is valid.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap): Adopt new API.
-
- (bmalloc::Heap::scavengeLargeRanges): Scavenge all ranges with no minimum,
- since some ranges might be able to merge with ranges in the VM heap, and
- they won't be allowed to until we scavenge them.
-
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::allocateMediumPage):
- (bmalloc::Heap::allocateLarge): New VM heap API makes this function
- simpler, since we always get back physical pages now.
-
- * bmalloc/Heap.h:
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::end):
- (bmalloc::LargeObject::owner):
- (bmalloc::LargeObject::setOwner):
- (bmalloc::LargeObject::isValidAndFree):
- (bmalloc::LargeObject::merge): Do not merge objects across heaps since
- that causes madvise churn.
- (bmalloc::LargeObject::validateSelf):
- (bmalloc::LargeObject::init):
- (bmalloc::LargeObject::hasPhysicalPages): Deleted.
- (bmalloc::LargeObject::setHasPhysicalPages): Deleted. Propogate the Owner API.
-
- * bmalloc/Owner.h: Added.
-
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::SegregatedFreeList):
- (bmalloc::SegregatedFreeList::insert):
- (bmalloc::SegregatedFreeList::takeGreedy):
- (bmalloc::SegregatedFreeList::take):
- * bmalloc/SegregatedFreeList.h: Propogate the owner API.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::vmDeallocatePhysicalPagesSloppy):
- (bmalloc::vmAllocatePhysicalPagesSloppy): Clarified these functions and
- removed an edge case.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::VMHeap):
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateSmallPage):
- (bmalloc::VMHeap::allocateMediumPage):
- (bmalloc::VMHeap::allocateLargeObject):
- (bmalloc::VMHeap::deallocateLargeObject): Be sure to give each object
- a new chance to merge, since it might have been prohibited from merging
- before by virtue of not being in the VM heap.
-
- (bmalloc::VMHeap::allocateLargeRange): Deleted.
- (bmalloc::VMHeap::deallocateLargeRange): Deleted.
-
-2015-02-26 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Large object free list can grow infinitely
- https://bugs.webkit.org/show_bug.cgi?id=142055
-
- Reviewed by Andreas Kling.
-
- By design, we don't eagerly remove large objects from the free list.
- This creates two simple pathologies:
-
- (1) If you free and then allocate the same object repeatedly, it will
- duplicate itself in the free list repeatedly. Since it is never
- invalid at the time of allocation, it will never be removed.
-
- (2) If you split and then merge the same object repeatedly, it will
- duplicate its split sibling in the free list repeatedly. If its
- sibling is in a separate free list size class, it will never be
- consulted at the time of allocation, so it will never be removed.
-
- So, a simple "while (1) { free(malloc(x)); }" causes infinite memory
- use in the free list.
-
- The solution in this patch is a simple helper to remove garbage from the
- free list if it grows too large. This pathology is not common, so the
- cost is OK.
-
- Long-term, perhaps we should rethink the laziness of these free lists.
-
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::isMarked):
- (bmalloc::BoundaryTag::setMarked): New bit, used by free list GC.
-
- * bmalloc/FreeList.cpp:
- (bmalloc::FreeList::removeInvalidAndDuplicateEntries): The GC algorithm.
-
- * bmalloc/FreeList.h:
- (bmalloc::FreeList::FreeList):
- (bmalloc::FreeList::push): Invoke the GC if we're getting huge.
-
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::isMarked):
- (bmalloc::LargeObject::setMarked):
- (bmalloc::LargeObject::validateSelf): Expose the new bit.
-
- * bmalloc/Sizes.h: New constant to control GC frequency.
-
-2015-02-26 Csaba Osztrogonác <ossy@webkit.org>
-
- URTBF after r180693.
-
- * CMakeLists.txt:
-
-2015-02-26 Geoffrey Garen <ggaren@apple.com>
-
- Try to fix the Mac build.
-
- Unreviewed.
-
- * bmalloc.xcodeproj/project.pbxproj: Make FreeList.h available.
-
-2015-02-26 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Refactored SegregatedFreeList and BoundaryTag::init
- https://bugs.webkit.org/show_bug.cgi?id=142049
-
- Reviewed by Anders Carlsson.
-
- Split out a FreeList class from SegregatedFreeList. This will make it
- easier to add behaviors on free list insertion and removal -- and it's
- probably how I should have designed things at the start.
-
- Moved BoundaryTag::init into LargeObject, since all the related logic
- lives in LargeObject now too, and this allows us to remove BoundaryTagInlines.h.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/BoundaryTagInlines.h: Removed.
- * bmalloc/FreeList.cpp: Copied from Source/bmalloc/bmalloc/SegregatedFreeList.cpp.
- (bmalloc::FreeList::takeGreedy):
- (bmalloc::FreeList::take):
- (bmalloc::SegregatedFreeList::SegregatedFreeList): Deleted.
- (bmalloc::SegregatedFreeList::insert): Deleted.
- (bmalloc::SegregatedFreeList::takeGreedy): Deleted.
- (bmalloc::SegregatedFreeList::take): Deleted.
- * bmalloc/FreeList.h: Copied from Source/bmalloc/bmalloc/SegregatedFreeList.h.
- (bmalloc::FreeList::push):
- * bmalloc/LargeObject.h:
- (bmalloc::LargeObject::init):
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::SegregatedFreeList):
- (bmalloc::SegregatedFreeList::insert):
- (bmalloc::SegregatedFreeList::takeGreedy):
- (bmalloc::SegregatedFreeList::take):
- * bmalloc/SegregatedFreeList.h:
- * bmalloc/Sizes.h:
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
-
-2015-02-26 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: free up a bit in BoundaryTag
- https://bugs.webkit.org/show_bug.cgi?id=142048
-
- Reviewed by Brady Eidson.
-
- We were wasting a bit by accident, and I need one now.
-
- * bmalloc/Algorithm.h:
- (bmalloc::rightShift): Deleted. Not needed, now that I've simplified
- the math.
-
- * bmalloc/BoundaryTag.h: Since each boundary tag bucket is 1024 bytes
- long, the maximum offset into a bucket is 1023.
-
- You need 5 bits to count up to 1024, but only 4 to count up to 1023.
-
- Math is hard.
-
- (bmalloc::BoundaryTag::compactBegin): Switched to division because it
- is simpler, and easier to match up with our ASSERT. The compiler will
- turn division by constant power of two into a shift for us.
-
- (bmalloc::BoundaryTag::setRange): Added an ASSERT for compactBegin
- because we do encode it, so we should ASSERT that encoding did not
- lose information.
-
- * bmalloc/Sizes.h: Shifting is no longer used since we use division
- instead.
-
-2015-02-24 Stephanie Lewis <slewis@apple.com>
-
- Rolling out http://trac.webkit.org/changeset/180430 as it causes the PLT to crash.
- <rdar://problem/19948015>
-
- Unreviewed.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
- * bmalloc/VMHeap.h:
- * bmalloc/Zone.cpp:
- (bmalloc::Zone::Zone):
- (bmalloc::Zone::size): Deleted.
- * bmalloc/Zone.h:
-
-2015-02-24 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Added a little more abstraction for large objects
- https://bugs.webkit.org/show_bug.cgi?id=141978
-
- Reviewed by Sam Weinig.
-
- Previously, each client needed to manage the boundary tags of
- a large object using free functions. This patch introduces a LargeObject
- class that does things a little more automatically.
-
- * bmalloc.xcodeproj/project.pbxproj:
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate): Use the new LargeObject class.
-
- * bmalloc/BeginTag.h:
- (bmalloc::BeginTag::isInFreeList): Deleted. Moved this logic into the
- LargeObject class.
-
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::isSentinel):
- (bmalloc::BoundaryTag::compactBegin):
- (bmalloc::BoundaryTag::setRange):
- (bmalloc::BoundaryTag::initSentinel): Added an explicit API for sentinels,
- which we used to create and test for implicitly.
-
- * bmalloc/BoundaryTagInlines.h:
- (bmalloc::BoundaryTag::init):
- (bmalloc::validate): Deleted.
- (bmalloc::validatePrev): Deleted.
- (bmalloc::validateNext): Deleted.
- (bmalloc::BoundaryTag::mergeLeft): Deleted.
- (bmalloc::BoundaryTag::mergeRight): Deleted.
- (bmalloc::BoundaryTag::merge): Deleted.
- (bmalloc::BoundaryTag::deallocate): Deleted.
- (bmalloc::BoundaryTag::split): Deleted.
- (bmalloc::BoundaryTag::allocate): Deleted. Moved this logic into the
- LargeObject class.
-
- * bmalloc/EndTag.h:
- (bmalloc::EndTag::init):
- (bmalloc::EndTag::operator=): Deleted. Re-reading this code, I found
- special behavior in the assignment operator to be a surprising API.
- So, I replaced the assignment operation with an explicit initializing
- function.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::scavengeLargeRanges):
- (bmalloc::Heap::allocateXLarge):
- (bmalloc::Heap::findXLarge):
- (bmalloc::Heap::deallocateXLarge):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::deallocateLarge):
- * bmalloc/Heap.h: No behavior changes here -- just adopting the
- LargeObject interface.
-
- * bmalloc/LargeObject.h: Added.
- (bmalloc::LargeObject::operator!):
- (bmalloc::LargeObject::begin):
- (bmalloc::LargeObject::size):
- (bmalloc::LargeObject::range):
- (bmalloc::LargeObject::LargeObject):
- (bmalloc::LargeObject::setFree):
- (bmalloc::LargeObject::isFree):
- (bmalloc::LargeObject::hasPhysicalPages):
- (bmalloc::LargeObject::setHasPhysicalPages):
- (bmalloc::LargeObject::isValidAndFree):
- (bmalloc::LargeObject::merge):
- (bmalloc::LargeObject::split):
- (bmalloc::LargeObject::validateSelf):
- (bmalloc::LargeObject::validate): Moved this code into a class, out of
- BoundaryTag free functions.
-
- New to the class are these features:
-
- (1) Every reference to an object is validated upon creation and use.
-
- (2) There's an explicit API for "This is a reference to an object
- that might be stale (the DoNotValidate API)".
-
- (3) The begin and end tags are kept in sync automatically.
-
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::insert):
- (bmalloc::SegregatedFreeList::takeGreedy):
- (bmalloc::SegregatedFreeList::take):
- * bmalloc/SegregatedFreeList.h: Adopt the LargeObject interface.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateLargeRange):
- (bmalloc::VMHeap::deallocateLargeRange): Adopt the LargeObject interface.
-
-2015-02-20 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc should implement malloc introspection (to stop false-positive leaks when MallocStackLogging is off)
- https://bugs.webkit.org/show_bug.cgi?id=141802
-
- Reviewed by Andreas Kling.
-
- Rolling back in with a fix for a crash seen while using GuardMalloc.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
- * bmalloc/VMHeap.h:
- * bmalloc/Zone.cpp: Re-land the old patch.
-
- (bmalloc::Zone::size): Be sure to implement the size() function since
- it's accessible indirectly via the malloc_zone_from_ptr public API --
- and GuardMalloc calls it all the time.
-
- (bmalloc::Zone::Zone):
- * bmalloc/Zone.h: Re-land the old patch.
-
-2015-02-19 Commit Queue <commit-queue@webkit.org>
-
- Unreviewed, rolling out r180363.
- https://bugs.webkit.org/show_bug.cgi?id=141814
-
- Caused >50 crashes when running LayoutTests in GuardMalloc or
- ASAN modes. (Requested by jernoble on #webkit).
-
- Reverted changeset:
-
- "bmalloc should implement malloc introspection (to stop false-
- positive leaks when MallocStackLogging is off)"
- https://bugs.webkit.org/show_bug.cgi?id=141802
- http://trac.webkit.org/changeset/180363
-
-2015-02-19 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc should implement malloc introspection (to stop false-positive leaks when MallocStackLogging is off)
- https://bugs.webkit.org/show_bug.cgi?id=141802
-
- Reviewed by Andreas Kling.
-
- Fixed a last-minute type.
-
- The macro is OS, not PLATFORM.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
- * bmalloc/VMHeap.h:
- * bmalloc/Zone.h:
-
-2015-02-19 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc should implement malloc introspection (to stop false-positive leaks when MallocStackLogging is off)
- https://bugs.webkit.org/show_bug.cgi?id=141802
-
- Reviewed by Andreas Kling.
-
- This patch does the bare minimum to stop false positive leaks from
- being reported by the Darwin leaks tool. We register each super chunk
- as a single object, and then request that the leaks tool scan it.
-
- * bmalloc.xcodeproj/project.pbxproj: Added an abstraction for the malloc
- zone introspection API.
-
- * bmalloc/Algorithm.h: Missing #include.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
- * bmalloc/VMHeap.h: Adopt the new abstraction.
-
- * bmalloc/Zone.cpp: Added.
- (bmalloc::remoteRead): Helper for reading an object out of another process.
- (bmalloc::Zone::enumerator):
- (bmalloc::Zone::Zone): Register a malloc zone so that we will participate
- in introspection.
-
- * bmalloc/Zone.h: Added.
- (bmalloc::Zone::superChunks):
- (bmalloc::Zone::addSuperChunk): Use a non-dynamically-allocated vector
- since our dynamic allocations will not be scanned by leaks since they
- will have the malloc VM tag.
-
-2015-02-18 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: VMHeap should keep a record of all of its VM ranges (for malloc introspection)
- https://bugs.webkit.org/show_bug.cgi?id=141759
-
- Reviewed by Andreas Kling.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/SuperChunk.h: Added.
- (bmalloc::SuperChunk::create):
- (bmalloc::SuperChunk::SuperChunk):
- (bmalloc::SuperChunk::smallChunk):
- (bmalloc::SuperChunk::mediumChunk):
- (bmalloc::SuperChunk::largeChunk): Factored out super chunk creation
- into a separate class, for clarity and type safety.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::grow):
- (bmalloc::VMHeap::allocateSuperChunk): Renamed "allocateSuperChunk" to
- "grow" because Andreas found "allocateSuperChunk" to be unclear.
-
- * bmalloc/VMHeap.h: Track all our VM ranges. We will use this information
- for malloc introspection.
-
- (bmalloc::VMHeap::allocateSmallPage):
- (bmalloc::VMHeap::allocateMediumPage):
- (bmalloc::VMHeap::allocateLargeRange): Updated for renames.
-
-2015-02-18 Zan Dobersek <zdobersek@igalia.com>
-
- Build bmalloc through CMake as a static library. It's then linked either
- into the WTF library (if built as a shared library) or into the JSC and
- WebKit2 libraries. There's no need to build it as a standalone shared library.
-
- Rubber-stamped by Carlos Garcia Campos.
-
- * CMakeLists.txt:
-
-2015-02-13 Gyuyoung Kim <gyuyoung.kim@samsung.com>
-
- [BMalloc] Add a FIXME comment for memory alignas
- https://bugs.webkit.org/show_bug.cgi?id=141556
-
- Reviewed by Csaba Osztrogonác.
-
- * bmalloc/Chunk.h: Add a FIXME comment.
- * bmalloc/LargeChunk.h: ditto.
-
-2015-02-11 Csaba Osztrogonác <ossy@webkit.org>
-
- bmalloc buildfix on 32 bit Linux (x86/ARM)
- https://bugs.webkit.org/show_bug.cgi?id=141472
-
- Reviewed by Gyuyoung Kim.
-
- * bmalloc/Algorithm.h:
- (bmalloc::roundUpToMultipleOf):
- * bmalloc/FixedVector.h:
- (bmalloc::FixedVector::clear):
- * bmalloc/Sizes.h:
- (bmalloc::Sizes::sizeClass):
-
-2015-02-11 Gyuyoung Kim <gyuyoung.kim@samsung.com>
-
- [EFL][GTK] Use bmalloc instead of tcmalloc
- https://bugs.webkit.org/show_bug.cgi?id=140162
-
- Reviewed by Carlos Garcia Campos.
-
- Support to use bmalloc on EFL and GTK ports.
-
- * CMakeLists.txt: Added.
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate):
- Fix unused return value caused by posix_memalign().
- * bmalloc/AsyncTask.h:
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::clear):
- * bmalloc/Chunk.h:
- Change Traits::Page with Traits::PageType in order to fix
- -fpermitive build error on EFL and GTK port.
- * bmalloc/EndTag.h:
- (bmalloc::EndTag::operator=):
- * bmalloc/Line.h: ditto.
- * bmalloc/MediumTraits.h:
- * bmalloc/Page.h: ditto.
- * bmalloc/PerThread.h:
- EFL port doesn't support __has_include definition yet.
- Define HAVE_PTHREAD_MACHDEP_H according to check if __has_include is supported.
- * bmalloc/SmallTraits.h: ditto.
- * bmalloc/VMAllocate.h:
- (bmalloc::vmDeallocatePhysicalPages):
- (bmalloc::vmAllocatePhysicalPages):
- * bmalloc/Vector.h:
- (bmalloc::Vector<T>::push):
- (bmalloc::Vector<T>::reallocateBuffer):
-
-2015-01-31 Sam Weinig <sam@webkit.org>
-
- Remove even more Mountain Lion support
- https://bugs.webkit.org/show_bug.cgi?id=141124
-
- Reviewed by Alexey Proskuryakov.
-
- * Configurations/Base.xcconfig:
- * Configurations/DebugRelease.xcconfig:
-
-2015-01-30 Geoffrey Garen <ggaren@apple.com>
-
- GC marking threads should clear malloc caches
- https://bugs.webkit.org/show_bug.cgi?id=141097
-
- Reviewed by Andreas Kling.
-
- Split the scavenging API into per-thread vs global, so that you can
- request to scavenge your own thread without scavenging the whole heap.
-
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::scavenge):
- * bmalloc/bmalloc.h:
- (bmalloc::api::scavengeThisThread):
- (bmalloc::api::scavenge):
-
-2015-01-28 Dana Burkart <dburkart@apple.com>
-
- Move ASan flag settings from DebugRelease.xcconfig to Base.xcconfig
- https://bugs.webkit.org/show_bug.cgi?id=136765
-
- Reviewed by Alexey Proskuryakov.
-
- * Configurations/Base.xcconfig:
- * Configurations/DebugRelease.xcconfig:
-
-2015-01-21 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: support aligned allocation
- https://bugs.webkit.org/show_bug.cgi?id=140732
-
- Reviewed by Andreas Kling.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate): New function for aligned allocation.
-
- Small and medium requests just allocate and free until they find an
- aligned pointer. This is slightly inefficient in the worst case, but
- still constant-time with little-to-no space overhead.
-
- Large requests use a new API that requires the client to specify both
- its ideal size and alignment, and the worst-case size you would have to
- allocate in order to produce some interior pointer of the requested size
- and alignment. We put the burden of this calculation on the client
- because it simplifies things if we guarantee that allocation won't fail.
-
- XLarge requests are easy: we just forward them to vmAllocate, which
- already supported aligned requests.
-
- * bmalloc/BoundaryTag.h:
- * bmalloc/BoundaryTagInlines.h:
- (bmalloc::BoundaryTag::mergeLeft):
- (bmalloc::BoundaryTag::mergeRight):
- (bmalloc::BoundaryTag::merge):
- (bmalloc::BoundaryTag::deallocate):
- (bmalloc::BoundaryTag::split):
- (bmalloc::BoundaryTag::allocate): No behavior change here. I just
- refactored the interface to remove some reference out parameters in
- order to clarify what changes and what doesn't.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateXLarge): Added an alignment API.
-
- (bmalloc::Heap::allocateLarge):
- * bmalloc/Heap.h: Added an alignment API. I split out allocateLarge into
- a few variants, so aligned and unaligned allocation could share some code.
-
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::take):
- * bmalloc/SegregatedFreeList.h: Changed to use a separate, explicit API
- for aligned allocation. It turns out that the aligned path is pretty
- different, since it ends up searching for two potential ways to satisfy
- an allocation: either large enough and aligned, or large enough to split
- into something not aligned and something large enough and aligned.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::vmAllocate): Switched alignment to come before size because
- that's how the memalign API specifies it.
-
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateLargeRange): Added an alignment API.
-
-2015-01-20 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: a little bit of cleanup
- https://bugs.webkit.org/show_bug.cgi?id=140687
-
- Reviewed by Anders Carlsson.
-
- * bmalloc/Algorithm.h:
- (bmalloc::isPowerOfTwo): Added a check for 0, since 0 would break a lot
- of code.
-
- * bmalloc/BoundaryTag.h:
- * bmalloc/BoundaryTagInlines.h:
- (bmalloc::BoundaryTag::mergeLeft):
- (bmalloc::BoundaryTag::mergeRight):
- (bmalloc::BoundaryTag::merge):
- (bmalloc::BoundaryTag::deallocate):
- (bmalloc::BoundaryTag::split):
- (bmalloc::BoundaryTag::allocate):
- (bmalloc::BoundaryTag::mergeLargeLeft): Deleted.
- (bmalloc::BoundaryTag::mergeLargeRight): Deleted.
- (bmalloc::BoundaryTag::mergeLarge): Deleted.
- (bmalloc::BoundaryTag::splitLarge): Deleted. Removed the word "Large"
- from all these functions, since boundary tags always pertain to large
- objects, and putting the word "Large" everywhere wasn't helping to
- explain that.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateXLarge):
- (bmalloc::Heap::findXLarge):
- (bmalloc::Heap::deallocateXLarge):
- * bmalloc/Heap.h:
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateXLarge): Deleted.
- (bmalloc::VMHeap::findXLarge): Deleted.
- (bmalloc::VMHeap::deallocateXLarge): Deleted. Moved XLarge allocation
- from VMHeap to Heap. Since the purpose of the VMHeap is to cache VM
- ranges, and the VMHeap never caches any XLarge ranges, it doesn't
- really make sense for the VMHeap to be involved.
-
-2015-01-16 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: refactored XLarge allocation for better alignment
- https://bugs.webkit.org/show_bug.cgi?id=140582
-
- Reviewed by Andreas Kling.
-
- XLarge objects used to be Large objects with an extra bit of metadata
- that said "actually, I'm not large -- I'm extra large".
-
- The metadata header in an XLarge allocation made it impossible for the
- XLarge object to honor a very large alignment request.
-
- The solution is to stop using a metadata header for XLarge objects, and
- instead to store explicit metadata on the side.
-
- This is a bit less astonishing, which is also nice.
-
- Finding XLarge metadata is now a linear search. That's probably OK, since
- it was always so in TCMalloc, and the usual number of XLarge allocations
- in a process is 0.
-
- This design makes it possible for the heap to cache XLarge allocations
- with and/or without physical pages. I haven't actually done that yet
- because the tradeoffs are subtle, so I don't want to do anything without
- a motivating test case.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate): Removed the concept of an XLargeChunk,
- since an XLarge allocation is now just a naked buffer without a header.
-
- (bmalloc::Allocator::allocateXLarge): Added an explicit qualifier for
- XLarge alignment, since XLargeChunk won't give this to us implicitly
- anymore.
-
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::setRange):
- (bmalloc::BoundaryTag::isXLarge): Deleted.
- (bmalloc::BoundaryTag::setXLarge): Deleted.
- * bmalloc/BoundaryTagInlines.h:
- (bmalloc::validate):
- (bmalloc::BoundaryTag::deallocate): Removed the XLarge hacks from Large allocations.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::deallocateXLarge):
- (bmalloc::Deallocator::deallocateSlowCase):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::findXLarge):
- (bmalloc::Heap::allocateXLarge):
- (bmalloc::Heap::deallocateXLarge):
- * bmalloc/Heap.h: Updated for interface changes.
-
- * bmalloc/ObjectType.cpp:
- (bmalloc::objectType):
- * bmalloc/ObjectType.h:
- (bmalloc::isXLarge): We can now tell if a pointer is XLarge just by
- examining its bit pattern -- just like we do for other kinds of
- allocations -- which is nice.
-
- * bmalloc/Sizes.h:
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateXLarge):
- (bmalloc::VMHeap::findXLarge):
- (bmalloc::VMHeap::deallocateXLarge): Keep an explicit vector of metadata
- for XLarge allocations.
-
- * bmalloc/XLargeChunk.h: Removed.
-
-2015-01-16 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: added some infrastructure for aligned allocation
- https://bugs.webkit.org/show_bug.cgi?id=140572
-
- Reviewed by Andreas Kling.
-
- * bmalloc/Algorithm.h:
- (bmalloc::isPowerOfTwo):
- (bmalloc::roundUpToMultipleOf):
- (bmalloc::roundDownToMultipleOf): Refactored some duplicate code to use our
- isPowerOfTwo helper function.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocate):
- * bmalloc/Allocator.h: Stubbed out an implementation of aligned allocation.
- Doesn't do anything yet, but does correctly forward to system malloc
- when bmalloc is disabled.
-
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::allocateSlowCaseNullCache):
- * bmalloc/Cache.h:
- (bmalloc::Cache::allocate):
- * bmalloc/bmalloc.h:
- (bmalloc::api::memalign):
- * bmalloc/mbmalloc.cpp: Stubbed out an API for aligned allocation.
-
-2015-01-13 Geoffrey Garen <ggaren@apple.com>
-
- Consider alignment when allocating from a SegregatedFreeList
- https://bugs.webkit.org/show_bug.cgi?id=140408
-
- Reviewed by Sam Weinig.
-
- In preparation for supporting aligned allocation.
-
- No performance change.
-
- Since this is just one extra branch in an already expensive function,
- I decided not to duplicate the function just to avoid the branch in
- the un-aligned case.
-
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::take):
- * bmalloc/SegregatedFreeList.h:
-
-2015-01-13 Geoffrey Garen <ggaren@apple.com>
-
- Renamed minimum to size in SegregatedFreeList
- https://bugs.webkit.org/show_bug.cgi?id=140406
-
- Reviewed by Sam Weinig.
-
- In preparation for supporting aligned allocation.
-
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::takeGreedy):
- (bmalloc::SegregatedFreeList::take): Every size passed to malloc is
- really just a minimum. Let's not imply that this value is special.
-
-2015-01-11 Dan Bernstein <mitz@apple.com>
-
- Geoff is organized, but he is not an organization.
-
- Rubber-stamped by Anders Carlsson.
-
- * bmalloc.xcodeproj/project.pbxproj: Removed the ORGANIZATIONNAME project attribute.
-
-2015-01-07 Geoffrey Garen <ggaren@apple.com>
-
- Make bmalloc work with ASan
- https://bugs.webkit.org/show_bug.cgi?id=140194
-
- Reviewed by Mark Lam.
-
- * bmalloc/BPlatform.h: Added a way to detect Darwin OSes, since we need
- an OS-specific API to test for loaded runtime libraries.
-
- * bmalloc/Environment.cpp:
- (bmalloc::isASanEnabled):
- (bmalloc::Environment::computeIsBmallocEnabled): Disabled bmalloc if
- ASan is enabled, since system malloc has the Asan hooks we need.
-
- You could check for the ASan compile-time flag instead, but doing this
- check at runtime prepares bmalloc for a world where it is a dynamic
- library that might be loaded into projects it did not compile with.
-
-2015-01-05 Geoffrey Garen <ggaren@apple.com>
-
- Fix up bmalloc's PerThread for use on Linux
- https://bugs.webkit.org/show_bug.cgi?id=139804
-
- Reviewed by Anders Carlsson.
-
- The previous implementation was a bit slow.
-
- * bmalloc/PerThread.h:
- (bmalloc::PerThreadStorage<Cache>::get):
- (bmalloc::PerThreadStorage::get):
- (bmalloc::PerThreadStorage::init): Added a catch-all cross-platform Unix
- way to do fast per-thread access without taking a lock every time. This
- probably works on all the platforms we care about, and it matches other
- techniques we use elsewhere in WebKit.
-
- (bmalloc::PerThread<T>::getFastCase): Removed the conditional from
- this class because PerThreadStorage now encapsulates everything that
- needs to be conditional.
-
- (bmalloc::PerThreadStorage::initSharedKeyIfNeeded): Deleted.
-
-2014-12-26 Dan Bernstein <mitz@apple.com>
-
- <rdar://problem/19348208> REGRESSION (r177027): iOS builds use the wrong toolchain
- https://bugs.webkit.org/show_bug.cgi?id=139950
-
- Reviewed by David Kilzer.
-
- * Configurations/Base.xcconfig: Only define TOOLCHAINS when building for OS X, doing so
- in a manner that works with Xcode 5.1.1.
-
-2014-12-15 Geoffrey Garen <ggaren@apple.com>
-
- Safari crashes when you set Malloc environment variables
- https://bugs.webkit.org/show_bug.cgi?id=139656
-
- Reviewed by Michael Saboff.
-
- I forgot to cover the realloc() case. Whoops. (OoPS?)
-
- This time around, I ran the full MallocBench test suite in Malloc=1
- mode, and it passed.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::reallocate):
- * bmalloc/Allocator.h: Pushed realloc() logic down into the allocator.
- It needs to be down there so that we can do the short-circuiting check
- for whether bmalloc is enabled first.
-
- Also added the check.
-
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::scavenge):
- (bmalloc::Cache::Cache):
- (bmalloc::Cache::reallocateSlowCaseNullCache):
- * bmalloc/Cache.h:
- (bmalloc::Cache::deallocator):
- (bmalloc::Cache::reallocate): Ditto.
-
- * bmalloc/bmalloc.h:
- (bmalloc::api::free):
- (bmalloc::api::realloc): Ditto.
-
- (bmalloc::api::scavenge): Pushed this down into Cache to match the
- surrounding functions.
-
-2014-12-11 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc should support system memory analysis tools (part 2)
- https://bugs.webkit.org/show_bug.cgi?id=139565
-
- Reviewed by Mark Lam.
-
- This patch actually queries the environment to see if memory analysis
- tools have been enabled.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::scavenge): Don't process the object log if
- we've disabled bmalloc because it will be full of invalid nullptrs.
-
- * bmalloc/Environment.cpp:
- (bmalloc::isMallocEnvironmentVariableSet): Test for the list of known
- Malloc debugging flags. I also added a plain "Malloc" catch-all for
- when you want to disable bmalloc without enabling any kind of funny
- business.
-
- It would be slightly nicer just to iterate the list of environment
- variables and strstr them, but getenv is the more portable option,
- and performance here doesn't really matter.
-
- (bmalloc::isLibgmallocEnabled): Test for the libgmalloc insertion
- environment variable.
-
- (bmalloc::Environment::computeIsBmallocEnabled):
-
-2014-12-11 Geoffrey Garen <ggaren@apple.com>
-
- Try to fix the iOS simulator build.
-
- #include the declaration of malloc / free.
-
- * bmalloc/Allocator.cpp:
- * bmalloc/Deallocator.cpp:
-
-2014-12-11 Geoffrey Garen <ggaren@apple.com>
-
- Try to fix the build.
-
- * bmalloc.xcodeproj/project.pbxproj: Marked a header exported.
-
-2014-12-11 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc should support system memory analysis tools (part 1)
- https://bugs.webkit.org/show_bug.cgi?id=139559
-
- Reviewed by Mark Lam.
-
- This patch adds the hooks to disable bmalloc at runtime if certain
- environment variables are set, but doesn't actually read from the
- environment yet.
-
- No performance change.
-
- * bmalloc.xcodeproj/project.pbxproj: Added the Environment class, which
- we'll use to read environment variables and see if memory analysis tools
- have been enabled.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator):
- (bmalloc::Allocator::allocateSlowCase): Added a hook to disable bmalloc
- on the allocation path. We cache the setting to make the check fast.
-
- * bmalloc/Allocator.h: Interface changes.
-
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::Cache): Pass a heap pointer through to our allocator
- and deallocator. This main purpose is to enable them to query the
- environment for whether bmalloc is enabled; but this is also a slightly
- cleaner way to guarantee to them that the Heap has been pre-initialized.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::Deallocator): If bmalloc is disable, artificially
- fill the object log to force us to take the slow path on all deallocations.
-
- (bmalloc::Deallocator::deallocateSlowCase): Do the disabled check.
-
- * bmalloc/Deallocator.h: Interface changes.
-
- * bmalloc/Environment.cpp: Added.
- (bmalloc::Environment::Environment):
- (bmalloc::Environment::computeIsBmallocEnabled):
- * bmalloc/Environment.h: Added.
- (bmalloc::Environment::isBmallocEnabled): This is the class that will
- encapsulate looking for environment variables that turn on heap
- analysis tools.
-
- * bmalloc/Heap.h:
- (bmalloc::Heap::environment):
-
- * bmalloc/Mutex.h:
- (bmalloc::Mutex::Mutex):
- * bmalloc/StaticMutex.h: A little refactoring to clarify these comments,
- since I got super confused about them while writing this patch.
-
- * bmalloc/VMHeap.cpp: Fixed an #include.
-
-2014-12-09 David Kilzer <ddkilzer@apple.com>
-
- Switch from using PLATFORM_NAME to SDK selectors in ANGLE, bmalloc, gtest, JavaScriptCore, WTF
- <http://webkit.org/b/139212>
-
- Reviewed by Joseph Pecoraro.
-
- * Configurations/Base.xcconfig:
- - Only set GCC_ENABLE_OBJC_GC, GCC_MODEL_TUNING and TOOLCHAINS
- on OS X.
- * Configurations/DebugRelease.xcconfig:
- - Only set MACOSX_DEPLOYMENT_TARGET and SDKROOT on OS X.
-
-2014-11-07 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc uses 8X more virtual memory than necessary
- https://bugs.webkit.org/show_bug.cgi?id=138495
-
- Reviewed by Mark Lam.
-
- iOS has a per-process virtual memory cap around 1GB, so there's some
- value to not going totally ham with virtual memory.
-
- We currently use about 8X the necessary amount:
- - 2X to align our VM allocation
- - 4X to reserve small / medium / (2) large chunk VM ranges per superchunk
-
- We can cut that down:
- - Return the unaligned portion of our VM allocation (-2X)
- - Use all the chunks in a superchunk, instead of allocating one
- chunk per superchunk (-4X)
-
- * bmalloc/Algorithm.h:
- (bmalloc::roundUpToMultipleOf): Added a non-constant version of this
- function so we can call it with getpagesize() at runtime.
-
- * bmalloc/Chunk.h:
- * bmalloc/LargeChunk.h:
- (bmalloc::LargeChunk::create): Deleted. Instead of each chunk allocating
- its own VM, VMHeap allocates the superchunk and all the chunks in it at a time.
-
- * bmalloc/VMAllocate.h:
- (bmalloc::vmValidate):
- (bmalloc::vmAllocate): ASSERT that mmap succeeds to make crashes clearer
- if it does not succeed. Allocate precisely, and give back the extra.
-
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateSuperChunk):
- (bmalloc::VMHeap::allocateSmallChunk): Deleted.
- (bmalloc::VMHeap::allocateMediumChunk): Deleted.
- (bmalloc::VMHeap::allocateLargeChunk): Deleted. Use all the chunks
- in a superchunk, instead of just one.
-
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateSmallPage):
- (bmalloc::VMHeap::allocateMediumPage):
- (bmalloc::VMHeap::allocateLargeRange):
- * bmalloc/XLargeChunk.h:
- (bmalloc::XLargeChunk::create): Updated to match changes above.
-
-2014-11-01 David Kilzer <ddkilzer@apple.com>
-
- JavaScriptCore is missing debug info for bmalloc because libbmalloc.a is stripped
- <https://webkit.org/b/138286>
- <rdar://problem/18847087>
-
- Reviewed by Dan Bernstein.
-
- * Configurations/bmalloc.xcconfig: Set STRIP_INSTALLED_PRODUCT
- to NO for the target that produces libbmalloc.a so that the
- debug symbols will be linked into JavaScriptCore and end up in
- its dSYM file.
-
-2014-10-30 Dana Burkart <dburkart@apple.com>
-
- <rdar://problem/18821260> Prepare for the mysterious future
-
- Reviewed by Lucas Forschler.
-
- * Configurations/Base.xcconfig:
- * Configurations/DebugRelease.xcconfig:
-
-2014-09-24 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: cleaned up fast path vs slow path
- https://bugs.webkit.org/show_bug.cgi?id=137081
-
- Reviewed by Sam Weinig.
-
- Might be a 1% speedup on MallocBench. Also cleans up the code a bit.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator): Merged the small and medium range
- caches, just like the small and medium allocators. Ranges are abstract
- objects that don't really care whether they hold small or medium objects,
- so they don't need to be segregated.
-
- (bmalloc::Allocator::scavenge): Ditto.
-
- (bmalloc::Allocator::allocateBumpRangeSlowCase):
- (bmalloc::Allocator::allocateBumpRange): Same thing here, except that
- we do care a tiny bit, because we need to specify small vs medium when
- allocating new ranges from the heap, to ensure that the heap allocates
- from the right segment of VM.
-
- (bmalloc::Allocator::allocateLarge):
- (bmalloc::Allocator::allocateXLarge): NO_INLINE because this was clouding
- up the fast path. Large allocation performance is dominated by allocation
- logic and initialization, so inlining it doesn't help.
-
- (bmalloc::Allocator::allocateSlowCase): Slow path got a bit cleaner since
- it doesn't need to distinguish small vs medium objects.
-
- (bmalloc::Allocator::allocateSmallBumpRange): Deleted.
- (bmalloc::Allocator::allocateMediumBumpRange): Deleted.
-
- * bmalloc/Allocator.h:
- * bmalloc/BumpRange.h:
-
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::allocateSlowCase): Deleted.
- (bmalloc::Cache::deallocateSlowCase): Deleted.
- * bmalloc/Cache.h:
- (bmalloc::Cache::allocate):
- (bmalloc::Cache::deallocate):
- (bmalloc::Cache::allocateFastCase): Deleted.
- (bmalloc::Cache::deallocateFastCase): Deleted. Removed the Cache slow
- paths. The downside to this change is that the fast path branches to two
- distinct failure cases instead of one. The upside is that the slow path
- doesn't need to re-read the segment register, which is not as cheap as a
- normal register, and it doesn't need to do an extra level of function
- call. Seems to be worth it.
-
- * bmalloc/Deallocator.h:
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::refillSmallBumpRangeCache):
- (bmalloc::Heap::refillMediumBumpRangeCache):
- * bmalloc/Heap.h: Updated for interface changes.
-
- * bmalloc/Sizes.h: The most ranges a cache will hold is the number of
- small lines in a page / 2, since any other free lines will coalesce
- with their neighbors.
-
-2014-09-23 Geoffrey Garen <ggaren@apple.com>
-
- Rolled out r173346.
-
- bmalloc should honor the FastMalloc statistics API
- https://bugs.webkit.org/show_bug.cgi?id=136592
-
- This didn't really work. Because we allow ranges with and without
- physical pages to merge, and we allow double-committing and
- double-decommitting, we can't rely on commit actions to track memory
- footprint.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::size): Deleted.
- (bmalloc::Heap::capacity): Deleted.
- * bmalloc/Heap.h:
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::VMHeap):
- (bmalloc::VMHeap::allocateSmallChunk):
- (bmalloc::VMHeap::allocateMediumChunk):
- (bmalloc::VMHeap::allocateLargeChunk):
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateSmallPage):
- (bmalloc::VMHeap::allocateMediumPage):
- (bmalloc::VMHeap::allocateLargeRange):
- (bmalloc::VMHeap::deallocateSmallPage):
- (bmalloc::VMHeap::deallocateMediumPage):
- (bmalloc::VMHeap::deallocateLargeRange):
- (bmalloc::VMHeap::size): Deleted.
- (bmalloc::VMHeap::capacity): Deleted.
- * bmalloc/bmalloc.h:
- (bmalloc::api::heapSize): Deleted.
- (bmalloc::api::heapCapacity): Deleted.
-
-2014-09-23 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Allocation should be more precise
- https://bugs.webkit.org/show_bug.cgi?id=136993
-
- Reviewed by Gavin Barraclough.
-
- 13% reduction in heap size on the MallocBench *_memory_warning benchmarks.
-
- This patch teaches the allocator to merge adjacent free lines into a
- single allocatable range. This allows us to shrink the size of an
- individual line without increasing fragmentation or the rate of allocator
- slow paths.
-
- We'll only take more slow paths when available memory is sparse, which
- is exactly when it's worth it. When available memory is dense, we'll
- take fewer slow paths.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Algorithm.h:
- (bmalloc::divideRoundingUp):
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator): Updated for interface changes.
-
- (bmalloc::Allocator::scavenge): Scavenge by object instead of by line.
- Now that we merge lines, it's not convenient to scavenge by line.
-
- (bmalloc::Allocator::allocateSmallBumpRange):
- (bmalloc::Allocator::allocateMediumBumpRange): Allocate whole ranges
- instead of individual lines.
-
- (bmalloc::Allocator::allocateSlowCase):
- (bmalloc::Allocator::allocateSmallLine): Deleted.
- (bmalloc::Allocator::allocateMediumLine): Deleted.
- (bmalloc::Allocator::allocateMedium): Deleted.
- * bmalloc/Allocator.h:
- (bmalloc::Allocator::allocateFastCase): Folded medium allocations
- into the standard fast path with small allocations. Since a BumpAllocator
- just allocates out of an arbitrary range, it doesn't need to distinguish
- between small and medium lines.
-
- * bmalloc/BumpAllocator.h:
- (bmalloc::BumpAllocator::size):
- (bmalloc::BumpAllocator::BumpAllocator):
- (bmalloc::BumpAllocator::init):
- (bmalloc::BumpAllocator::refill):
- (bmalloc::BumpAllocator::line): Deleted. No need to track line information
- anymore: the heap just gives us a pointer and a pre-computed number of
- objects, and we allocate them.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::processObjectLog): Updated for interface changes.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::initializeLineMetadata): Pre-compute precise metadata
- detailing where all objects will lie in memory. After we merge two lines,
- we might allocate an object that spans from one line to the next. This
- metadata details which bits of memory overlap in that way, and how they
- overlap.
-
- (bmalloc::Heap::refillSmallBumpRangeCache):
- (bmalloc::Heap::refillMediumBumpRangeCache): Scan a whole page at a time,
- and merge adjacent free lines into BumpRanges.
-
- (bmalloc::Heap::allocateSmallPage):
- (bmalloc::Heap::allocateMediumPage):
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::deallocateMediumLine): Track pages rather than lines,
- since we scan for free memory a page at a time.
-
- (bmalloc::Heap::allocateSmallLineSlowCase): Deleted.
- (bmalloc::Heap::allocateMediumLineSlowCase): Deleted. Folded into the
- fast path.
-
- * bmalloc/Heap.h:
- (bmalloc::Heap::derefSmallLine):
- (bmalloc::Heap::derefMediumLine):
- (bmalloc::Heap::deallocateSmallLine): Deleted.
- (bmalloc::Heap::allocateSmallLine): Deleted.
- (bmalloc::Heap::deallocateMediumLine): Deleted.
- (bmalloc::Heap::allocateMediumLine): Deleted. Updated for interface changes.
-
- * bmalloc/Line.h:
- (bmalloc::Line<Traits>::ref):
- (bmalloc::Line<Traits>::deref):
- (bmalloc::Line<Traits>::concurrentRef): Deleted. We don't pass a derefCount
- anymore, since we only ever deref by 1 now.
-
- * bmalloc/MediumAllocator.h:
- (bmalloc::MediumAllocator::isNull): Deleted.
- (bmalloc::MediumAllocator::MediumAllocator): Deleted.
- (bmalloc::MediumAllocator::line): Deleted.
- (bmalloc::MediumAllocator::allocate): Deleted.
- (bmalloc::MediumAllocator::derefCount): Deleted.
- (bmalloc::MediumAllocator::refill): Deleted.
- (bmalloc::MediumAllocator::clear): Deleted. Deleted some code that's
- been dead for a while, since it doesn't build anymore with this patch.
-
- * bmalloc/Page.h:
- (bmalloc::Page::sizeClass):
- (bmalloc::Page::setSizeClass):
- (bmalloc::Page::smallSizeClass): Deleted.
- (bmalloc::Page::setSmallSizeClass): Deleted. Renamed setSmallSizeClass
- to sizeClass, since we use it for medium sizes too.
-
- * bmalloc/Sizes.h:
- (bmalloc::Sizes::sizeClass):
- (bmalloc::Sizes::objectSize): Shrank line sizes to save memory.
-
- (bmalloc::Sizes::smallSizeClassFor): Deleted.
- (bmalloc::Sizes::mediumSizeClassFor): Deleted.
-
- * bmalloc/bmalloc.h:
- (bmalloc::api::realloc): Now that we have precise objects sizes, realloc
- can be a bit more precise. It also has to be, since we can't guarantee
- that an object ends at the end of a line anymore.
-
-2014-09-19 Daniel Bates <dabates@apple.com>
-
- Always assume internal SDK when building configuration Production
- https://bugs.webkit.org/show_bug.cgi?id=136925
- <rdar://problem/18362399>
-
- Reviewed by Dan Bernstein.
-
- * Configurations/Base.xcconfig:
-
-2014-09-16 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: moved line caches from the deallocator to the allocator
- https://bugs.webkit.org/show_bug.cgi?id=136868
-
- Reviewed by Gavin Barraclough.
-
- I did this mostly as a simplification, to make it easier to change the
- allocation strategy.
-
- No throughput change on MallocBench. Saves about 50kB.
-
- Since the deallocator needs to lock the heap when freeing lines anyway,
- there isn't much benefit to giving the deallocator a local cache of
- deallocated lines.
-
- We still give the allocator a local cache of lines because that does
- reduce the frequency at which it needs to lock the heap in order to
- acquire more lines.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::scavenge):
- (bmalloc::Allocator::allocateSmallLine):
- (bmalloc::Allocator::allocateMediumLine):
- (bmalloc::Allocator::allocateMedium):
- (bmalloc::Allocator::allocateSlowCase):
- * bmalloc/Allocator.h:
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::Deallocator):
- (bmalloc::Deallocator::scavenge):
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSmallLine): Deleted.
- (bmalloc::Deallocator::allocateSmallLine): Deleted.
- (bmalloc::Deallocator::deallocateMediumLine): Deleted.
- (bmalloc::Deallocator::allocateMediumLine): Deleted.
- * bmalloc/Deallocator.h:
-
- * bmalloc/Sizes.h:
- * bmalloc/VMAllocate.h: Took the opportunity to make the line cache size
- exactly one page in size. That's about what we were shooting for anyway,
- and it may make it easier to switch to per-page allocation in future.
-
-2014-09-15 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: allocate small and medium objects using the same bump pointer class
- https://bugs.webkit.org/show_bug.cgi?id=136843
-
- Reviewed by Gavin Barraclough.
-
- 4% speedup on MallocBench.
-
- Now that medium-sized objects have dedicated per-size allocators, they
- don't need to use an arbitrary bump pointer allocator. This means that
- every allocator knows how many objects it will allocate from the start,
- and we don't need a post-processing step to adjust refcounts based on
- real allocation count.
-
- * bmalloc.xcodeproj/project.pbxproj: Renamed SmallAllocator to BumpAllocator
- since it's used for small and medium objects now.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator): Updated to use new interface.
- (bmalloc::Allocator::scavenge): To "retire" an allocator, we just need
- to make sure that we finish allocating all the objects in it.
-
- (bmalloc::Allocator::allocateMedium):
- (bmalloc::Allocator::allocateSlowCase):
- (bmalloc::Allocator::retire): Deleted.
- (bmalloc::Allocator::processSmallAllocatorLog): Deleted.
- (bmalloc::Allocator::processMediumAllocatorLog): Deleted.
- * bmalloc/Allocator.h:
- (bmalloc::Allocator::allocateFastCase): Removed abstractions and data
- used to post-process an allocator based on how many objects it allocated.
-
- * bmalloc/BumpAllocator.h: Copied from Source/bmalloc/bmalloc/SmallAllocator.h.
- (bmalloc::BumpAllocator::BumpAllocator):
- (bmalloc::BumpAllocator::init):
- (bmalloc::BumpAllocator::line):
- (bmalloc::BumpAllocator::validate):
- (bmalloc::BumpAllocator::allocate):
- (bmalloc::BumpAllocator::refill):
- (bmalloc::BumpAllocator::clear): Updated these functions to be agnostic
- about the kinds of lines they allocate into. In some cases, the line
- type must be provided as a template parameter by the caller.
-
- (bmalloc::SmallAllocator::SmallAllocator): Deleted.
- (bmalloc::SmallAllocator::line): Deleted.
- (bmalloc::SmallAllocator::allocate): Deleted.
- (bmalloc::SmallAllocator::objectCount): Deleted.
- (bmalloc::SmallAllocator::derefCount): Deleted.
- (bmalloc::SmallAllocator::refill): Deleted.
- (bmalloc::SmallAllocator::clear): Deleted.
-
- * bmalloc/ObjectType.h:
- (bmalloc::isMedium):
-
- * bmalloc/SmallAllocator.h:
- (bmalloc::SmallAllocator::isNull): Deleted.
- (bmalloc::SmallAllocator::canAllocate): Deleted.
- (bmalloc::SmallAllocator::SmallAllocator): Deleted.
- (bmalloc::SmallAllocator::line): Deleted.
- (bmalloc::SmallAllocator::allocate): Deleted.
- (bmalloc::SmallAllocator::objectCount): Deleted.
- (bmalloc::SmallAllocator::derefCount): Deleted.
- (bmalloc::SmallAllocator::refill): Deleted.
- (bmalloc::SmallAllocator::clear): Deleted.
-
-2014-09-12 Geoffrey Garen <ggaren@apple.com>
-
- Fixed a goof in bmalloc Vector sizing
- https://bugs.webkit.org/show_bug.cgi?id=136795
-
- Reviewed by Gavin Barraclough and Sam Weinig.
-
- We want our minimum vector to be page-sized since the OS will give us
- a page no matter what -- but we want that many bytes, and not enough
- bytes to store that many elements.
-
- * bmalloc/Vector.h: Math is hard.
-
-2014-09-11 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc should segregate medium-sized objects by line like it does for small-sized objects
- https://bugs.webkit.org/show_bug.cgi?id=136693
-
- Reviewed by Gavin Barraclough.
-
- 4% reduction in heap size on the MallocBench *_memory_warning benchmarks.
-
- No throughput change.
-
- We keep an array of medium allocators, just like our array of small
- allocators.
-
- In future, we can simplify the allocation fast path by merging the small
- and medium allocator arrays. For now, this is the simplest change that
- gets the win.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator):
- (bmalloc::Allocator::scavenge):
- (bmalloc::Allocator::allocateMedium):
- * bmalloc/Allocator.h:
- * bmalloc/Sizes.h:
- (bmalloc::Sizes::mediumSizeClassFor):
-
-2014-09-11 Geoffrey Garen <ggaren@apple.com>
-
- Reviewed by Sam Weinig.
-
- Renamed log => retire for clarity.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::scavenge):
- (bmalloc::Allocator::retire):
- (bmalloc::Allocator::allocateMedium):
- (bmalloc::Allocator::allocateSlowCase):
- (bmalloc::Allocator::log): Deleted.
- * bmalloc/Allocator.h:
-
-2014-09-11 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: eager scavenge leaves behind a bogus allocator
- https://bugs.webkit.org/show_bug.cgi?id=136743
-
- Reviewed by Sam Weinig.
-
- Be sure to clear the allocator after logging it in the eager scavenge
- case, so that we don't later try to allocate out of the lines that we
- have thrown away.
-
- We didn't need to do this previously because scavenge would only happen
- at thread exit time, after which no further allocation from the per-thread
- cache would take place.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::scavenge):
- * bmalloc/MediumAllocator.h:
- (bmalloc::MediumAllocator::clear):
- * bmalloc/SmallAllocator.h:
- (bmalloc::SmallAllocator::clear):
-
-2014-09-05 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc should honor the FastMalloc statistics API
- https://bugs.webkit.org/show_bug.cgi?id=136592
-
- Reviewed by Gavin Barraclough.
-
- We do this by tracking "size" and "capacity" in the VM heap.
-
- The VM heap's "capacity" is all the VM we ever allocated.
-
- The VM heap's "size" the subset of VM currently held onto by the
- VM heap (and therefore not in use by the regular heap).
-
- Somewhat ironically, reducing the process's memory footprint, increases
- the size of the VM heap, since the VM heap holds the pages that are
- purely virtual and not physical.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::size):
- (bmalloc::Heap::capacity):
- * bmalloc/Heap.h:
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::VMHeap):
- (bmalloc::VMHeap::allocateSmallChunk):
- (bmalloc::VMHeap::allocateMediumChunk):
- (bmalloc::VMHeap::allocateLargeChunk):
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::size):
- (bmalloc::VMHeap::capacity):
- (bmalloc::VMHeap::allocateSmallPage):
- (bmalloc::VMHeap::allocateMediumPage):
- (bmalloc::VMHeap::allocateLargeRange):
- (bmalloc::VMHeap::deallocateSmallPage):
- (bmalloc::VMHeap::deallocateMediumPage):
- (bmalloc::VMHeap::deallocateLargeRange):
- * bmalloc/bmalloc.h:
- (bmalloc::api::heapSize):
- (bmalloc::api::heapCapacity):
-
-2014-09-02 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc crashes on the EWS bots (due to bad large object allocation)
- https://bugs.webkit.org/show_bug.cgi?id=136469
-
- Reviewed by Andreas Kling.
-
- It's possible to convince bmalloc to perform a bad large object allocation,
- through these steps:
-
- (1) Insert object A into freelist F0.
-
- (2) Split, merge and split again A's neighbors such that object B is
- inserted into freelist F0, with boundary tag and size equal to object A,
- but pointer not completely equal to object A. Put object B at the head of F0.
-
- (3) Allocate some other object from F0, swapping its position in the
- freelist with object B, such that object A is now ahead of object B.
-
- --> Now, the next allocation for size A/B will allocate object A, which
- has a slightly wrong idea about where the object actually begins.
- Immediately, you'll corrupt a little memory, and over time, you'll also
- corrupt boundary tag metadata.
-
- The solution is to store the begin pointer in the boundary tag. Luckily,
- this doesn't make the tag any bigger, and it's not a noticeable slowdown
- on MallocBench.
-
- * bmalloc/Algorithm.h:
- (bmalloc::rightShift):
- * bmalloc/BeginTag.h:
- (bmalloc::BeginTag::isInFreeList): This is the bug fix. Make sure to
- validate the start pointer when popping off the free list. Through a
- very uncommon set of steps, it is possible to have an item in the free
- list that is valid by all accounts except for its start pointer.
-
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::compactBegin):
- (bmalloc::BoundaryTag::setRange):
- (bmalloc::BoundaryTag::setSize): Deleted. Record a compact version of the
- start pointer. We don't need the whole pointer -- just the offset, in
- largeAlignment increments, into the relevant boundary tag bucket.
-
- * bmalloc/BoundaryTagInlines.h:
- (bmalloc::validateNext):
- (bmalloc::BoundaryTag::init):
- (bmalloc::BoundaryTag::mergeLarge):
- (bmalloc::BoundaryTag::splitLarge):
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::insert):
- (bmalloc::SegregatedFreeList::takeGreedy):
- (bmalloc::SegregatedFreeList::take): Provide the whole range instead of
- the size when establishing a boundary tag, as required by the new
- interface.
-
- * bmalloc/Sizes.h:
-
-2014-08-14 Geoffrey Garen <ggaren@apple.com>
-
- Fixed a bmalloc crash seen on the EWS bot
- https://bugs.webkit.org/show_bug.cgi?id=135955
-
- Reviewed by Andreas Kling.
-
- * bmalloc/Syscall.h: Some CG APIs vm_copy their input buffers. If the
- input buffer is a malloc region, that region will get marked Copy-On-Write
- by the kernel. Calls to madvise() for COW regions fail and return EINVAL
- on older OS X's. In 10.10, they still fail, but they do not return
- EINVAL.
-
- So, we can only ASSERT that our syscalls succeed starting with 10.10.
-
-2014-08-14 Geoffrey Garen <ggaren@apple.com>
-
- Fixed the bmalloc build
- https://bugs.webkit.org/show_bug.cgi?id=135953
-
- Reviewed by Andreas Kling.
-
- * bmalloc.xcodeproj/project.pbxproj: Marked a few headers as private.
- These headers are used, so they must be available outside the project.
-
-2014-08-13 Daniel Bates <dabates@apple.com>
-
- Attempt to fix the build following <http://trac.webkit.org/changeset/172576>
- (https://bugs.webkit.org/show_bug.cgi?id=135895)
-
- Substitute PerThreadStorage<T>::initSharedKeyIfNeeded() for initSharedKeyIfNeeded() in
- implementation of PerThread<T>::getFastCase().
-
- * bmalloc/PerThread.h:
- (bmalloc::PerThread<T>::getFastCase):
-
-2014-08-13 Daniel Bates <dabates@apple.com>
-
- Make bmalloc::PerThread work without C++ thread local storage
- https://bugs.webkit.org/show_bug.cgi?id=135895
-
- Reviewed by Geoffrey Garen.
-
- Implement support for building bmalloc without C++ thread local storage.
-
- * bmalloc/BPlatform.h: Remove macro define BPLATFORM_IOS_SIMULATOR. Added macro function
- BCOMPILER_SUPPORTS() and macro define BCOMPILER_SUPPORTS_CXX_THREAD_LOCAL that can be used
- to determine whether the compiler supports C++ thread local storage.
- * bmalloc/PerThread.h:
- (bmalloc::PerThreadStorage::get): Modified to call pthread_getspecific() when building
- without C++ thread local storage.
- (bmalloc::PerThreadStorage::initSharedKeyIfNeeded): Added.
- (bmalloc::PerThreadStorage::init): Moved logic to initialize shared Pthread key from here to
- PerThreadStorage::initSharedKeyIfNeeded().
- (bmalloc::PerThread<T>::getFastCase): Modified to call PerThreadStorage::initSharedKeyIfNeeded()
- before querying PerThreadStorage::get() when building without C++ thread local storage so as to
- ensure that the shared key has been initialized.
- (_pthread_setspecific_direct): Deleted.
- (_pthread_getspecific_direct): Deleted.
-
-2014-08-13 Daniel Bates <dabates@apple.com>
-
- [iOS] Make JavaScriptCore and bmalloc build with the public SDK
- https://bugs.webkit.org/show_bug.cgi?id=135848
-
- Reviewed by Geoffrey Garen.
-
- * bmalloc/BPlatform.h: Added macro BPLATFORM_IOS_SIMULATOR, which evaluates to true
- when building for the iOS Simulator.
- * bmalloc/PerThread.h: Use pthread_machdep.h code path when building for iOS Simulator
- using the public SDK.
- (_pthread_setspecific_direct): Added; only defined when building for the iOS Simulator
- using the public SDK.
- (_pthread_getspecific_direct): Added; only defined when building for the iOS Simulator
- using the public SDK.
-
-2014-08-12 Daniel Bates <dabates@apple.com>
-
- BPLATFORM(IOS) always evaluates to false
- https://bugs.webkit.org/show_bug.cgi?id=135843
-
- Reviewed by Geoffrey Garen.
-
- Fix typo in definition of BPLATFORM() and include system header TargetConditionals.h
- (when building on an Apple platform) so that BPLATFORM(X) evaluates to true when
- building for platform X. In particular, so that BPLATFORM(IOS) evaluates to true when
- building for iOS.
-
- As a side effect of this change, the change made in <http://trac.webkit.org/changeset/167289>
- will be honored and iOS will assume a VM page size of 16kB (again) instead of 4kB.
-
- * bmalloc/BPlatform.h:
-
-2014-08-11 Andy Estes <aestes@apple.com>
-
- [iOS] Get rid of iOS.xcconfig
- https://bugs.webkit.org/show_bug.cgi?id=135809
-
- Reviewed by Joseph Pecoraro.
-
- All iOS.xcconfig did was include AspenFamily.xcconfig, so there's no need for the indirection.
-
- * Configurations/Base.xcconfig:
- * Configurations/iOS.xcconfig: Removed.
- * bmalloc.xcodeproj/project.pbxproj:
-
-2014-05-01 Dan Bernstein <mitz@apple.com>
-
- Fixed production builds for the iOS Simulator.
- <rdar://problem/16792221>
-
- * Configurations/bmalloc.xcconfig: Include INSTALL_PATH_PREFIX in
- PRIVATE_HEADERS_FOLDER_PATH when installing.
-
-2014-04-20 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Segregate pages by objects size
- https://bugs.webkit.org/show_bug.cgi?id=131909
-
- Reviewed by Andreas Kling.
-
- 2% reduction in memory-at-end on the Membuster memory_warning benchmarks.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocateSlowCase):
- * bmalloc/Allocator.h:
- (bmalloc::Allocator::allocateFastCase):
- (bmalloc::Allocator::smallAllocatorFor): Use the new shared helper
- function for size class calculation.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::Deallocator):
- (bmalloc::Deallocator::scavenge):
- (bmalloc::Deallocator::deallocateSmallLine):
- (bmalloc::Deallocator::allocateSmallLine):
- * bmalloc/Deallocator.h: Keep a cache for every size class, since the
- cache can't be shared anymore.
-
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateSmallLineSlowCase):
- * bmalloc/Heap.h:
- (bmalloc::Heap::deallocateSmallLine): Ditto.
-
- (bmalloc::Heap::allocateSmallLine): Check size class in addition to
- page refcount when allocating a line because we might have deallocated
- the page and the recycled it for another size class.
-
- (bmalloc::Heap::deallocateMediumLine):
- (bmalloc::Heap::allocateMediumLine):
- * bmalloc/Line.h:
- (bmalloc::Line::refCount):
- * bmalloc/Page.h:
- (bmalloc::Page::refCount):
- (bmalloc::Page::smallSizeClass):
- (bmalloc::Page::setSmallSizeClass):
- (bmalloc::Page<Traits>::refCount): Deleted.
- * bmalloc/Sizes.h:
- (bmalloc::Sizes::smallSizeClassFor): New shared API for computing
- an index into an array from a size.
-
-2014-04-19 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Improved alignment in LargeChunk
- https://bugs.webkit.org/show_bug.cgi?id=131895
-
- Reviewed by Andreas Kling.
-
- * bmalloc/Chunk.h:
- * bmalloc/LargeChunk.h: Align to vmPageSize just like Chunk does.
- Technically, the previous alignment was harmless, but I would prefer,
- dear reader, not to have to explain the interlocking set of
- circumstances that made it so.
-
-2014-04-19 Geoffrey Garen <ggaren@apple.com>
-
- Rolled out r167502 because it caused a crash on the facebook benchmark.
-
- Unreviewed.
-
- bmalloc: Added an XSmall line size
- https://bugs.webkit.org/show_bug.cgi?id=131851
-
- Reviewed by Sam Weinig.
-
-2014-04-19 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Mutex should be harder to use wrong
- https://bugs.webkit.org/show_bug.cgi?id=131879
-
- Reviewed by Andreas Kling.
-
- Mutex now has a proper constructor, so you can't deadlock by forgetting
- to initialize it.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::processXSmallAllocatorLog):
- (bmalloc::Allocator::processSmallAllocatorLog):
- (bmalloc::Allocator::processMediumAllocatorLog):
- (bmalloc::Allocator::allocateLarge):
- (bmalloc::Allocator::allocateXLarge): Global replace Mutex => StaticMutex,
- since the Heap mutex is a static.
-
- * bmalloc/AsyncTask.h:
- (bmalloc::Function>::AsyncTask): Use Mutex, since we're not static. No
- need for explicit initialization anymore.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::scavenge):
- (bmalloc::Deallocator::deallocateLarge):
- (bmalloc::Deallocator::deallocateXLarge):
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSmallLine):
- (bmalloc::Deallocator::deallocateXSmallLine):
- (bmalloc::Deallocator::allocateSmallLine):
- (bmalloc::Deallocator::allocateXSmallLine):
- (bmalloc::Deallocator::deallocateMediumLine):
- (bmalloc::Deallocator::allocateMediumLine):
- * bmalloc/Deallocator.h:
- * bmalloc/Heap.cpp:
- (bmalloc::sleep):
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::concurrentScavenge):
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::scavengeSmallPages):
- (bmalloc::Heap::scavengeXSmallPages):
- (bmalloc::Heap::scavengeMediumPages):
- (bmalloc::Heap::scavengeLargeRanges):
- (bmalloc::Heap::allocateXSmallLineSlowCase):
- (bmalloc::Heap::allocateSmallLineSlowCase):
- (bmalloc::Heap::allocateMediumLineSlowCase):
- (bmalloc::Heap::allocateXLarge):
- (bmalloc::Heap::deallocateXLarge):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::deallocateLarge):
- * bmalloc/Heap.h:
- (bmalloc::Heap::deallocateXSmallLine):
- (bmalloc::Heap::allocateXSmallLine):
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::allocateSmallLine):
- (bmalloc::Heap::deallocateMediumLine):
- (bmalloc::Heap::allocateMediumLine):
- * bmalloc/Line.h:
- (bmalloc::Line<Traits>::deref):
- * bmalloc/Mutex.cpp: Removed.
- * bmalloc/Mutex.h:
- (bmalloc::Mutex::Mutex):
- (bmalloc::Mutex::init): Deleted.
- (bmalloc::Mutex::try_lock): Deleted.
- (bmalloc::Mutex::lock): Deleted.
- (bmalloc::Mutex::unlock): Deleted.
- * bmalloc/Page.h:
- (bmalloc::Page<Traits>::ref):
- (bmalloc::Page<Traits>::deref):
- (bmalloc::Page<Traits>::refCount):
- * bmalloc/PerProcess.h:
- (bmalloc::PerProcess::mutex):
- (bmalloc::PerProcess<T>::getSlowCase):
- * bmalloc/StaticMutex.cpp: Added.
- (bmalloc::StaticMutex::lockSlowCase):
- * bmalloc/StaticMutex.h: Added.
- (bmalloc::StaticMutex::init):
- (bmalloc::StaticMutex::try_lock):
- (bmalloc::StaticMutex::lock):
- (bmalloc::StaticMutex::unlock):
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::deallocateXSmallPage):
- (bmalloc::VMHeap::deallocateSmallPage):
- (bmalloc::VMHeap::deallocateMediumPage):
- (bmalloc::VMHeap::deallocateLargeRange):
- * bmalloc/bmalloc.h:
- (bmalloc::api::scavenge): Global replace Mutex => StaticMutex,
- since the Heap mutex is a static.
-
-2014-04-18 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: AsyncTask should use Mutex instead of std::mutex
- https://bugs.webkit.org/show_bug.cgi?id=131865
-
- Reviewed by Gavin Barraclough.
-
- std::mutex is so slow that it makes parallelizing simple tasks through
- AsyncTask a net regression. Mutex fixes this.
-
- * bmalloc/AsyncTask.h:
- (bmalloc::Function>::AsyncTask):
- (bmalloc::Function>::join):
- (bmalloc::Function>::runSlowCase):
- (bmalloc::Function>::entryPoint):
- * bmalloc/Mutex.h:
- (bmalloc::Mutex::init):
-
-2014-04-18 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Added an XSmall line size
- https://bugs.webkit.org/show_bug.cgi?id=131851
-
- Reviewed by Sam Weinig.
-
- Reduces malloc footprint on Membuster recordings by 10%.
-
- This is a throughput regression, but we're still way ahead of TCMalloc.
- I have some ideas for how to recover the regression -- but I wanted to
- get this win in first.
-
- Full set of benchmark results:
-
- bmalloc> ~/webkit/PerformanceTests/MallocBench/run-malloc-benchmarks --measure-heap nopatch:~/scratch/Build-nopatch/Release/ patch:~/webkit/WebKitBuild/Release/
-
- nopatch patch Δ
- Peak Memory:
- reddit_memory_warning 7,896kB 7,532kB ^ 1.05x smaller
- flickr_memory_warning 12,968kB 12,324kB ^ 1.05x smaller
- theverge_memory_warning 16,672kB 15,200kB ^ 1.1x smaller
-
- <geometric mean> 11,952kB 11,216kB ^ 1.07x smaller
- <arithmetic mean> 12,512kB 11,685kB ^ 1.07x smaller
- <harmonic mean> 11,375kB 10,726kB ^ 1.06x smaller
-
- Memory at End:
- reddit_memory_warning 7,320kB 6,856kB ^ 1.07x smaller
- flickr_memory_warning 10,848kB 9,692kB ^ 1.12x smaller
- theverge_memory_warning 16,380kB 14,872kB ^ 1.1x smaller
-
- <geometric mean> 10,916kB 9,961kB ^ 1.1x smaller
- <arithmetic mean> 11,516kB 10,473kB ^ 1.1x smaller
- <harmonic mean> 10,350kB 9,485kB ^ 1.09x smaller
-
- MallocBench> ~/webkit/PerformanceTests/MallocBench/run-malloc-benchmarks nopatch:~/scratch/Build-nopatch/Release/ patch:~/webkit/WebKitBuild/Release/
-
- nopatch patch Δ
- Execution Time:
- churn 127ms 151ms ! 1.19x slower
- list_allocate 130ms 164ms ! 1.26x slower
- tree_allocate 109ms 127ms ! 1.17x slower
- tree_churn 115ms 120ms ! 1.04x slower
- facebook 240ms 259ms ! 1.08x slower
- fragment 91ms 131ms ! 1.44x slower
- fragment_iterate 105ms 106ms ! 1.01x slower
- message_one 260ms 259ms ^ 1.0x faster
- message_many 149ms 154ms ! 1.03x slower
- medium 194ms 248ms ! 1.28x slower
- big 157ms 160ms ! 1.02x slower
-
- <geometric mean> 144ms 163ms ! 1.13x slower
- <arithmetic mean> 152ms 171ms ! 1.12x slower
- <harmonic mean> 137ms 156ms ! 1.14x slower
-
- MallocBench> ~/webkit/PerformanceTests/MallocBench/run-malloc-benchmarks nopatch:~/scratch/Build-nopatch/Release/ patch:~/webkit/WebKitBuild/Release/
-
- nopatch patch Δ
- Execution Time:
- churn 126ms 148ms ! 1.17x slower
- churn --parallel 62ms 76ms ! 1.23x slower
- list_allocate 130ms 164ms ! 1.26x slower
- list_allocate --parallel 120ms 175ms ! 1.46x slower
- tree_allocate 111ms 127ms ! 1.14x slower
- tree_allocate --parallel 95ms 135ms ! 1.42x slower
- tree_churn 115ms 124ms ! 1.08x slower
- tree_churn --parallel 107ms 126ms ! 1.18x slower
- facebook 240ms 276ms ! 1.15x slower
- facebook --parallel 802ms 1,088ms ! 1.36x slower
- fragment 92ms 130ms ! 1.41x slower
- fragment --parallel 66ms 124ms ! 1.88x slower
- fragment_iterate 109ms 127ms ! 1.17x slower
- fragment_iterate --parallel 55ms 64ms ! 1.16x slower
- message_one 260ms 260ms
- message_many 170ms 238ms ! 1.4x slower
- medium 185ms 250ms ! 1.35x slower
- medium --parallel 210ms 334ms ! 1.59x slower
- big 150ms 169ms ! 1.13x slower
- big --parallel 138ms 144ms ! 1.04x slower
-
- <geometric mean> 135ms 170ms ! 1.26x slower
- <arithmetic mean> 167ms 214ms ! 1.28x slower
- <harmonic mean> 117ms 148ms ! 1.26x slower
-
- MallocBench> ~/webkit/PerformanceTests/MallocBench/run-malloc-benchmarks TC:~/scratch/Build-TCMalloc/Release/ patch:~/webkit/WebKitBuild/Release/
-
- TC patch Δ
- Peak Memory:
- reddit_memory_warning 13,836kB 13,436kB ^ 1.03x smaller
- flickr_memory_warning 24,868kB 25,188kB ! 1.01x bigger
- theverge_memory_warning 24,504kB 26,636kB ! 1.09x bigger
-
- <geometric mean> 20,353kB 20,812kB ! 1.02x bigger
- <arithmetic mean> 21,069kB 21,753kB ! 1.03x bigger
- <harmonic mean> 19,570kB 19,780kB ! 1.01x bigger
-
- Memory at End:
- reddit_memory_warning 8,656kB 10,016kB ! 1.16x bigger
- flickr_memory_warning 11,844kB 13,784kB ! 1.16x bigger
- theverge_memory_warning 18,516kB 22,748kB ! 1.23x bigger
-
- <geometric mean> 12,382kB 14,644kB ! 1.18x bigger
- <arithmetic mean> 13,005kB 15,516kB ! 1.19x bigger
- <harmonic mean> 11,813kB 13,867kB ! 1.17x bigger
-
- MallocBench> ~/webkit/PerformanceTests/MallocBench/run-malloc-benchmarks TC:~/scratch/Build-TCMalloc/Release/ patch:~/webkit/WebKitBuild/Release/
-
- TC patch Δ
- Execution Time:
- churn 416ms 148ms ^ 2.81x faster
- list_allocate 463ms 164ms ^ 2.82x faster
- tree_allocate 292ms 127ms ^ 2.3x faster
- tree_churn 157ms 120ms ^ 1.31x faster
- facebook 327ms 276ms ^ 1.18x faster
- fragment 335ms 129ms ^ 2.6x faster
- fragment_iterate 344ms 108ms ^ 3.19x faster
- message_one 386ms 258ms ^ 1.5x faster
- message_many 410ms 154ms ^ 2.66x faster
- medium 391ms 245ms ^ 1.6x faster
- big 261ms 167ms ^ 1.56x faster
-
- <geometric mean> 332ms 164ms ^ 2.02x faster
- <arithmetic mean> 344ms 172ms ^ 1.99x faster
- <harmonic mean> 317ms 157ms ^ 2.02x faster
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::Allocator): Don't assume that each allocator's
- index corresponds with its size. Instead, use the size selection function
- explicitly. Now that we have XSmall, some small allocator entries are
- unused.
-
- (bmalloc::Allocator::scavenge):
- (bmalloc::Allocator::log):
- (bmalloc::Allocator::processXSmallAllocatorLog):
- (bmalloc::Allocator::allocateSlowCase):
- * bmalloc/Allocator.h:
- (bmalloc::Allocator::xSmallAllocatorFor):
- (bmalloc::Allocator::allocateFastCase):
- * bmalloc/Chunk.h:
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::scavenge):
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSlowCase):
- (bmalloc::Deallocator::deallocateXSmallLine):
- (bmalloc::Deallocator::allocateXSmallLine):
- * bmalloc/Deallocator.h:
- (bmalloc::Deallocator::deallocateFastCase):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::scavengeXSmallPages):
- (bmalloc::Heap::allocateXSmallLineSlowCase):
- * bmalloc/Heap.h:
- (bmalloc::Heap::deallocateXSmallLine):
- (bmalloc::Heap::allocateXSmallLine):
- * bmalloc/LargeChunk.h:
- (bmalloc::LargeChunk::get):
- (bmalloc::LargeChunk::endTag):
- * bmalloc/Line.h:
- * bmalloc/MediumAllocator.h:
- (bmalloc::MediumAllocator::allocate):
- (bmalloc::MediumAllocator::refill):
- * bmalloc/ObjectType.cpp:
- (bmalloc::objectType):
- * bmalloc/ObjectType.h:
- (bmalloc::isXSmall):
- (bmalloc::isSmall):
- (bmalloc::isMedium):
- (bmalloc::isLarge):
- (bmalloc::isSmallOrMedium): Deleted.
- * bmalloc/SegregatedFreeList.h: I boiler-plate copied existing code for
- handling small objects. There's probably a reasonable way to share this
- code in the future -- I'll look into that once it's stopped changing.
-
- * bmalloc/Sizes.h: Tweaked size classes to make Membuster happy. This
- is the main reason things got slower.
-
- * bmalloc/SmallAllocator.h:
- (bmalloc::SmallAllocator::allocate):
- * bmalloc/SmallTraits.h:
- * bmalloc/VMHeap.cpp:
- (bmalloc::VMHeap::allocateXSmallChunk):
- * bmalloc/VMHeap.h:
- (bmalloc::VMHeap::allocateXSmallPage):
- (bmalloc::VMHeap::deallocateXSmallPage):
- * bmalloc/XSmallAllocator.h: Added.
- (bmalloc::XSmallAllocator::isNull):
- (bmalloc::XSmallAllocator::canAllocate):
- (bmalloc::XSmallAllocator::XSmallAllocator):
- (bmalloc::XSmallAllocator::line):
- (bmalloc::XSmallAllocator::allocate):
- (bmalloc::XSmallAllocator::objectCount):
- (bmalloc::XSmallAllocator::derefCount):
- (bmalloc::XSmallAllocator::refill):
- * bmalloc/XSmallChunk.h: Added.
- * bmalloc/XSmallLine.h: Added.
- * bmalloc/XSmallPage.h: Added.
- * bmalloc/XSmallTraits.h: Added.
- * bmalloc/bmalloc.h:
- (bmalloc::api::realloc): Boiler-plate copy, as above.
-
-2014-04-14 Geoffrey Garen <ggaren@apple.com>
-
- MallocBench should scavenge explicitly instead of waiting
- https://bugs.webkit.org/show_bug.cgi?id=131661
-
- Reviewed by Andreas Kling.
-
- Added explicit scavenge support to bmalloc. This isn't a memory win,
- since bmalloc's per-thread cache is so small. But it makes testing
- simpler.
-
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::~Allocator):
- (bmalloc::Allocator::scavenge):
- * bmalloc/Allocator.h:
- * bmalloc/Cache.cpp:
- (bmalloc::Cache::operator new):
- (bmalloc::Cache::operator delete):
- (bmalloc::Cache::Cache):
- (bmalloc::Cache::scavenge):
- * bmalloc/Cache.h:
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::~Deallocator):
- (bmalloc::Deallocator::scavenge):
- * bmalloc/Deallocator.h: Factored existing scavenging code into helper
- functions, for reuse.
-
- * bmalloc/Heap.cpp:
- (bmalloc::sleep):
- (bmalloc::Heap::concurrentScavenge):
- (bmalloc::Heap::scavenge):
- (bmalloc::Heap::scavengeSmallPages):
- (bmalloc::Heap::scavengeMediumPages):
- (bmalloc::Heap::scavengeLargeRanges):
- * bmalloc/Heap.h: Made scavenge sleep duration a parameter. Forced
- scavenging -- in response to a benchmark or a low memory warning --
- wants to complete as soon as possible, so its sleep duration is 0.
-
- * bmalloc/bmalloc.h:
- (bmalloc::api::scavenge):
- * bmalloc/mbmalloc.cpp: Exported the scavenge API for MallocBench's use.
-
-2014-04-14 Geoffrey Garen <ggaren@apple.com>
-
- Use 4kB pages on Mac
- https://bugs.webkit.org/show_bug.cgi?id=131658
-
- Reviewed by Sam Weinig.
-
- This reduces memory use a lot on Membuster:
-
- base patch Δ
- Execution Time:
- reddit_memory_warning 18ms 17ms ^ 1.06x faster
- flickr_memory_warning 34ms 36ms ! 1.06x slower
- theverge_memory_warning 39ms 41ms ! 1.05x slower
-
- <geometric mean> 29ms 29ms ! 1.02x slower
- <arithmetic mean> 30ms 31ms ! 1.03x slower
- <harmonic mean> 27ms 27ms ^ 1.0x faster
-
- Peak Memory:
- reddit_memory_warning 16,412kB 16,436kB ! 1.0x bigger
- flickr_memory_warning 30,120kB 30,184kB ! 1.0x bigger
- theverge_memory_warning 33,408kB 33,420kB ! 1.0x bigger
-
- <geometric mean> 25,466kB 25,499kB ! 1.0x bigger
- <arithmetic mean> 26,647kB 26,680kB ! 1.0x bigger
- <harmonic mean> 24,181kB 24,214kB ! 1.0x bigger
-
- Memory at End:
- reddit_memory_warning 2,404kB 1,920kB ^ 1.25x smaller
- flickr_memory_warning 3,764kB 3,072kB ^ 1.23x smaller
- theverge_memory_warning 3,648kB 3,132kB ^ 1.16x smaller
-
- <geometric mean> 3,208kB 2,644kB ^ 1.21x smaller
- <arithmetic mean> 3,272kB 2,708kB ^ 1.21x smaller
- <harmonic mean> 3,139kB 2,574kB ^ 1.22x smaller
-
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/BPlatform.h: Added.
- * bmalloc/VMAllocate.h: Only use 16kB pages on iOS because the page size
- is 4kB on Mac.
-
-2014-04-14 Alexey Proskuryakov <ap@apple.com>
-
- Fixed svn:ignore on bmalloc.xcodeproj, it had erroneous leading spaces.
-
- * bmalloc.xcodeproj: Modified property svn:ignore.
-
-2014-04-13 Geoffrey Garen <ggaren@apple.com>
-
- Fixed some mbmalloc exports
- https://bugs.webkit.org/show_bug.cgi?id=131599
-
- Reviewed by Ryosuke Niwa.
-
- * bmalloc.xcodeproj/project.pbxproj: Made some headers a private part
- of the project, so we can call them from API.
-
- * bmalloc/mbmalloc.cpp: Marked the mbmalloc functions with default
- visibility, so they show up as exported in the .dylib.
-
-2014-04-09 Geoffrey Garen <ggaren@apple.com>
-
- Put bmalloc headers in the right place
- https://bugs.webkit.org/show_bug.cgi?id=131464
-
- Reviewed by Mark Rowe.
-
- * Configurations/bmalloc.xcconfig: Set PRIVATE_HEADERS_FOLDER_PATH to
- specify that we don't just want to dump all of our generically-named
- headers into /usr/local/include.
-
-2014-04-08 Geoffrey Garen <ggaren@apple.com>
-
- Made bmalloc more #include friendly
- https://bugs.webkit.org/show_bug.cgi?id=131386
-
- Reviewed by Andreas Kling.
-
- Marked a bunch of headers private so they can be used from client code
- that #includes bmalloc.h.
-
- Renamed ASSERT macros to BASSERT. This matches their header, which already
- had to be renamed, and fixes conflicts with WTF's ASSERT macros.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::allocateSlowCase):
- * bmalloc/AsyncTask.h:
- (bmalloc::Function>::runSlowCase):
- * bmalloc/BAssert.h:
- * bmalloc/BoundaryTag.h:
- (bmalloc::BoundaryTag::setSize):
- * bmalloc/BoundaryTagInlines.h:
- (bmalloc::validate):
- (bmalloc::BoundaryTag::init):
- (bmalloc::BoundaryTag::deallocate):
- (bmalloc::BoundaryTag::splitLarge):
- (bmalloc::BoundaryTag::allocate):
- * bmalloc/Chunk.h:
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSlowCase):
- * bmalloc/Deallocator.h:
- (bmalloc::Deallocator::deallocateFastCase):
- * bmalloc/FixedVector.h:
- (bmalloc::Capacity>::operator):
- (bmalloc::Capacity>::push):
- (bmalloc::Capacity>::pop):
- (bmalloc::Capacity>::shrink):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::allocateLarge):
- * bmalloc/LargeChunk.h:
- (bmalloc::LargeChunk::get):
- (bmalloc::LargeChunk::endTag):
- * bmalloc/Line.h:
- (bmalloc::Line<Traits>::concurrentRef):
- (bmalloc::Line<Traits>::deref):
- * bmalloc/MediumAllocator.h:
- (bmalloc::MediumAllocator::allocate):
- * bmalloc/ObjectType.h:
- (bmalloc::isSmall):
- * bmalloc/Page.h:
- (bmalloc::Page<Traits>::ref):
- (bmalloc::Page<Traits>::deref):
- * bmalloc/PerThread.h:
- (bmalloc::PerThread<T>::getSlowCase):
- * bmalloc/SegregatedFreeList.cpp:
- (bmalloc::SegregatedFreeList::SegregatedFreeList):
- (bmalloc::SegregatedFreeList::insert):
- * bmalloc/SmallAllocator.h:
- (bmalloc::SmallAllocator::allocate):
- (bmalloc::SmallAllocator::refill):
- * bmalloc/Syscall.h:
- * bmalloc/VMAllocate.h:
- (bmalloc::vmValidate):
- (bmalloc::vmAllocate):
- (bmalloc::vmDeallocatePhysicalPagesSloppy):
- * bmalloc/Vector.h:
- (bmalloc::Vector<T>::operator):
- (bmalloc::Vector<T>::pop):
- (bmalloc::Vector<T>::shrink):
- * bmalloc/XLargeChunk.h:
- (bmalloc::XLargeChunk::range):
- (bmalloc::XLargeChunk::size):
-
-2014-04-08 Geoffrey Garen <ggaren@apple.com>
-
- Removed an unused file.
-
- Unreviewed.
-
- * bmalloc/AsyncTask.cpp: Removed.
-
-2014-04-07 Geoffrey Garen <ggaren@apple.com>
-
- Build bmalloc on Mac
- https://bugs.webkit.org/show_bug.cgi?id=131333
-
- Reviewed by Mark Rowe.
-
- * Makefile: Added. For make clients.
-
- These files are required for building any project in WebKit. I copied
- them from WTF:
- * Configurations: Added.
- * Configurations/Base.xcconfig: Added.
- * Configurations/DebugRelease.xcconfig: Added.
- * Configurations/bmalloc.xcconfig: Added.
- * Configurations/iOS.xcconfig: Added.
- * Configurations/mbmalloc.xcconfig: Added.
-
- * bmalloc.xcodeproj/project.pbxproj: I removed per-project-file stuff
- from here because everything is in .xcconfig files now.
-
- I had to fix a bunch of minor warnings, since they're enabled in our
- .xcconfig files:
-
- * bmalloc/AsyncTask.h:
- (bmalloc::Function>::AsyncTask):
- * bmalloc/BAssert.h:
- * bmalloc/BoundaryTagInlines.h:
- (bmalloc::validate):
- * bmalloc/Heap.cpp:
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::deallocateLarge):
- * bmalloc/Mutex.h:
- (bmalloc::Mutex::Mutex): Deleted.
- * bmalloc/VMAllocate.h:
- (bmalloc::vmValidate):
- * bmalloc/mbmalloc.cpp:
-
-2014-04-07 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: Fixed a leak in the per-thread cache
- https://bugs.webkit.org/show_bug.cgi?id=131330
-
- Reviewed by Andreas Kling.
-
- Remember to deallocate our line caches upon thread exit.
-
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::~Deallocator):
-
-2014-04-07 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc: rolled out the tryLock experiment
- https://bugs.webkit.org/show_bug.cgi?id=131328
-
- Reviewed by Andreas Kling.
-
- It wasn't a speedup.
-
- * bmalloc.xcodeproj/project.pbxproj:
- * bmalloc/Allocator.cpp:
- (bmalloc::Allocator::processSmallAllocatorLog):
- (bmalloc::Allocator::processMediumAllocatorLog):
- * bmalloc/Deallocator.cpp:
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSlowCase):
- (bmalloc::Deallocator::deallocateSmallLine):
- (bmalloc::Deallocator::deallocateMediumLine):
- * bmalloc/Deallocator.h:
- (bmalloc::Deallocator::deallocateFastCase):
- * bmalloc/Heap.h:
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::deallocateMediumLine):
- * bmalloc/Line.h:
- (bmalloc::Line<Traits>::deref):
- * bmalloc/Page.h:
- (bmalloc::Page<Traits>::deref):
-
-2014-04-07 Geoffrey Garen <ggaren@apple.com>
-
- bmalloc
- https://bugs.webkit.org/show_bug.cgi?id=131170
-
- Reviewed by Andreas Kling.
-
- Initial commit.
-
- * bmalloc: Added.
- * bmalloc.xcodeproj: Added.
- * bmalloc.xcodeproj/project.pbxproj: Added.
- * bmalloc/Algorithm.h: Added.
- (bmalloc::max):
- (bmalloc::min):
- (bmalloc::mask):
- (bmalloc::test):
- (bmalloc::roundUpToMultipleOf):
- (bmalloc::roundDownToMultipleOf):
- (bmalloc::sizeOf):
- (bmalloc::bitCount):
- (bmalloc::isPowerOfTwo):
- * bmalloc/Allocator.cpp: Added.
- (bmalloc::Allocator::Allocator):
- (bmalloc::Allocator::~Allocator):
- (bmalloc::Allocator::log):
- (bmalloc::Allocator::processSmallAllocatorLog):
- (bmalloc::Allocator::processMediumAllocatorLog):
- (bmalloc::Allocator::allocateLarge):
- (bmalloc::Allocator::allocateXLarge):
- (bmalloc::Allocator::allocateMedium):
- (bmalloc::Allocator::allocateSlowCase):
- * bmalloc/Allocator.h: Added.
- (bmalloc::Allocator::smallAllocatorFor):
- (bmalloc::Allocator::allocateFastCase):
- (bmalloc::Allocator::allocate):
- * bmalloc/AsyncTask.cpp: Added.
- (bmalloc::AsyncTask<Function>::runSlowCase):
- (bmalloc::AsyncTask<Function>::pthreadEntryPoint):
- (bmalloc::AsyncTask<Function>::entryPoint):
- * bmalloc/AsyncTask.h: Added.
- (bmalloc::Function>::AsyncTask):
- (bmalloc::Function>::join):
- (bmalloc::Function>::run):
- (bmalloc::Function>::runSlowCase):
- (bmalloc::Function>::pthreadEntryPoint):
- (bmalloc::Function>::entryPoint):
- * bmalloc/BAssert.h: Added.
- * bmalloc/BeginTag.h: Added.
- (bmalloc::BeginTag::isInFreeList):
- * bmalloc/BoundaryTag.h: Added.
- (bmalloc::BoundaryTag::isXLarge):
- (bmalloc::BoundaryTag::setXLarge):
- (bmalloc::BoundaryTag::isFree):
- (bmalloc::BoundaryTag::setFree):
- (bmalloc::BoundaryTag::isEnd):
- (bmalloc::BoundaryTag::setEnd):
- (bmalloc::BoundaryTag::hasPhysicalPages):
- (bmalloc::BoundaryTag::setHasPhysicalPages):
- (bmalloc::BoundaryTag::isNull):
- (bmalloc::BoundaryTag::clear):
- (bmalloc::BoundaryTag::size):
- (bmalloc::BoundaryTag::setSize):
- (bmalloc::BoundaryTag::prev):
- (bmalloc::BoundaryTag::next):
- * bmalloc/BoundaryTagInlines.h: Added.
- (bmalloc::validate):
- (bmalloc::validatePrev):
- (bmalloc::validateNext):
- (bmalloc::BoundaryTag::init):
- (bmalloc::BoundaryTag::mergeLargeLeft):
- (bmalloc::BoundaryTag::mergeLargeRight):
- (bmalloc::BoundaryTag::mergeLarge):
- (bmalloc::BoundaryTag::deallocate):
- (bmalloc::BoundaryTag::splitLarge):
- (bmalloc::BoundaryTag::allocate):
- * bmalloc/Cache.cpp: Added.
- (bmalloc::Cache::operator new):
- (bmalloc::Cache::operator delete):
- (bmalloc::Cache::Cache):
- (bmalloc::Cache::allocateSlowCase):
- (bmalloc::Cache::allocateSlowCaseNullCache):
- (bmalloc::Cache::deallocateSlowCase):
- (bmalloc::Cache::deallocateSlowCaseNullCache):
- * bmalloc/Cache.h: Added.
- (bmalloc::Cache::allocator):
- (bmalloc::Cache::deallocator):
- (bmalloc::Cache::allocateFastCase):
- (bmalloc::Cache::deallocateFastCase):
- (bmalloc::Cache::allocate):
- (bmalloc::Cache::deallocate):
- * bmalloc/Chunk.h: Added.
- (bmalloc::Chunk::begin):
- (bmalloc::Chunk::end):
- (bmalloc::Chunk::lines):
- (bmalloc::Chunk::pages):
- * bmalloc/Deallocator.cpp: Added.
- (bmalloc::Deallocator::Deallocator):
- (bmalloc::Deallocator::~Deallocator):
- (bmalloc::Deallocator::deallocateLarge):
- (bmalloc::Deallocator::deallocateXLarge):
- (bmalloc::Deallocator::processObjectLog):
- (bmalloc::Deallocator::deallocateSlowCase):
- (bmalloc::Deallocator::deallocateSmallLine):
- (bmalloc::Deallocator::allocateSmallLine):
- (bmalloc::Deallocator::deallocateMediumLine):
- (bmalloc::Deallocator::allocateMediumLine):
- * bmalloc/Deallocator.h: Added.
- (bmalloc::Deallocator::deallocateFastCase):
- (bmalloc::Deallocator::deallocate):
- * bmalloc/EndTag.h: Added.
- (bmalloc::EndTag::operator=):
- * bmalloc/FixedVector.h: Added.
- (bmalloc::FixedVector::begin):
- (bmalloc::FixedVector::end):
- (bmalloc::FixedVector::size):
- (bmalloc::FixedVector::capacity):
- (bmalloc::FixedVector::clear):
- (bmalloc::FixedVector::isEmpty):
- (bmalloc::Capacity>::FixedVector):
- (bmalloc::Capacity>::operator):
- (bmalloc::Capacity>::push):
- (bmalloc::Capacity>::pop):
- (bmalloc::Capacity>::shrink):
- * bmalloc/Heap.cpp: Added.
- (bmalloc::sleep):
- (bmalloc::Heap::Heap):
- (bmalloc::Heap::concurrentScavenge):
- (bmalloc::Heap::scavengeSmallPages):
- (bmalloc::Heap::scavengeMediumPages):
- (bmalloc::Heap::scavengeLargeRanges):
- (bmalloc::Heap::allocateSmallLineSlowCase):
- (bmalloc::Heap::allocateMediumLineSlowCase):
- (bmalloc::Heap::allocateXLarge):
- (bmalloc::Heap::deallocateXLarge):
- (bmalloc::Heap::allocateLarge):
- (bmalloc::Heap::deallocateLarge):
- * bmalloc/Heap.h: Added.
- (bmalloc::Heap::deallocateSmallLine):
- (bmalloc::Heap::allocateSmallLine):
- (bmalloc::Heap::deallocateMediumLine):
- (bmalloc::Heap::allocateMediumLine):
- * bmalloc/Inline.h: Added.
- * bmalloc/LargeChunk.h: Added.
- (bmalloc::LargeChunk::begin):
- (bmalloc::LargeChunk::end):
- (bmalloc::LargeChunk::create):
- (bmalloc::LargeChunk::get):
- (bmalloc::LargeChunk::beginTag):
- (bmalloc::LargeChunk::endTag):
- * bmalloc/Line.h: Added.
- (bmalloc::Line<Traits>::begin):
- (bmalloc::Line<Traits>::end):
- (bmalloc::Line<Traits>::concurrentRef):
- (bmalloc::Line<Traits>::deref):
- * bmalloc/MediumAllocator.h: Added.
- (bmalloc::MediumAllocator::isNull):
- (bmalloc::MediumAllocator::MediumAllocator):
- (bmalloc::MediumAllocator::line):
- (bmalloc::MediumAllocator::allocate):
- (bmalloc::MediumAllocator::derefCount):
- (bmalloc::MediumAllocator::refill):
- * bmalloc/MediumChunk.h: Added.
- * bmalloc/MediumLine.h: Added.
- * bmalloc/MediumPage.h: Added.
- * bmalloc/MediumTraits.h: Added.
- * bmalloc/Mutex.cpp: Added.
- (bmalloc::Mutex::lockSlowCase):
- * bmalloc/Mutex.h: Added.
- (bmalloc::Mutex::Mutex):
- (bmalloc::Mutex::try_lock):
- (bmalloc::Mutex::lock):
- (bmalloc::Mutex::unlock):
- * bmalloc/ObjectType.cpp: Added.
- (bmalloc::objectType):
- * bmalloc/ObjectType.h: Added.
- (bmalloc::isSmallOrMedium):
- (bmalloc::isSmall):
- * bmalloc/Page.h: Added.
- (bmalloc::Page<Traits>::ref):
- (bmalloc::Page<Traits>::deref):
- (bmalloc::Page<Traits>::refCount):
- * bmalloc/PerProcess.h: Added.
- (bmalloc::PerProcess::mutex):
- (bmalloc::PerProcess<T>::getFastCase):
- (bmalloc::PerProcess<T>::get):
- (bmalloc::PerProcess<T>::getSlowCase):
- * bmalloc/PerThread.h: Added.
- (bmalloc::PerThreadStorage<Cache>::get):
- (bmalloc::PerThreadStorage<Cache>::init):
- (bmalloc::PerThreadStorage::get):
- (bmalloc::PerThreadStorage::init):
- (bmalloc::PerThread<T>::getFastCase):
- (bmalloc::PerThread<T>::get):
- (bmalloc::PerThread<T>::destructor):
- (bmalloc::PerThread<T>::getSlowCase):
- * bmalloc/Range.h: Added.
- (bmalloc::Range::Range):
- (bmalloc::Range::begin):
- (bmalloc::Range::end):
- (bmalloc::Range::size):
- (bmalloc::Range::operator!):
- (bmalloc::Range::operator<):
- * bmalloc/SegregatedFreeList.cpp: Added.
- (bmalloc::SegregatedFreeList::SegregatedFreeList):
- (bmalloc::SegregatedFreeList::insert):
- (bmalloc::SegregatedFreeList::takeGreedy):
- (bmalloc::SegregatedFreeList::take):
- * bmalloc/SegregatedFreeList.h: Added.
- * bmalloc/Sizes.h: Added.
- * bmalloc/SmallAllocator.h: Added.
- (bmalloc::SmallAllocator::isNull):
- (bmalloc::SmallAllocator::canAllocate):
- (bmalloc::SmallAllocator::SmallAllocator):
- (bmalloc::SmallAllocator::line):
- (bmalloc::SmallAllocator::allocate):
- (bmalloc::SmallAllocator::objectCount):
- (bmalloc::SmallAllocator::derefCount):
- (bmalloc::SmallAllocator::refill):
- * bmalloc/SmallChunk.h: Added.
- * bmalloc/SmallLine.h: Added.
- * bmalloc/SmallPage.h: Added.
- * bmalloc/SmallTraits.h: Added.
- * bmalloc/Syscall.h: Added.
- * bmalloc/VMAllocate.h: Added.
- (bmalloc::vmSize):
- (bmalloc::vmValidate):
- (bmalloc::vmAllocate):
- (bmalloc::vmDeallocate):
- (bmalloc::vmDeallocatePhysicalPages):
- (bmalloc::vmAllocatePhysicalPages):
- (bmalloc::vmDeallocatePhysicalPagesSloppy):
- (bmalloc::vmAllocatePhysicalPagesSloppy):
- * bmalloc/VMHeap.cpp: Added.
- (bmalloc::VMHeap::VMHeap):
- (bmalloc::VMHeap::allocateSmallChunk):
- (bmalloc::VMHeap::allocateMediumChunk):
- (bmalloc::VMHeap::allocateLargeChunk):
- * bmalloc/VMHeap.h: Added.
- (bmalloc::VMHeap::allocateSmallPage):
- (bmalloc::VMHeap::allocateMediumPage):
- (bmalloc::VMHeap::allocateLargeRange):
- (bmalloc::VMHeap::deallocateSmallPage):
- (bmalloc::VMHeap::deallocateMediumPage):
- (bmalloc::VMHeap::deallocateLargeRange):
- * bmalloc/Vector.h: Added.
- (bmalloc::Vector::begin):
- (bmalloc::Vector::end):
- (bmalloc::Vector::size):
- (bmalloc::Vector::capacity):
- (bmalloc::Vector::last):
- (bmalloc::Vector::pop):
- (bmalloc::Vector<T>::Vector):
- (bmalloc::Vector<T>::~Vector):
- (bmalloc::Vector<T>::operator):
- (bmalloc::Vector<T>::push):
- (bmalloc::Vector<T>::pop):
- (bmalloc::Vector<T>::shrink):
- (bmalloc::Vector<T>::reallocateBuffer):
- (bmalloc::Vector<T>::shrinkCapacity):
- (bmalloc::Vector<T>::growCapacity):
- * bmalloc/XLargeChunk.h: Added.
- (bmalloc::XLargeChunk::get):
- (bmalloc::XLargeChunk::begin):
- (bmalloc::XLargeChunk::XLargeChunk):
- (bmalloc::XLargeChunk::create):
- (bmalloc::XLargeChunk::destroy):
- (bmalloc::XLargeChunk::range):
- (bmalloc::XLargeChunk::size):
- * bmalloc/bmalloc.h: Added.
- (bmalloc::api::malloc):
- (bmalloc::api::free):
- (bmalloc::api::realloc):
- * bmalloc/mbmalloc.cpp: Added.
-