[EFL][GTK] Use bmalloc instead of tcmalloc
authorgyuyoung.kim@samsung.com <gyuyoung.kim@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Feb 2015 12:15:23 +0000 (12:15 +0000)
committergyuyoung.kim@samsung.com <gyuyoung.kim@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Feb 2015 12:15:23 +0000 (12:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=140162

Reviewed by Carlos Garcia Campos.

.:

Add bmalloc directory to build list.

* CMakeLists.txt: Define BMALLOC_DIR directory.
* Source/CMakeLists.txt: Add bmalloc path to sub-directories list.

Source/bmalloc:

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):

Source/WTF:

* wtf/CMakeLists.txt:
* wtf/FastMalloc.cpp:
    Enable bmalloc on GTK ports, but EFL port will enable it when bmalloc supports
    memory statistics.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@179923 268f45cc-cd09-0410-ab3c-d52691b4dbfc

21 files changed:
CMakeLists.txt
ChangeLog
Source/CMakeLists.txt
Source/WTF/ChangeLog
Source/WTF/wtf/CMakeLists.txt
Source/WTF/wtf/FastMalloc.cpp
Source/bmalloc/CMakeLists.txt [new file with mode: 0644]
Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/Allocator.cpp
Source/bmalloc/bmalloc/AsyncTask.h
Source/bmalloc/bmalloc/BoundaryTag.h
Source/bmalloc/bmalloc/Chunk.h
Source/bmalloc/bmalloc/EndTag.h
Source/bmalloc/bmalloc/LargeChunk.h
Source/bmalloc/bmalloc/Line.h
Source/bmalloc/bmalloc/MediumTraits.h
Source/bmalloc/bmalloc/Page.h
Source/bmalloc/bmalloc/PerThread.h
Source/bmalloc/bmalloc/SmallTraits.h
Source/bmalloc/bmalloc/VMAllocate.h
Source/bmalloc/bmalloc/Vector.h

index 08e5444..0a962e3 100644 (file)
@@ -4,6 +4,7 @@ project(WebKit)
 # -----------------------------------------------------------------------------
 # Default library type
 # -----------------------------------------------------------------------------
+set(BMALLOC_DIR "${CMAKE_SOURCE_DIR}/Source/bmalloc")
 set(WTF_DIR "${CMAKE_SOURCE_DIR}/Source/WTF")
 set(JAVASCRIPTCORE_DIR "${CMAKE_SOURCE_DIR}/Source/JavaScriptCore")
 set(WEBCORE_DIR "${CMAKE_SOURCE_DIR}/Source/WebCore")
index 56ecd67..f886811 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+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.
+
+        Add bmalloc directory to build list.
+
+        * CMakeLists.txt: Define BMALLOC_DIR directory.
+        * Source/CMakeLists.txt: Add bmalloc path to sub-directories list.
+
 2015-02-11  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] Add default color chooser implementation using GtkColorChooserDialog
index 5486720..fabc5d6 100644 (file)
@@ -1,6 +1,8 @@
 # -----------------------------------------------------------------------------
 # Add module directories
 # -----------------------------------------------------------------------------
+add_subdirectory(bmalloc)
+
 add_subdirectory(WTF)
 
 add_subdirectory(JavaScriptCore)
@@ -26,6 +28,7 @@ WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS()
 # -----------------------------------------------------------------------------
 # Set compiler flags for all targets
 # -----------------------------------------------------------------------------
+WEBKIT_SET_EXTRA_COMPILER_FLAGS(bmalloc ${ADDITIONAL_COMPILER_FLAGS})
 WEBKIT_SET_EXTRA_COMPILER_FLAGS(WTF ${ADDITIONAL_COMPILER_FLAGS})
 WEBKIT_SET_EXTRA_COMPILER_FLAGS(JavaScriptCore ${ADDITIONAL_COMPILER_FLAGS})
 
index 88986ac..5ec7934 100644 (file)
@@ -1,3 +1,15 @@
+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.
+
+        * wtf/CMakeLists.txt:
+        * wtf/FastMalloc.cpp:
+            Enable bmalloc on GTK ports, but EFL port will enable it when bmalloc supports
+            memory statistics.
+
 2015-02-10  Darin Adler  <darin@apple.com>
 
         Add the crash-on-failure behavior to bmalloc-based fastMalloc
