Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Side by Side Diff: src/serialize.cc

Issue 922573003: Track code cache reject reason via histogram buckets. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rename Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/serialize.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/platform/platform.h" 9 #include "src/base/platform/platform.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 2551 matching lines...) Expand 10 before | Expand all | Expand 10 after
2562 int num_stub_keys = stub_keys->length(); 2562 int num_stub_keys = stub_keys->length();
2563 int stub_keys_size = stub_keys->length() * kInt32Size; 2563 int stub_keys_size = stub_keys->length() * kInt32Size;
2564 int payload_offset = kHeaderSize + reservation_size + stub_keys_size; 2564 int payload_offset = kHeaderSize + reservation_size + stub_keys_size;
2565 int padded_payload_offset = POINTER_SIZE_ALIGN(payload_offset); 2565 int padded_payload_offset = POINTER_SIZE_ALIGN(payload_offset);
2566 int size = padded_payload_offset + payload.length(); 2566 int size = padded_payload_offset + payload.length();
2567 2567
2568 // Allocate backing store and create result data. 2568 // Allocate backing store and create result data.
2569 AllocateData(size); 2569 AllocateData(size);
2570 2570
2571 // Set header values. 2571 // Set header values.
2572 SetHeaderValue(kMagicNumberOffset, kMagicNumber);
2572 SetHeaderValue(kVersionHashOffset, Version::Hash()); 2573 SetHeaderValue(kVersionHashOffset, Version::Hash());
2573 SetHeaderValue(kSourceHashOffset, SourceHash(cs.source())); 2574 SetHeaderValue(kSourceHashOffset, SourceHash(cs.source()));
2574 SetHeaderValue(kCpuFeaturesOffset, 2575 SetHeaderValue(kCpuFeaturesOffset,
2575 static_cast<uint32_t>(CpuFeatures::SupportedFeatures())); 2576 static_cast<uint32_t>(CpuFeatures::SupportedFeatures()));
2576 SetHeaderValue(kFlagHashOffset, FlagList::Hash()); 2577 SetHeaderValue(kFlagHashOffset, FlagList::Hash());
2577 SetHeaderValue(kNumInternalizedStringsOffset, cs.num_internalized_strings()); 2578 SetHeaderValue(kNumInternalizedStringsOffset, cs.num_internalized_strings());
2578 SetHeaderValue(kNumReservationsOffset, reservations.length()); 2579 SetHeaderValue(kNumReservationsOffset, reservations.length());
2579 SetHeaderValue(kNumCodeStubKeysOffset, num_stub_keys); 2580 SetHeaderValue(kNumCodeStubKeysOffset, num_stub_keys);
2580 SetHeaderValue(kPayloadLengthOffset, payload.length()); 2581 SetHeaderValue(kPayloadLengthOffset, payload.length());
2581 2582
(...skipping 10 matching lines...) Expand all
2592 reinterpret_cast<byte*>(stub_keys->begin()), stub_keys_size); 2593 reinterpret_cast<byte*>(stub_keys->begin()), stub_keys_size);
2593 2594
2594 memset(data_ + payload_offset, 0, padded_payload_offset - payload_offset); 2595 memset(data_ + payload_offset, 0, padded_payload_offset - payload_offset);
2595 2596
2596 // Copy serialized data. 2597 // Copy serialized data.
2597 CopyBytes(data_ + padded_payload_offset, payload.begin(), 2598 CopyBytes(data_ + padded_payload_offset, payload.begin(),
2598 static_cast<size_t>(payload.length())); 2599 static_cast<size_t>(payload.length()));
2599 } 2600 }
2600 2601
2601 2602
2602 bool SerializedCodeData::IsSane(String* source) const { 2603 SerializedCodeData::SanityCheckResult SerializedCodeData::SanityCheck(
2603 return GetHeaderValue(kVersionHashOffset) == Version::Hash() && 2604 String* source) const {
2604 GetHeaderValue(kSourceHashOffset) == SourceHash(source) && 2605 uint32_t magic_number = GetHeaderValue(kMagicNumberOffset);
2605 GetHeaderValue(kCpuFeaturesOffset) == 2606 uint32_t version_hash = GetHeaderValue(kVersionHashOffset);
2606 static_cast<uint32_t>(CpuFeatures::SupportedFeatures()) && 2607 uint32_t source_hash = GetHeaderValue(kSourceHashOffset);
2607 GetHeaderValue(kFlagHashOffset) == FlagList::Hash() && 2608 uint32_t cpu_features = GetHeaderValue(kCpuFeaturesOffset);
2608 Checksum(Payload()).Check(GetHeaderValue(kChecksum1Offset), 2609 uint32_t flags_hash = GetHeaderValue(kFlagHashOffset);
2609 GetHeaderValue(kChecksum2Offset)); 2610 uint32_t c1 = GetHeaderValue(kChecksum1Offset);
2611 uint32_t c2 = GetHeaderValue(kChecksum2Offset);
2612 if (magic_number != kMagicNumber) return MAGIC_NUMBER_MISMATCH;
2613 if (version_hash != Version::Hash()) return VERSION_MISMATCH;
2614 if (source_hash != SourceHash(source)) return SOURCE_MISMATCH;
2615 if (cpu_features != static_cast<uint32_t>(CpuFeatures::SupportedFeatures())) {
2616 return CPU_FEATURES_MISMATCH;
2617 }
2618 if (flags_hash != FlagList::Hash()) return FLAGS_MISMATCH;
2619 if (!Checksum(Payload()).Check(c1, c2)) return CHECKSUM_MISMATCH;
2620 return CHECK_SUCCESS;
2610 } 2621 }
2611 2622
2612 2623
2613 // Return ScriptData object and relinquish ownership over it to the caller. 2624 // Return ScriptData object and relinquish ownership over it to the caller.
2614 ScriptData* SerializedCodeData::GetScriptData() { 2625 ScriptData* SerializedCodeData::GetScriptData() {
2615 DCHECK(owns_data_); 2626 DCHECK(owns_data_);
2616 ScriptData* result = new ScriptData(data_, size_); 2627 ScriptData* result = new ScriptData(data_, size_);
2617 result->AcquireDataOwnership(); 2628 result->AcquireDataOwnership();
2618 owns_data_ = false; 2629 owns_data_ = false;
2619 data_ = NULL; 2630 data_ = NULL;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2655 2666
2656 2667
2657 SerializedCodeData::SerializedCodeData(ScriptData* data) 2668 SerializedCodeData::SerializedCodeData(ScriptData* data)
2658 : SerializedData(const_cast<byte*>(data->data()), data->length()) {} 2669 : SerializedData(const_cast<byte*>(data->data()), data->length()) {}
2659 2670
2660 2671
2661 SerializedCodeData* SerializedCodeData::FromCachedData(ScriptData* cached_data, 2672 SerializedCodeData* SerializedCodeData::FromCachedData(ScriptData* cached_data,
2662 String* source) { 2673 String* source) {
2663 DisallowHeapAllocation no_gc; 2674 DisallowHeapAllocation no_gc;
2664 SerializedCodeData* scd = new SerializedCodeData(cached_data); 2675 SerializedCodeData* scd = new SerializedCodeData(cached_data);
2665 if (scd->IsSane(source)) return scd; 2676 SanityCheckResult r = scd->SanityCheck(source);
2677 if (r == CHECK_SUCCESS) return scd;
2666 cached_data->Reject(); 2678 cached_data->Reject();
2679 source->GetIsolate()->counters()->code_cache_reject_reason()->AddSample(r);
vogelheim 2015/02/16 12:01:36 Just curious: Why count only the failures, and not
2667 delete scd; 2680 delete scd;
2668 return NULL; 2681 return NULL;
2669 } 2682 }
2670 } } // namespace v8::internal 2683 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/serialize.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698