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

Side by Side Diff: src/api.h

Issue 1269343002: Retire StringTracker. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 4 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 | « no previous file | src/api.cc » ('j') | 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 #ifndef V8_API_H_ 5 #ifndef V8_API_H_
6 #define V8_API_H_ 6 #define V8_API_H_
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "include/v8-testing.h" 10 #include "include/v8-testing.h"
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 } 399 }
400 400
401 OPEN_HANDLE_LIST(MAKE_OPEN_HANDLE) 401 OPEN_HANDLE_LIST(MAKE_OPEN_HANDLE)
402 402
403 #undef MAKE_OPEN_HANDLE 403 #undef MAKE_OPEN_HANDLE
404 #undef OPEN_HANDLE_LIST 404 #undef OPEN_HANDLE_LIST
405 405
406 406
407 namespace internal { 407 namespace internal {
408 408
409 // Tracks string usage to help make better decisions when
410 // externalizing strings.
411 //
412 // Implementation note: internally this class only tracks fresh
413 // strings and keeps a single use counter for them.
414 class StringTracker {
415 public:
416 // Records that the given string's characters were copied to some
417 // external buffer. If this happens often we should honor
418 // externalization requests for the string.
419 void RecordWrite(Handle<String> string) {
420 Address address = reinterpret_cast<Address>(*string);
421 Address top = isolate_->heap()->NewSpaceTop();
422 if (IsFreshString(address, top)) {
423 IncrementUseCount(top);
424 }
425 }
426
427 // Estimates freshness and use frequency of the given string based
428 // on how close it is to the new space top and the recorded usage
429 // history.
430 inline bool IsFreshUnusedString(Handle<String> string) {
431 Address address = reinterpret_cast<Address>(*string);
432 Address top = isolate_->heap()->NewSpaceTop();
433 return IsFreshString(address, top) && IsUseCountLow(top);
434 }
435
436 private:
437 StringTracker() : use_count_(0), last_top_(NULL), isolate_(NULL) { }
438
439 static inline bool IsFreshString(Address string, Address top) {
440 return top - kFreshnessLimit <= string && string <= top;
441 }
442
443 inline bool IsUseCountLow(Address top) {
444 if (last_top_ != top) return true;
445 return use_count_ < kUseLimit;
446 }
447
448 inline void IncrementUseCount(Address top) {
449 if (last_top_ != top) {
450 use_count_ = 0;
451 last_top_ = top;
452 }
453 ++use_count_;
454 }
455
456 // Single use counter shared by all fresh strings.
457 int use_count_;
458
459 // Last new space top when the use count above was valid.
460 Address last_top_;
461
462 Isolate* isolate_;
463
464 // How close to the new space top a fresh string has to be.
465 static const int kFreshnessLimit = 1024;
466
467 // The number of uses required to consider a string useful.
468 static const int kUseLimit = 32;
469
470 friend class Isolate;
471
472 DISALLOW_COPY_AND_ASSIGN(StringTracker);
473 };
474
475 409
476 class DeferredHandles { 410 class DeferredHandles {
477 public: 411 public:
478 ~DeferredHandles(); 412 ~DeferredHandles();
479 413
480 private: 414 private:
481 DeferredHandles(Object** first_block_limit, Isolate* isolate) 415 DeferredHandles(Object** first_block_limit, Isolate* isolate)
482 : next_(NULL), 416 : next_(NULL),
483 previous_(NULL), 417 previous_(NULL),
484 first_block_limit_(first_block_limit), 418 first_block_limit_(first_block_limit),
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 stress_type_ = stress_type; 639 stress_type_ = stress_type;
706 } 640 }
707 641
708 private: 642 private:
709 static v8::Testing::StressType stress_type_; 643 static v8::Testing::StressType stress_type_;
710 }; 644 };
711 645
712 } } // namespace v8::internal 646 } } // namespace v8::internal
713 647
714 #endif // V8_API_H_ 648 #endif // V8_API_H_
OLDNEW
« no previous file with comments | « no previous file | src/api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698