index b9e6691..b335015 100644 (file)
@@ -213,6 +213,7 @@ set(WTF_SOURCES
 )
 
 set(WTF_INCLUDE_DIRECTORIES
+    "${BMALLOC_DIR}"
     "${WTF_DIR}"
     "${WTF_DIR}/wtf"
     "${WTF_DIR}/wtf/dtoa"
@@ -226,6 +227,7 @@ set(WTF_INCLUDE_DIRECTORIES
 
 set(WTF_LIBRARIES
     ${CMAKE_DL_LIBS}
+    bmalloc
 )
 
 list(APPEND WTF_SOURCES
index 9b15ac0..638114b 100644 (file)
 #endif
 #endif
 
-#if PLATFORM(COCOA)
+#if PLATFORM(COCOA) || PLATFORM(GTK)
 #define USE_BMALLOC 1
 #endif
 
diff --git a/Source/bmalloc/CMakeLists.txt b/Source/bmalloc/CMakeLists.txt
new file mode 100644 (file)
index 0000000..59a1a76
--- /dev/null
@@ -0,0 +1,22 @@
+set(bmalloc_INCLUDE_DIRECTORIES
+    "${BMALLOC_DIR}"
+)
+
+set(bmalloc_SOURCES
+    bmalloc/Allocator.cpp
+    bmalloc/Cache.cpp
+    bmalloc/Deallocator.cpp
+    bmalloc/Environment.cpp
+    bmalloc/Heap.cpp
+    bmalloc/ObjectType.cpp
+    bmalloc/SegregatedFreeList.cpp
+    bmalloc/StaticMutex.cpp
+    bmalloc/VMHeap.cpp
+    bmalloc/mbmalloc.cpp
+)
+
+WEBKIT_WRAP_SOURCELIST(${bmalloc_SOURCES})
+include_directories(${bmalloc_INCLUDE_DIRECTORIES})
+add_library(bmalloc ${bmalloc_SOURCES})
+target_link_libraries(bmalloc ${bmalloc_LIBRARIES})
+set_target_properties(bmalloc PROPERTIES COMPILE_DEFINITIONS "BUILDING_bmalloc")
index 7bd7c05..19cf824 100644 (file)
@@ -1,3 +1,38 @@
+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
index ed573dc..ebf0cf6 100644 (file)
@@ -56,7 +56,8 @@ void* Allocator::allocate(size_t alignment, size_t size)
 
     if (!m_isBmallocEnabled) {
         void* result = nullptr;
-        posix_memalign(&result, alignment, size);
+        if (posix_memalign(&result, alignment, size))
+            return nullptr;
         return result;
     }
     
index 504da81..953921d 100644 (file)
@@ -64,7 +64,7 @@ private:
     Function m_function;
 };
 
-template<typename Object, typename Function> const std::chrono::seconds AsyncTask<Object, Function>::exitDelay;
+template<typename Object, typename Function> const constexpr std::chrono::seconds AsyncTask<Object, Function>::exitDelay;
 
 template<typename Object, typename Function>
 AsyncTask<Object, Function>::AsyncTask(Object& object, const Function& function)
index 761fd3f..b2edce2 100644 (file)
@@ -29,6 +29,7 @@
 #include "BAssert.h"
 #include "Range.h"
 #include "Sizes.h"
+#include <cstring>
 
 namespace bmalloc {
 
@@ -54,7 +55,7 @@ public:
     void setHasPhysicalPages(bool hasPhysicalPages) { m_hasPhysicalPages = hasPhysicalPages; }
 
     bool isNull() { return !m_size; }
-    void clear() { memset(this, 0, sizeof(*this)); }
+    void clear() { std::memset(this, 0, sizeof(*this)); }
     
     size_t size() { return m_size; }
     unsigned compactBegin() { return m_compactBegin; }
index 0c4d1d2..de1bdff 100644 (file)
@@ -35,8 +35,9 @@ namespace bmalloc {
 template<class Traits>
 class Chunk {
 public:
-    typedef typename Traits::Page Page;
-    typedef typename Traits::Line Line;
+    typedef typename Traits::PageType Page;
+    typedef typename Traits::LineType Line;
+
     static const size_t lineSize = Traits::lineSize;
     static const size_t chunkSize = Traits::chunkSize;
     static const size_t chunkOffset = Traits::chunkOffset;
@@ -62,7 +63,13 @@ private:
 
     // Align to vmPageSize to avoid sharing physical pages with metadata.
     // Otherwise, we'll confuse the scavenger into trying to scavenge metadata.
-    alignas(vmPageSize) char m_memory[];
+#if BPLATFORM(IOS)
+    char m_memory[] __attribute__((aligned(16384)));
+    static_assert(vmPageSize == 16384, "vmPageSize and alignment must be same");
+#else
+    char m_memory[] __attribute__((aligned(4096)));
+    static_assert(vmPageSize == 4096, "vmPageSize and alignment must be same");
+#endif
 };
 
 template<class Traits>
index 9eae997..f94153a 100644 (file)
@@ -37,7 +37,7 @@ public:
 
 inline EndTag& EndTag::operator=(const BeginTag& other)
 {
-    memcpy(this, &other, sizeof(BoundaryTag));
+    std::memcpy(this, &other, sizeof(BoundaryTag));
     setEnd(true);
     return *this;
 }
index aa55281..a6515c9 100644 (file)
@@ -67,7 +67,13 @@ private:
 
     // Align to vmPageSize to avoid sharing physical pages with metadata.
     // Otherwise, we'll confuse the scavenger into trying to scavenge metadata.
-    alignas(vmPageSize) char m_memory[];
+#if BPLATFORM(IOS)
+    char m_memory[] __attribute__((aligned(16384)));
+    static_assert(vmPageSize == 16384, "vmPageSize and alignment must be same");
+#else
+    char m_memory[] __attribute__((aligned(4096)));
+    static_assert(vmPageSize == 4096, "vmPageSize and alignment must be same");
+#endif
 };
 
 inline LargeChunk* LargeChunk::get(void* object)
index 8a8d71e..8af83ef 100644 (file)
@@ -36,7 +36,8 @@ namespace bmalloc {
 template<class Traits>
 class Line {
 public:
-    typedef typename Traits::Chunk Chunk;
+    typedef typename Traits::ChunkType Chunk;
+
     static const size_t minimumObjectSize = Traits::minimumObjectSize;
     static const size_t lineSize = Traits::lineSize;
     
index bbce01a..59d78f5 100644 (file)
@@ -36,9 +36,9 @@ template<class Traits> class Line;
 template<class Traits> class Page;
 
 struct MediumTraits {
-    typedef Chunk<MediumTraits> Chunk;
-    typedef Line<MediumTraits> Line;
-    typedef Page<MediumTraits> Page;
+    typedef Chunk<MediumTraits> ChunkType;
+    typedef Line<MediumTraits> LineType;
+    typedef Page<MediumTraits> PageType;
 
     static const size_t lineSize = mediumLineSize;
     static const size_t minimumObjectSize = smallMax + alignment;
index 38140a5..fdfa158 100644 (file)
@@ -36,8 +36,9 @@ namespace bmalloc {
 template<typename Traits>
 class Page {
 public:
-    typedef typename Traits::Chunk Chunk;
-    typedef typename Traits::Line Line;
+    typedef typename Traits::ChunkType Chunk;
+    typedef typename Traits::LineType Line;
+
     static const size_t lineSize = Traits::lineSize;
     static const size_t lineCount = vmPageSize / lineSize;
 
index 02f07e1..30a6bb2 100644 (file)
 #include "Inline.h"
 #include <mutex>
 #include <pthread.h>
-#if defined(__has_include) && __has_include(<System/pthread_machdep.h>)
+
+#if defined(__has_include)
+#if __has_include(<System/pthread_machdep.h>)
 #include <System/pthread_machdep.h>
+#define HAVE_PTHREAD_MACHDEP_H 1
+#else
+#define HAVE_PTHREAD_MACHDEP_H 0
+#endif
+#else
+#define HAVE_PTHREAD_MACHDEP_H 0
 #endif
 
 namespace bmalloc {
@@ -50,7 +58,7 @@ private:
     static void destructor(void*);
 };
 
-#if defined(__has_include) && __has_include(<System/pthread_machdep.h>)
+#if HAVE_PTHREAD_MACHDEP_H
 
 class Cache;
 template<typename T> struct PerThreadStorage;
@@ -100,7 +108,7 @@ template<typename T> bool PerThreadStorage<T>::s_didInitialize;
 template<typename T> pthread_key_t PerThreadStorage<T>::s_key;
 template<typename T> std::once_flag PerThreadStorage<T>::s_onceFlag;
 
-#endif // defined(__has_include) && __has_include(<System/pthread_machdep.h>)
+#endif
 
 template<typename T>
 INLINE T* PerThread<T>::getFastCase()
index e40c166..806b7e8 100644 (file)
@@ -35,9 +35,9 @@ template<class Traits> class Line;
 template<class Traits> class Page;
 
 struct SmallTraits {
-    typedef Chunk<SmallTraits> Chunk;
-    typedef Line<SmallTraits> Line;
-    typedef Page<SmallTraits> Page;
+    typedef Chunk<SmallTraits> ChunkType;
+    typedef Line<SmallTraits> LineType;
+    typedef Page<SmallTraits> PageType;
 
     static const size_t lineSize = smallLineSize;
     static const size_t minimumObjectSize = alignment;
index 9406358..8f3ea5f 100644 (file)
 #include "Sizes.h"
 #include "Syscall.h"
 #include <algorithm>
-#include <mach/vm_statistics.h>
 #include <sys/mman.h>
 #include <unistd.h>
 
+#if BOS(DARWIN)
+#include <mach/vm_statistics.h>
+#endif
+
 namespace bmalloc {
 
+#if BOS(DARWIN)
 #define BMALLOC_VM_TAG VM_MAKE_TAG(VM_MEMORY_TCMALLOC)
+#else
+#define BMALLOC_VM_TAG -1
+#endif
 
 inline size_t vmSize(size_t size)
 {
@@ -107,13 +114,21 @@ inline void* vmAllocate(size_t vmAlignment, size_t vmSize)
 inline void vmDeallocatePhysicalPages(void* p, size_t vmSize)
 {
     vmValidate(p, vmSize);
+#if BOS(DARWIN)
     SYSCALL(madvise(p, vmSize, MADV_FREE_REUSABLE));
+#else
+    SYSCALL(madvise(p, vmSize, MADV_DONTNEED));
+#endif
 }
 
 inline void vmAllocatePhysicalPages(void* p, size_t vmSize)
 {
     vmValidate(p, vmSize);
+#if BOS(DARWIN)
     SYSCALL(madvise(p, vmSize, MADV_FREE_REUSE));
+#else
+    SYSCALL(madvise(p, vmSize, MADV_NORMAL));
+#endif
 }
 
 // Trims requests that are un-page-aligned. NOTE: size must be at least a page.
index 5a0688e..5b4112b 100644 (file)
@@ -29,7 +29,7 @@
 #include "Inline.h"
 #include "VMAllocate.h"
 #include <cstddef>
-#include <string>
+#include <cstring>
 
 namespace bmalloc {
 
@@ -112,7 +112,7 @@ void Vector<T>::push(const T* begin, const T* end)
     size_t newSize = m_size + (end - begin);
     if (newSize > m_capacity)
         growCapacity(newSize);
-    memcpy(this->end(), begin, (end - begin) * sizeof(T));
+    std::memcpy(this->end(), begin, (end - begin) * sizeof(T));
     m_size = newSize;
 }
 
@@ -148,7 +148,7 @@ void Vector<T>::reallocateBuffer(size_t newCapacity)
     size_t vmSize = bmalloc::vmSize(newCapacity * sizeof(T));
     T* newBuffer = static_cast<T*>(vmAllocate(vmSize));
     if (m_buffer) {
-        memcpy(newBuffer, m_buffer, m_size * sizeof(T));
+        std::memcpy(newBuffer, m_buffer, m_size * sizeof(T));
         vmDeallocate(m_buffer, bmalloc::vmSize(m_capacity * sizeof(T)));
     }