comparison src/share/vm/utilities/globalDefinitions.hpp @ 12029:9766f73e770d

8022880: False sharing between PSPromotionManager instances Summary: Pad the PSPromotionManager instances in the manager array. Reviewed-by: brutisso, jmasa
author stefank
date Fri, 31 May 2013 14:32:44 +0200
parents 90d6c221d4e5
children 3cce976666d9 e5003079dfa5
comparison
equal deleted inserted replaced
12009:39127bb12d32 12029:9766f73e770d
408 408
409 inline intptr_t align_size_down(intptr_t size, intptr_t alignment) { 409 inline intptr_t align_size_down(intptr_t size, intptr_t alignment) {
410 return align_size_down_(size, alignment); 410 return align_size_down_(size, alignment);
411 } 411 }
412 412
413 #define is_size_aligned_(size, alignment) ((size) == (align_size_up_(size, alignment)))
414
413 // Align objects by rounding up their size, in HeapWord units. 415 // Align objects by rounding up their size, in HeapWord units.
414 416
415 #define align_object_size_(size) align_size_up_(size, MinObjAlignment) 417 #define align_object_size_(size) align_size_up_(size, MinObjAlignment)
416 418
417 inline intptr_t align_object_size(intptr_t size) { 419 inline intptr_t align_object_size(intptr_t size) {
424 426
425 // Pad out certain offsets to jlong alignment, in HeapWord units. 427 // Pad out certain offsets to jlong alignment, in HeapWord units.
426 428
427 inline intptr_t align_object_offset(intptr_t offset) { 429 inline intptr_t align_object_offset(intptr_t offset) {
428 return align_size_up(offset, HeapWordsPerLong); 430 return align_size_up(offset, HeapWordsPerLong);
431 }
432
433 inline void* align_pointer_up(const void* addr, size_t size) {
434 return (void*) align_size_up_((uintptr_t)addr, size);
429 } 435 }
430 436
431 // Clamp an address to be within a specific page 437 // Clamp an address to be within a specific page
432 // 1. If addr is on the page it is returned as is 438 // 1. If addr is on the page it is returned as is
433 // 2. If addr is above the page_address the start of the *next* page will be returned 439 // 2. If addr is above the page_address the start of the *next* page will be returned
447 453
448 454
449 // The expected size in bytes of a cache line, used to pad data structures. 455 // The expected size in bytes of a cache line, used to pad data structures.
450 #define DEFAULT_CACHE_LINE_SIZE 64 456 #define DEFAULT_CACHE_LINE_SIZE 64
451 457
452 // Bytes needed to pad type to avoid cache-line sharing; alignment should be the
453 // expected cache line size (a power of two). The first addend avoids sharing
454 // when the start address is not a multiple of alignment; the second maintains
455 // alignment of starting addresses that happen to be a multiple.
456 #define PADDING_SIZE(type, alignment) \
457 ((alignment) + align_size_up_(sizeof(type), alignment))
458
459 // Templates to create a subclass padded to avoid cache line sharing. These are
460 // effective only when applied to derived-most (leaf) classes.
461
462 // When no args are passed to the base ctor.
463 template <class T, size_t alignment = DEFAULT_CACHE_LINE_SIZE>
464 class Padded: public T {
465 private:
466 char _pad_buf_[PADDING_SIZE(T, alignment)];
467 };
468
469 // When either 0 or 1 args may be passed to the base ctor.
470 template <class T, typename Arg1T, size_t alignment = DEFAULT_CACHE_LINE_SIZE>
471 class Padded01: public T {
472 public:
473 Padded01(): T() { }
474 Padded01(Arg1T arg1): T(arg1) { }
475 private:
476 char _pad_buf_[PADDING_SIZE(T, alignment)];
477 };
478 458
479 //---------------------------------------------------------------------------------------------------- 459 //----------------------------------------------------------------------------------------------------
480 // Utility macros for compilers 460 // Utility macros for compilers
481 // used to silence compiler warnings 461 // used to silence compiler warnings
482 462