[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.1.3-112-gfb740c5

Gustavo Noronha Silva kov at kov.eti.br
Tue Mar 17 14:18:19 UTC 2009


The following commit has been merged in the debian/experimental branch:
commit 3f939338453a0af802cbc85157bc4cc9ee2c3e8e
Merge: 365d35522562c726cc8c29d58034facb6ddacf99 91dd8bdf362e6737220285f55a235a093db74c94
Author: Gustavo Noronha Silva <kov at kov.eti.br>
Date:   Tue Mar 17 11:12:24 2009 -0300

    Merge branch 'webkit-1.1' into debian/experimental
    
    Conflicts:
    	JavaScriptCore/wtf/Platform.h
    	WebCore/ChangeLog
    	WebCore/platform/text/AtomicString.cpp

diff --combined JavaScriptCore/wtf/FastMalloc.cpp
index bac5997,723fa03..60e8cba
--- a/JavaScriptCore/wtf/FastMalloc.cpp
+++ b/JavaScriptCore/wtf/FastMalloc.cpp
@@@ -94,7 -94,7 +94,7 @@@
  #define FORCE_SYSTEM_MALLOC 1
  #endif
  
- #define TCMALLOC_TRACK_DECOMMITED_SPANS (HAVE(VIRTUALALLOC))
+ #define TCMALLOC_TRACK_DECOMMITED_SPANS (HAVE(VIRTUALALLOC) || HAVE(MADV_FREE_REUSE))
  
  #ifndef NDEBUG
  namespace WTF {
@@@ -321,9 -321,11 +321,11 @@@ namespace WTF 
  #define CHECK_CONDITION ASSERT
  
  #if PLATFORM(DARWIN)
+ class Span;
+ class TCMalloc_Central_FreeListPadded;
  class TCMalloc_PageHeap;
  class TCMalloc_ThreadCache;
- class TCMalloc_Central_FreeListPadded;
+ template <typename T> class PageHeapAllocator;
  
  class FastMallocZone {
  public:
@@@ -339,7 -341,7 +341,7 @@@
      static void statistics(malloc_zone_t*, malloc_statistics_t* stats) { memset(stats, 0, sizeof(malloc_statistics_t)); }
  
  private:
-     FastMallocZone(TCMalloc_PageHeap*, TCMalloc_ThreadCache**, TCMalloc_Central_FreeListPadded*);
+     FastMallocZone(TCMalloc_PageHeap*, TCMalloc_ThreadCache**, TCMalloc_Central_FreeListPadded*, PageHeapAllocator<Span>*, PageHeapAllocator<TCMalloc_ThreadCache>*);
      static size_t size(malloc_zone_t*, const void*);
      static void* zoneMalloc(malloc_zone_t*, size_t);
      static void* zoneCalloc(malloc_zone_t*, size_t numItems, size_t size);
@@@ -352,6 -354,8 +354,8 @@@
      TCMalloc_PageHeap* m_pageHeap;
      TCMalloc_ThreadCache** m_threadHeaps;
      TCMalloc_Central_FreeListPadded* m_centralCaches;
+     PageHeapAllocator<Span>* m_spanAllocator;
+     PageHeapAllocator<TCMalloc_ThreadCache>* m_pageHeapAllocator;
  };
  
  #endif
@@@ -820,6 -824,9 +824,9 @@@ class PageHeapAllocator 
    char* free_area_;
    size_t free_avail_;
  
+   // Linked list of all regions allocated by this allocator
+   void* allocated_regions_;
+ 
    // Free list of already carved objects
    void* free_list_;
  
@@@ -830,6 -837,7 +837,7 @@@
    void Init() {
      ASSERT(kAlignedSize <= kAllocIncrement);
      inuse_ = 0;
+     allocated_regions_ = 0;
      free_area_ = NULL;
      free_avail_ = 0;
      free_list_ = NULL;
@@@ -844,9 -852,14 +852,14 @@@
      } else {
        if (free_avail_ < kAlignedSize) {
          // Need more room
-         free_area_ = reinterpret_cast<char*>(MetaDataAlloc(kAllocIncrement));
-         if (free_area_ == NULL) CRASH();
-         free_avail_ = kAllocIncrement;
+         char* new_allocation = reinterpret_cast<char*>(MetaDataAlloc(kAllocIncrement));
+         if (!new_allocation)
+           CRASH();
+ 
+         *(void**)new_allocation = allocated_regions_;
+         allocated_regions_ = new_allocation;
+         free_area_ = new_allocation + kAlignedSize;
+         free_avail_ = kAllocIncrement - kAlignedSize;
        }
        result = free_area_;
        free_area_ += kAlignedSize;
@@@ -863,6 -876,18 +876,18 @@@
    }
  
    int inuse() const { return inuse_; }
+ 
+ #if defined(WTF_CHANGES) && PLATFORM(DARWIN)
+   template <class Recorder>
+   void recordAdministrativeRegions(Recorder& recorder, const RemoteMemoryReader& reader)
+   {
+       vm_address_t adminAllocation = reinterpret_cast<vm_address_t>(allocated_regions_);
+       while (adminAllocation) {
+           recorder.recordRegion(adminAllocation, kAllocIncrement);
+           adminAllocation = *reader(reinterpret_cast<vm_address_t*>(adminAllocation));
+       }
+   }
+ #endif
  };
  
  // -------------------------------------------------------------------------
@@@ -1378,8 -1403,14 +1403,14 @@@ static ALWAYS_INLINE void mergeDecommit
  #else
  static ALWAYS_INLINE void mergeDecommittedStates(Span* destination, Span* other)
  {
-     if (other->decommitted)
+     if (destination->decommitted && !other->decommitted) {
+         TCMalloc_SystemRelease(reinterpret_cast<void*>(other->start << kPageShift),
+                                static_cast<size_t>(other->length << kPageShift));
+     } else if (other->decommitted && !destination->decommitted) {
+         TCMalloc_SystemRelease(reinterpret_cast<void*>(destination->start << kPageShift),
+                                static_cast<size_t>(destination->length << kPageShift));
          destination->decommitted = true;
+     }
  }
  #endif
  
@@@ -1955,13 -1986,13 +1986,13 @@@ static TCMalloc_Central_FreeListPadded 
  
  // Page-level allocator
  static SpinLock pageheap_lock = SPINLOCK_INITIALIZER;
 -static void* pageheap_memory[(sizeof(TCMalloc_PageHeap) + sizeof(void*) - 1) / sizeof(void*)];
 +static uint64_t pageheap_memory[(sizeof(TCMalloc_PageHeap) + sizeof(uint64_t) - 1) / sizeof(uint64_t)];
  static bool phinited = false;
  
  // Avoid extra level of indirection by making "pageheap" be just an alias
  // of pageheap_memory.
  typedef union {
 -    void* m_memory;
 +    uint64_t* m_memory;
      TCMalloc_PageHeap* m_pageHeap;
  } PageHeapUnion;
  
@@@ -3630,6 -3661,7 +3661,7 @@@ public
  
      void visit(void* ptr) { m_freeObjects.add(ptr); }
      bool isFreeObject(void* ptr) const { return m_freeObjects.contains(ptr); }
+     bool isFreeObject(vm_address_t ptr) const { return isFreeObject(reinterpret_cast<void*>(ptr)); }
      size_t freeObjectCount() const { return m_freeObjects.size(); }
  
      void findFreeObjects(TCMalloc_ThreadCache* threadCache)
@@@ -3680,7 -3712,9 +3712,9 @@@ class PageMapMemoryUsageRecorder 
      vm_range_recorder_t* m_recorder;
      const RemoteMemoryReader& m_reader;
      const FreeObjectFinder& m_freeObjectFinder;
-     mutable HashSet<void*> m_seenPointers;
+ 
+     HashSet<void*> m_seenPointers;
+     Vector<Span*> m_coalescedSpans;
  
  public:
      PageMapMemoryUsageRecorder(task_t task, void* context, unsigned typeMask, vm_range_recorder_t* recorder, const RemoteMemoryReader& reader, const FreeObjectFinder& freeObjectFinder)
@@@ -3692,51 -3726,133 +3726,133 @@@
          , m_freeObjectFinder(freeObjectFinder)
      { }
  
-     int visit(void* ptr) const
+     ~PageMapMemoryUsageRecorder()
+     {
+         ASSERT(!m_coalescedSpans.size());
+     }
+ 
+     void recordPendingRegions()
+     {
+         Span* lastSpan = m_coalescedSpans[m_coalescedSpans.size() - 1];
+         vm_range_t ptrRange = { m_coalescedSpans[0]->start << kPageShift, 0 };
+         ptrRange.size = (lastSpan->start << kPageShift) - ptrRange.address + (lastSpan->length * kPageSize);
+ 
+         // Mark the memory region the spans represent as a candidate for containing pointers
+         if (m_typeMask & MALLOC_PTR_REGION_RANGE_TYPE)
+             (*m_recorder)(m_task, m_context, MALLOC_PTR_REGION_RANGE_TYPE, &ptrRange, 1);
+ 
+         if (!(m_typeMask & MALLOC_PTR_IN_USE_RANGE_TYPE)) {
+             m_coalescedSpans.clear();
+             return;
+         }
+ 
+         Vector<vm_range_t, 1024> allocatedPointers;
+         for (size_t i = 0; i < m_coalescedSpans.size(); ++i) {
+             Span *theSpan = m_coalescedSpans[i];
+             if (theSpan->free)
+                 continue;
+ 
+             vm_address_t spanStartAddress = theSpan->start << kPageShift;
+             vm_size_t spanSizeInBytes = theSpan->length * kPageSize;
+ 
+             if (!theSpan->sizeclass) {
+                 // If it's an allocated large object span, mark it as in use
+                 if (!m_freeObjectFinder.isFreeObject(spanStartAddress))
+                     allocatedPointers.append((vm_range_t){spanStartAddress, spanSizeInBytes});
+             } else {
+                 const size_t objectSize = ByteSizeForClass(theSpan->sizeclass);
+ 
+                 // Mark each allocated small object within the span as in use
+                 const vm_address_t endOfSpan = spanStartAddress + spanSizeInBytes;
+                 for (vm_address_t object = spanStartAddress; object + objectSize <= endOfSpan; object += objectSize) {
+                     if (!m_freeObjectFinder.isFreeObject(object))
+                         allocatedPointers.append((vm_range_t){object, objectSize});
+                 }
+             }
+         }
+ 
+         (*m_recorder)(m_task, m_context, MALLOC_PTR_IN_USE_RANGE_TYPE, allocatedPointers.data(), allocatedPointers.size());
+ 
+         m_coalescedSpans.clear();
+     }
+ 
+     int visit(void* ptr)
      {
          if (!ptr)
              return 1;
  
          Span* span = m_reader(reinterpret_cast<Span*>(ptr));
+         if (!span->start)
+             return 1;
+ 
          if (m_seenPointers.contains(ptr))
              return span->length;
          m_seenPointers.add(ptr);
  
-         // Mark the memory used for the Span itself as an administrative region
-         vm_range_t ptrRange = { reinterpret_cast<vm_address_t>(ptr), sizeof(Span) };
-         if (m_typeMask & (MALLOC_PTR_REGION_RANGE_TYPE | MALLOC_ADMIN_REGION_RANGE_TYPE))
-             (*m_recorder)(m_task, m_context, MALLOC_ADMIN_REGION_RANGE_TYPE, &ptrRange, 1);
+         if (!m_coalescedSpans.size()) {
+             m_coalescedSpans.append(span);
+             return span->length;
+         }
  
-         ptrRange.address = span->start << kPageShift;
-         ptrRange.size = span->length * kPageSize;
+         Span* previousSpan = m_coalescedSpans[m_coalescedSpans.size() - 1];
+         vm_address_t previousSpanStartAddress = previousSpan->start << kPageShift;
+         vm_size_t previousSpanSizeInBytes = previousSpan->length * kPageSize;
  
-         // Mark the memory region the span represents as candidates for containing pointers
-         if (m_typeMask & (MALLOC_PTR_REGION_RANGE_TYPE | MALLOC_ADMIN_REGION_RANGE_TYPE))
-             (*m_recorder)(m_task, m_context, MALLOC_PTR_REGION_RANGE_TYPE, &ptrRange, 1);
+         // If the new span is adjacent to the previous span, do nothing for now.
+         vm_address_t spanStartAddress = span->start << kPageShift;
+         if (spanStartAddress == previousSpanStartAddress + previousSpanSizeInBytes) {
+             m_coalescedSpans.append(span);
+             return span->length;
+         }
  
-         if (!span->free && (m_typeMask & MALLOC_PTR_IN_USE_RANGE_TYPE)) {
-             // If it's an allocated large object span, mark it as in use
-             if (span->sizeclass == 0 && !m_freeObjectFinder.isFreeObject(reinterpret_cast<void*>(ptrRange.address)))
-                 (*m_recorder)(m_task, m_context, MALLOC_PTR_IN_USE_RANGE_TYPE, &ptrRange, 1);
-             else if (span->sizeclass) {
-                 const size_t byteSize = ByteSizeForClass(span->sizeclass);
-                 unsigned totalObjects = (span->length << kPageShift) / byteSize;
-                 ASSERT(span->refcount <= totalObjects);
-                 char* ptr = reinterpret_cast<char*>(span->start << kPageShift);
+         // New span is not adjacent to previous span, so record the spans coalesced so far.
+         recordPendingRegions();
+         m_coalescedSpans.append(span);
  
-                 // Mark each allocated small object within the span as in use
-                 for (unsigned i = 0; i < totalObjects; i++) {
-                     char* thisObject = ptr + (i * byteSize);
-                     if (m_freeObjectFinder.isFreeObject(thisObject))
-                         continue;
+         return span->length;
+     }
+ };
  
-                     vm_range_t objectRange = { reinterpret_cast<vm_address_t>(thisObject), byteSize };
-                     (*m_recorder)(m_task, m_context, MALLOC_PTR_IN_USE_RANGE_TYPE, &objectRange, 1);
-                 }
-             }
+ class AdminRegionRecorder {
+     task_t m_task;
+     void* m_context;
+     unsigned m_typeMask;
+     vm_range_recorder_t* m_recorder;
+     const RemoteMemoryReader& m_reader;
+ 
+     Vector<vm_range_t, 1024> m_pendingRegions;
+ 
+ public:
+     AdminRegionRecorder(task_t task, void* context, unsigned typeMask, vm_range_recorder_t* recorder, const RemoteMemoryReader& reader)
+         : m_task(task)
+         , m_context(context)
+         , m_typeMask(typeMask)
+         , m_recorder(recorder)
+         , m_reader(reader)
+     { }
+ 
+     void recordRegion(vm_address_t ptr, size_t size)
+     {
+         if (m_typeMask & MALLOC_ADMIN_REGION_RANGE_TYPE)
+             m_pendingRegions.append((vm_range_t){ ptr, size });
+     }
+ 
+     void visit(void *ptr, size_t size)
+     {
+         recordRegion(reinterpret_cast<vm_address_t>(ptr), size);
+     }
+ 
+     void recordPendingRegions()
+     {
+         if (m_pendingRegions.size()) {
+             (*m_recorder)(m_task, m_context, MALLOC_ADMIN_REGION_RANGE_TYPE, m_pendingRegions.data(), m_pendingRegions.size());
+             m_pendingRegions.clear();
          }
+     }
  
-         return span->length;
+     ~AdminRegionRecorder()
+     {
+         ASSERT(!m_pendingRegions.size());
      }
  };
  
@@@ -3759,10 -3875,22 +3875,22 @@@ kern_return_t FastMallocZone::enumerate
  
      TCMalloc_PageHeap::PageMap* pageMap = &pageHeap->pagemap_;
      PageMapFreeObjectFinder pageMapFinder(memoryReader, finder);
-     pageMap->visit(pageMapFinder, memoryReader);
+     pageMap->visitValues(pageMapFinder, memoryReader);
  
      PageMapMemoryUsageRecorder usageRecorder(task, context, typeMask, recorder, memoryReader, finder);
-     pageMap->visit(usageRecorder, memoryReader);
+     pageMap->visitValues(usageRecorder, memoryReader);
+     usageRecorder.recordPendingRegions();
+ 
+     AdminRegionRecorder adminRegionRecorder(task, context, typeMask, recorder, memoryReader);
+     pageMap->visitAllocations(adminRegionRecorder, memoryReader);
+ 
+     PageHeapAllocator<Span>* spanAllocator = memoryReader(mzone->m_spanAllocator);
+     PageHeapAllocator<TCMalloc_ThreadCache>* pageHeapAllocator = memoryReader(mzone->m_pageHeapAllocator);
+ 
+     spanAllocator->recordAdministrativeRegions(adminRegionRecorder, memoryReader);
+     pageHeapAllocator->recordAdministrativeRegions(adminRegionRecorder, memoryReader);
+ 
+     adminRegionRecorder.recordPendingRegions();
  
      return 0;
  }
