Revision: 17944
Author:   [email protected]
Date:     Thu Nov 21 08:06:02 2013 UTC
Log: API: Change AdjustAmountOfExternalAllocatedMemory calls to use int64_t instead
of intptr_t

This prevents an overflow in FreeArrayBuffer, which in turn caused needless GCs
as well as crashes on isolate teardown.

LOG=Y
[email protected]

Review URL: https://codereview.chromium.org/70233010
http://code.google.com/p/v8/source/detail?r=17944

Modified:
 /branches/bleeding_edge/include/v8.h
 /branches/bleeding_edge/src/api.cc
 /branches/bleeding_edge/src/heap-inl.h
 /branches/bleeding_edge/src/heap.cc
 /branches/bleeding_edge/src/heap.h
 /branches/bleeding_edge/src/runtime.cc

=======================================
--- /branches/bleeding_edge/include/v8.h        Wed Nov 20 15:16:18 2013 UTC
+++ /branches/bleeding_edge/include/v8.h        Thu Nov 21 08:06:02 2013 UTC
@@ -4102,7 +4102,7 @@
    *   kept alive by JavaScript objects.
    * \returns the adjusted value.
    */
-  intptr_t AdjustAmountOfExternalAllocatedMemory(intptr_t change_in_bytes);
+  int64_t AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes);

   /**
* Returns heap profiler for this isolate. Will return NULL until the isolate
@@ -4685,8 +4685,8 @@

   V8_DEPRECATED(
       "Use Isolate::AdjustAmountOfExternalAllocatedMemory instead",
-      static intptr_t AdjustAmountOfExternalAllocatedMemory(
-          intptr_t change_in_bytes));
+      static int64_t AdjustAmountOfExternalAllocatedMemory(
+          int64_t change_in_bytes));

   /**
    * Forcefully terminate the current thread of JavaScript execution
=======================================
--- /branches/bleeding_edge/src/api.cc  Wed Nov 20 11:21:51 2013 UTC
+++ /branches/bleeding_edge/src/api.cc  Thu Nov 21 08:06:02 2013 UTC
@@ -6389,14 +6389,14 @@
 }


-intptr_t Isolate::AdjustAmountOfExternalAllocatedMemory(
-    intptr_t change_in_bytes) {
+int64_t Isolate::AdjustAmountOfExternalAllocatedMemory(
+    int64_t change_in_bytes) {
   i::Heap* heap = reinterpret_cast<i::Isolate*>(this)->heap();
   return heap->AdjustAmountOfExternalAllocatedMemory(change_in_bytes);
 }


-intptr_t V8::AdjustAmountOfExternalAllocatedMemory(intptr_t change_in_bytes) { +int64_t V8::AdjustAmountOfExternalAllocatedMemory(int64_t change_in_bytes) {
   i::Isolate* isolate = i::Isolate::UncheckedCurrent();
   if (isolate == NULL || !isolate->IsInitialized()) {
     return 0;
=======================================
--- /branches/bleeding_edge/src/heap-inl.h      Mon Nov 11 17:46:08 2013 UTC
+++ /branches/bleeding_edge/src/heap-inl.h      Thu Nov 21 08:06:02 2013 UTC
@@ -541,10 +541,10 @@
 }


-intptr_t Heap::AdjustAmountOfExternalAllocatedMemory(
-    intptr_t change_in_bytes) {
+int64_t Heap::AdjustAmountOfExternalAllocatedMemory(
+    int64_t change_in_bytes) {
   ASSERT(HasBeenSetUp());
-  intptr_t amount = amount_of_external_allocated_memory_ + change_in_bytes;
+  int64_t amount = amount_of_external_allocated_memory_ + change_in_bytes;
   if (change_in_bytes > 0) {
     // Avoid overflow.
     if (amount > amount_of_external_allocated_memory_) {
@@ -554,7 +554,7 @@
       amount_of_external_allocated_memory_ = 0;
       amount_of_external_allocated_memory_at_last_global_gc_ = 0;
     }
-    intptr_t amount_since_last_global_gc = PromotedExternalMemorySize();
+    int64_t amount_since_last_global_gc = PromotedExternalMemorySize();
     if (amount_since_last_global_gc > external_allocation_limit_) {
CollectAllGarbage(kNoGCFlags, "external memory allocation limit reached");
     }
@@ -573,9 +573,9 @@
PrintF("Adjust amount of external memory: delta=%6" V8_PTR_PREFIX "d KB, " "amount=%6" V8_PTR_PREFIX "d KB, since_gc=%6" V8_PTR_PREFIX "d KB, "
            "isolate=0x%08" V8PRIxPTR ".\n",
-           change_in_bytes / KB,
-           amount_of_external_allocated_memory_ / KB,
-           PromotedExternalMemorySize() / KB,
+           static_cast<intptr_t>(change_in_bytes / KB),
+ static_cast<intptr_t>(amount_of_external_allocated_memory_ / KB),
+           static_cast<intptr_t>(PromotedExternalMemorySize() / KB),
            reinterpret_cast<intptr_t>(isolate()));
   }
   ASSERT(amount_of_external_allocated_memory_ >= 0);
=======================================
--- /branches/bleeding_edge/src/heap.cc Tue Nov 19 11:52:47 2013 UTC
+++ /branches/bleeding_edge/src/heap.cc Thu Nov 21 08:06:02 2013 UTC
@@ -412,7 +412,7 @@
            this->Available() / KB,
            this->CommittedMemory() / KB);
   PrintPID("External memory reported: %6" V8_PTR_PREFIX "d KB\n",
-           amount_of_external_allocated_memory_ / KB);
+ static_cast<intptr_t>(amount_of_external_allocated_memory_ / KB));
   PrintPID("Total time spent in GC  : %.1f ms\n", total_gc_time_ms_);
 }

@@ -6591,7 +6591,7 @@
 }


-intptr_t Heap::PromotedExternalMemorySize() {
+int64_t Heap::PromotedExternalMemorySize() {
   if (amount_of_external_allocated_memory_
       <= amount_of_external_allocated_memory_at_last_global_gc_) return 0;
   return amount_of_external_allocated_memory_
=======================================
--- /branches/bleeding_edge/src/heap.h  Tue Nov 19 11:52:47 2013 UTC
+++ /branches/bleeding_edge/src/heap.h  Thu Nov 21 08:06:02 2013 UTC
@@ -1475,8 +1475,8 @@

   // Adjusts the amount of registered external memory.
   // Returns the adjusted value.
-  inline intptr_t AdjustAmountOfExternalAllocatedMemory(
-      intptr_t change_in_bytes);
+  inline int64_t AdjustAmountOfExternalAllocatedMemory(
+      int64_t change_in_bytes);

   // This is only needed for testing high promotion mode.
   void SetNewSpaceHighPromotionModeActive(bool mode) {
@@ -1495,7 +1495,10 @@
   }

   inline intptr_t PromotedTotalSize() {
-    return PromotedSpaceSizeOfObjects() + PromotedExternalMemorySize();
+ int64_t total = PromotedSpaceSizeOfObjects() + PromotedExternalMemorySize();
+    if (total > kMaxInt) return static_cast<intptr_t>(kMaxInt);
+    if (total < 0) return 0;
+    return static_cast<intptr_t>(total);
   }

   inline intptr_t OldGenerationSpaceAvailable() {
@@ -1906,7 +1909,7 @@
   int gc_post_processing_depth_;

   // Returns the amount of external memory registered since last global gc.
-  intptr_t PromotedExternalMemorySize();
+  int64_t PromotedExternalMemorySize();

   unsigned int ms_count_;  // how many mark-sweep collections happened
   unsigned int gc_count_;  // how many gc happened
@@ -1960,10 +1963,10 @@

   // The amount of external memory registered through the API kept alive
   // by global handles
-  intptr_t amount_of_external_allocated_memory_;
+  int64_t amount_of_external_allocated_memory_;

   // Caches the amount of external memory registered at the last global gc.
-  intptr_t amount_of_external_allocated_memory_at_last_global_gc_;
+  int64_t amount_of_external_allocated_memory_at_last_global_gc_;

// Indicates that an allocation has failed in the old generation since the
   // last GC.
=======================================
--- /branches/bleeding_edge/src/runtime.cc      Tue Nov 19 16:41:07 2013 UTC
+++ /branches/bleeding_edge/src/runtime.cc      Thu Nov 21 08:06:02 2013 UTC
@@ -700,7 +700,7 @@
       isolate, phantom_array_buffer->byte_length());

   isolate->heap()->AdjustAmountOfExternalAllocatedMemory(
-      -static_cast<intptr_t>(allocated_length));
+      -static_cast<int64_t>(allocated_length));
   CHECK(V8::ArrayBufferAllocator() != NULL);
   V8::ArrayBufferAllocator()->Free(
       phantom_array_buffer->backing_store(),

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to