@@ -18,7 +18,7 @@ class LargeObject {
1818 public:
1919 static always_inline void * Allocate (size_t size);
2020 static always_inline void Free (void * p);
21- static always_inline size_t ObjectSize (void * p);
21+ static always_inline size_t PayloadSize (void * p);
2222
2323 private:
2424 static const uint64_t kMagic = 0xAAAAAAAAAAAAAAAA ;
@@ -29,7 +29,8 @@ class LargeObject {
2929 always_inline void * ObjectStart ();
3030 always_inline bool Validate ();
3131
32- always_inline size_t size () { return actual_size_; }
32+ always_inline size_t payload_size () { return actual_size_ - sizeof (*this ); }
33+ always_inline size_t actual_size () { return actual_size_; }
3334
3435 size_t actual_size_;
3536 uint64_t magic_;
@@ -53,23 +54,27 @@ LargeObject* LargeObject::FromMutatorPtr(void* p) {
5354
5455
5556void * LargeObject::Allocate (size_t size) {
56- const size_t actual_size = size + sizeof (LargeObject);
57+ const size_t actual_size = PadSize ( size + sizeof (LargeObject), kPageSize );
5758 LargeObject* obj = new (SystemMmapFail (actual_size)) LargeObject (actual_size);
59+ #ifdef DEBUG
60+ // Force the check by going through the mutator pointer.
61+ obj = LargeObject::FromMutatorPtr (obj->ObjectStart ());
62+ #endif // DEBUG
5863 return obj->ObjectStart ();
5964}
6065
6166
6267void LargeObject::Free (void * p) {
6368 LargeObject* obj = FromMutatorPtr (p);
64- if (munmap (obj, obj->size ()) != 0 ) {
69+ if (munmap (obj, obj->actual_size ()) != 0 ) {
6570 Fatal (" munmap failed" );
6671 }
6772}
6873
6974
70- size_t LargeObject::ObjectSize (void * p) {
75+ size_t LargeObject::PayloadSize (void * p) {
7176 LargeObject* obj = FromMutatorPtr (p);
72- return obj->size ();
77+ return obj->payload_size ();
7378}
7479
7580
0 commit comments