@@@ -3812,10 -3940,12 +3940,12 @@@ malloc_introspection_t jscore_fastmallo
      };
  }
  
- FastMallocZone::FastMallocZone(TCMalloc_PageHeap* pageHeap, TCMalloc_ThreadCache** threadHeaps, TCMalloc_Central_FreeListPadded* centralCaches)
+ FastMallocZone::FastMallocZone(TCMalloc_PageHeap* pageHeap, TCMalloc_ThreadCache** threadHeaps, TCMalloc_Central_FreeListPadded* centralCaches, PageHeapAllocator<Span>* spanAllocator, PageHeapAllocator<TCMalloc_ThreadCache>* pageHeapAllocator)
      : m_pageHeap(pageHeap)
      , m_threadHeaps(threadHeaps)
      , m_centralCaches(centralCaches)
+     , m_spanAllocator(spanAllocator)
+     , m_pageHeapAllocator(pageHeapAllocator)
  {
      memset(&m_zone, 0, sizeof(m_zone));
      m_zone.version = 4;
@@@ -3834,7 -3964,7 +3964,7 @@@
  
  void FastMallocZone::init()
  {
-     static FastMallocZone zone(pageheap, &thread_heaps, static_cast<TCMalloc_Central_FreeListPadded*>(central_cache));
+     static FastMallocZone zone(pageheap, &thread_heaps, static_cast<TCMalloc_Central_FreeListPadded*>(central_cache), &span_allocator, &threadheap_allocator);
  }
  
  #endif
diff --combined JavaScriptCore/wtf/Platform.h
index 73fc198,aadda12..1921cef
--- a/JavaScriptCore/wtf/Platform.h
+++ b/JavaScriptCore/wtf/Platform.h
@@@ -40,6 -40,16 +40,16 @@@
  /* be used regardless of operating environment */
  #ifdef __APPLE__
  #define WTF_PLATFORM_DARWIN 1
+ #import <AvailabilityMacros.h>
+ #if !defined(MAC_OS_X_VERSION_10_5) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
+ #define BUILDING_ON_TIGER 1
+ #endif
+ #if !defined(MAC_OS_X_VERSION_10_6) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
+ #define BUILDING_ON_LEOPARD 1
+ #endif
+ #if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+ #error what are we?!
+ #endif
  #endif
  
  /* PLATFORM(WIN_OS) */
@@@ -212,11 -222,9 +222,15 @@@
  #define WTF_PLATFORM_X86_64 1
  #endif
  
 +/* PLATFORM(SPARC) */
 +#if   defined(__sparc__) \
 +   || defined(__sparc)
 +#define WTF_PLATFORM_SPARC 1
 +#define WTF_PLATFORM_BIG_ENDIAN 1
++
+ /* PLATFORM(SH4) */
+ #if defined(__SH4__)
+ #define WTF_PLATFORM_SH4 1
  #endif
  
  /* PLATFORM(SPARC64) */
@@@ -239,16 -247,6 +253,16 @@@
  #   endif
  #endif
  
 +/* For undefined platforms */
 +#if !defined(WTF_PLATFORM_BIG_ENDIAN) && !defined(WTF_PLATFORM_MIDDLE_ENDIAN)
 +#include <sys/param.h>
 +#if __BYTE_ORDER == __BIG_ENDIAN
 +#define WTF_PLATFORM_BIG_ENDIAN 1
 +#elif  __BYTE_ORDER == __PDP_ENDIAN
 +#define WTF_PLATFORM_MIDDLE_ENDIAN 1
 +#endif
 +#endif
 +
  /* Compiler */
  
  /* COMPILER(MSVC) */
@@@ -317,9 -315,6 +331,6 @@@
  #define ENABLE_DASHBOARD_SUPPORT 1
  #endif
  #define HAVE_READLINE 1
- #if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
- #define HAVE_DTRACE 1
- #endif
  #endif
  
  #if PLATFORM(CHROMIUM) && PLATFORM(DARWIN)
@@@ -363,6 -358,10 +374,10 @@@
  #define HAVE_SYS_TIME_H 1
  #define HAVE_SYS_TIMEB_H 1
  
+ #if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
+ #define HAVE_MADV_FREE_REUSE 1
+ #endif
+ 
  #elif PLATFORM(WIN_OS)
  
  #define HAVE_FLOAT_H 1
@@@ -461,6 -460,10 +476,10 @@@
  #define WTF_USE_ALTERNATE_JSIMMEDIATE 1
  #endif
  
+ #if !defined(ENABLE_REPAINT_THROTTLING)
+ #define ENABLE_REPAINT_THROTTLING 0
+ #endif
+ 
  #if !defined(ENABLE_JIT)
  /* The JIT is tested & working on x86_64 Mac */
  #if PLATFORM(X86_64) && PLATFORM(MAC)
diff --combined WebCore/platform/text/AtomicString.cpp
index 389b897,d85f5ee..0085738
--- a/WebCore/platform/text/AtomicString.cpp
+++ b/WebCore/platform/text/AtomicString.cpp
@@@ -101,7 -101,7 +101,7 @@@ static inline bool equal(StringImpl* st
      if (string->length() != length)
          return false;
  
- #if PLATFORM(ARM) || PLATFORM(SPARC)
 -#if PLATFORM(ARM) || PLATFORM(SH4)
++#if PLATFORM(ARM) || PLATFORM(SPARC) || PLATFORM(SH4)
      const UChar* stringCharacters = string->characters();
      for (unsigned i = 0; i != length; ++i) {
          if (*stringCharacters++ != *characters++)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list