OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 return false; | 803 return false; |
804 | 804 |
805 // bucket->slotSize is the current size of the allocation. | 805 // bucket->slotSize is the current size of the allocation. |
806 size_t currentSize = page->bucket->slotSize; | 806 size_t currentSize = page->bucket->slotSize; |
807 if (newSize == currentSize) | 807 if (newSize == currentSize) |
808 return true; | 808 return true; |
809 | 809 |
810 char* charPtr = static_cast<char*>(partitionPageToPointer(page)); | 810 char* charPtr = static_cast<char*>(partitionPageToPointer(page)); |
811 | 811 |
812 if (newSize < currentSize) { | 812 if (newSize < currentSize) { |
| 813 size_t mapSize = partitionPageToDirectMapExtent(page)->mapSize; |
| 814 |
| 815 // Don't reallocate in-place if new size is less than 80 % of the full |
| 816 // map size, to avoid holding on to too much unused address space. |
| 817 if ((newSize / kSystemPageSize) * 5 < (mapSize / kSystemPageSize) * 4) |
| 818 return false; |
| 819 |
813 // Shrink by decommitting unneeded pages and making them inaccessible. | 820 // Shrink by decommitting unneeded pages and making them inaccessible. |
814 size_t decommitSize = currentSize - newSize; | 821 size_t decommitSize = currentSize - newSize; |
815 decommitSystemPages(charPtr + newSize, decommitSize); | 822 decommitSystemPages(charPtr + newSize, decommitSize); |
816 setSystemPagesInaccessible(charPtr + newSize, decommitSize); | 823 setSystemPagesInaccessible(charPtr + newSize, decommitSize); |
817 } else if (newSize <= partitionPageToDirectMapExtent(page)->mapSize) { | 824 } else if (newSize <= partitionPageToDirectMapExtent(page)->mapSize) { |
818 // Grow within the actually allocated memory. Just need to make the | 825 // Grow within the actually allocated memory. Just need to make the |
819 // pages accessible again. | 826 // pages accessible again. |
820 size_t recommitSize = newSize - currentSize; | 827 size_t recommitSize = newSize - currentSize; |
821 setSystemPagesAccessible(charPtr + currentSize, recommitSize); | 828 setSystemPagesAccessible(charPtr + currentSize, recommitSize); |
822 | 829 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 printf("total live: %zu bytes\n", totalLive); | 947 printf("total live: %zu bytes\n", totalLive); |
941 printf("total resident: %zu bytes\n", totalResident); | 948 printf("total resident: %zu bytes\n", totalResident); |
942 printf("total freeable: %zu bytes\n", totalFreeable); | 949 printf("total freeable: %zu bytes\n", totalFreeable); |
943 fflush(stdout); | 950 fflush(stdout); |
944 } | 951 } |
945 | 952 |
946 #endif // !NDEBUG | 953 #endif // !NDEBUG |
947 | 954 |
948 } // namespace WTF | 955 } // namespace WTF |
949 | 956 |
OLD | NEW |