/** * Copyright 2013, Landz and its contributors. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package z.offheap.zmalloc.unit; import org.junit.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static z.offheap.zmalloc.AllocatorPrivatesBridge.sizeClassIndex; public class AllocatorTest { @Test public void testSizeTypeIndex() { int sizeOfBytes; sizeOfBytes = 7; assertThat(sizeClassIndex(sizeOfBytes), is(0));//8 sizeOfBytes = 9; assertThat(sizeClassIndex(sizeOfBytes), is(1));//16 sizeOfBytes = 15; assertThat(sizeClassIndex(sizeOfBytes), is(1));//16 sizeOfBytes = 9; assertThat(sizeClassIndex(sizeOfBytes), is(1));//16 sizeOfBytes = 17; assertThat(sizeClassIndex(sizeOfBytes), is(2));//24 sizeOfBytes = 24; assertThat(sizeClassIndex(sizeOfBytes), is(2));//24 sizeOfBytes = 25; assertThat(sizeClassIndex(sizeOfBytes), is(3));//32 sizeOfBytes = 31; assertThat(sizeClassIndex(sizeOfBytes), is(3));//32 sizeOfBytes = 32; assertThat(sizeClassIndex(sizeOfBytes), is(3));//32 sizeOfBytes = 33; assertThat(sizeClassIndex(sizeOfBytes), is(4));//48 sizeOfBytes = 48; assertThat(sizeClassIndex(sizeOfBytes), is(4));//48 sizeOfBytes = 63; assertThat(sizeClassIndex(sizeOfBytes), is(5));//64 sizeOfBytes = 65; assertThat(sizeClassIndex(sizeOfBytes), is(6));//96 sizeOfBytes = 128; assertThat(sizeClassIndex(sizeOfBytes), is(7)); sizeOfBytes = 129; assertThat(sizeClassIndex(sizeOfBytes), is(8)); sizeOfBytes = 1024; assertThat(sizeClassIndex(sizeOfBytes), is(13)); sizeOfBytes = 1023; assertThat(sizeClassIndex(sizeOfBytes), is(13)); sizeOfBytes = 1025; assertThat(sizeClassIndex(sizeOfBytes), is(14)); sizeOfBytes = 1535; assertThat(sizeClassIndex(sizeOfBytes), is(14)); sizeOfBytes = 8192; assertThat(sizeClassIndex(sizeOfBytes), is(19)); sizeOfBytes = 8193; assertThat(sizeClassIndex(sizeOfBytes), is(20)); sizeOfBytes = 12288; assertThat(sizeClassIndex(sizeOfBytes), is(20)); sizeOfBytes = 32768; assertThat(sizeClassIndex(sizeOfBytes), is(23)); sizeOfBytes = 32769; assertThat(sizeClassIndex(sizeOfBytes), is(24)); sizeOfBytes = 49152; assertThat(sizeClassIndex(sizeOfBytes), is(24)); sizeOfBytes = 65536; assertThat(sizeClassIndex(sizeOfBytes), is(25)); sizeOfBytes = 65537; assertThat(sizeClassIndex(sizeOfBytes), is(26)); sizeOfBytes = 98303; assertThat(sizeClassIndex(sizeOfBytes), is(26)); sizeOfBytes = 98304; assertThat(sizeClassIndex(sizeOfBytes), is(26)); sizeOfBytes = 98305; assertThat(sizeClassIndex(sizeOfBytes), is(27)); sizeOfBytes = 131072; assertThat(sizeClassIndex(sizeOfBytes), is(27)); sizeOfBytes = 196608; assertThat(sizeClassIndex(sizeOfBytes), is(28)); sizeOfBytes = 262144; assertThat(sizeClassIndex(sizeOfBytes), is(29)); sizeOfBytes = 393216; assertThat(sizeClassIndex(sizeOfBytes), is(30)); sizeOfBytes = 524288; assertThat(sizeClassIndex(sizeOfBytes), is(31)); sizeOfBytes = 786432; assertThat(sizeClassIndex(sizeOfBytes), is(32)); sizeOfBytes = 786433; assertThat(sizeClassIndex(sizeOfBytes), is(33)); sizeOfBytes = 1048575; assertThat(sizeClassIndex(sizeOfBytes), is(33)); sizeOfBytes = 1048576; assertThat(sizeClassIndex(sizeOfBytes), is(33)); sizeOfBytes = 1048577; assertThat(sizeClassIndex(sizeOfBytes), is(34)); sizeOfBytes = 1572863; assertThat(sizeClassIndex(sizeOfBytes), is(34)); sizeOfBytes = 1572864; assertThat(sizeClassIndex(sizeOfBytes), is(34)); sizeOfBytes = 1572865; assertThat(sizeClassIndex(sizeOfBytes), is(35)); sizeOfBytes = 1<<21; assertThat(sizeClassIndex(sizeOfBytes), is(35)); sizeOfBytes = 1<<28; assertThat(sizeClassIndex(sizeOfBytes), is(35)); sizeOfBytes = 1<<30; assertThat(sizeClassIndex(sizeOfBytes), is(35)); } @Test public void testNumOfMaxChunksForSizeClass() { } // @Test // public void testOperationsForGP() { // long TOTAL_AVAILABLEPAGES = allocator_TOTAL_AVAILABLEPAGES(); // //// System.out.println("address of GPHead_AvailablePagesHead: "+ //// Long.toHexString(allocator_get_addressGPHead_AvailablePagesHead())); // // MatcherAssert.assertThat(Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages(), // is(TOTAL_AVAILABLEPAGES)); // // long page1 = gp_Page_pop(); // assertThat(Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages(), // is(TOTAL_AVAILABLEPAGES - 1L)); // // long page2 = gp_Page_pop(); // assertThat(Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages(), // is(TOTAL_AVAILABLEPAGES - 2L)); // // long page3 = gp_Page_pop(); // assertThat(Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages(), // is(TOTAL_AVAILABLEPAGES - 3L)); // // assertThat(page1-page2,is(SIZE_ZMPAGE)); // assertThat(page2-page3,is(SIZE_ZMPAGE)); // // gp_Page_push(page1); // assertThat(Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages(), // is(TOTAL_AVAILABLEPAGES - 2L)); // gp_Page_push(page2); // assertThat(Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages(), // is(TOTAL_AVAILABLEPAGES - 1L)); // gp_Page_push(page3); // assertThat(Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages(), // is(TOTAL_AVAILABLEPAGES)); // // long[] pages = new long[(int)TOTAL_AVAILABLEPAGES]; // for (int i = 0; i < TOTAL_AVAILABLEPAGES; i++) { // pages[i] = gp_Page_pop(); // assertThat(TOTAL_AVAILABLEPAGES-i-1, // is(Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages())); // } // //return all pages // for (int i = 0; i < TOTAL_AVAILABLEPAGES; i++) { // gp_Page_push(pages[i]); // } // // //finally last page is at addressGP //// System.out.println("addressGP: "+ //// Long.toHexString(allocator_get_addressGP())); // assertThat(pages[(int)TOTAL_AVAILABLEPAGES-1], // is(allocator_get_addressGP())); // } // // // @Test // public void testOperationsForTLP00() { // int sci = 0; // long tid = getCurrentThreadId(); // //// assertThat(Allocator.ManagedPoolStats.currentNumOfTLPs(),is(0L)); // assertThat(Allocator.ManagedPoolStats.currentNumOfTLPFreePages(),is(0L)); // // //sizeClass - 8B // assertThat(Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(0),is(0L)); // // //then request a page from gp // long page = gp_Page_pop(); // //initialize with 8B sizeClass // assertThat(page,not(0L)); // assertThat(isPageAligned(page),is(true)); // pg_setupPage(page,sci,tid); // // assertThat(Allocator.ManagedPoolStats.currentNumOfTLPs(),is(1L)); // // tlp_AvailablePages_push(tid,sci,page); // assertThat(Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(sci),is(1L)); // // // long fakeFullPage = tlp_AvailablePages_pop(tid,sci); // assertThat(Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(sci),is(0L)); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfPGAvailableChunks(fakeFullPage), // is((SIZE_ZMPAGE-ZMPAGE_RAWCHUNK_OFFSET)/8)); // long chunk = pg_AvailableChunks_pop(fakeFullPage); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfPGAvailableChunks(fakeFullPage), // is((SIZE_ZMPAGE-ZMPAGE_RAWCHUNK_OFFSET)/8-1)); //// System.out.println(Long.toHexString(fakeFullPage)); //// System.out.println(Long.toHexString(chunk)); // assertThat(fakeFullPage, is(chunk-(chunk%SIZE_ZMPAGE))); // assertThat(fakeFullPage, is(chunk+8L-(SIZE_ZMPAGE))); // // } // // @Test // public void testOperationsForTLP01() { // //XXX: test sizeClass 16B // int sci = 1; // long tid = getCurrentThreadId(); // // tlp_ini(tid); // assertThat(Allocator.ManagedPoolStats.currentNumOfTLPs(),is(1L)); // // //then request a page from gp // long page = gp_Page_pop(); // pg_setupPage(page,sci,tid); // //initialize with 8B sizeClass // assertThat(page,not(0L)); // assertThat(isPageAligned(page),is(true)); // // tlp_AvailablePages_push(tid,sci,page); // assertThat(Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(sci),is(1L)); // // // long fakeFullPage = tlp_AvailablePages_pop(tid,sci); // assertThat(Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(sci),is(0L)); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfPGAvailableChunks(fakeFullPage), // is(((SIZE_ZMPAGE)-ZMPAGE_RAWCHUNK_OFFSET)/16)); // long chunk = pg_AvailableChunks_pop(fakeFullPage); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfPGAvailableChunks(fakeFullPage), // is(((SIZE_ZMPAGE)-ZMPAGE_RAWCHUNK_OFFSET)/16-1L)); //// System.out.println(Long.toHexString(fakeFullPage)); //// System.out.println(Long.toHexString(chunk)); // assertThat(fakeFullPage, is(chunk-(chunk%SIZE_ZMPAGE))); // assertThat(fakeFullPage, is(chunk+16L-(SIZE_ZMPAGE))); // } // // @Test // public void testAllocateFreeSmall() { // long chunk0 = Allocator.allocate(15); // long chunk1 = Allocator.allocate(15); // long chunk2 = Allocator.allocate(15); // long page = chunk0-(chunk0%SIZE_ZMPAGE); // assertThat(chunk0-(chunk0%SIZE_ZMPAGE), // is(chunk2-(chunk2%SIZE_ZMPAGE))); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfPGAvailableChunks(page), // is(((SIZE_ZMPAGE)-ZMPAGE_RAWCHUNK_OFFSET)/16-3L)); // // Allocator.free(chunk0); // Allocator.free(chunk1); // Allocator.free(chunk2); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfPGAvailableChunks(page), // is(((SIZE_ZMPAGE)-ZMPAGE_RAWCHUNK_OFFSET)/16)); // // long chunk3 = Allocator.allocate(12); // long chunk4 = Allocator.allocate(13); // long chunk5 = Allocator.allocate(14); // // assertThat(chunk3,is(chunk2)); // assertThat(chunk4,is(chunk1)); // assertThat(chunk5,is(chunk0)); // } // // @Test // public void testAllocateFree512k() { // long chunk0 = Allocator.allocate(500_000);//->524288 // long page0 = chunk0-(chunk0%SIZE_ZMPAGE); // assertThat( // Allocator.ManagedPoolStats.currentNumOfPGAvailableChunks(page0),is(0L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(31),//->524288 // is(0L)); // // long chunk1 = Allocator.allocate(500_000); // long page1 = chunk1-(chunk1%SIZE_ZMPAGE); // assertThat( // Allocator.ManagedPoolStats.currentNumOfPGAvailableChunks(page1),is(0L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(31),//->524288 // is(0L)); // // Allocator.free(chunk0); // Allocator.free(chunk1); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(31),//->524288 // is(2L)); // // long chunk2 = Allocator.allocate(500_001); // long chunk3 = Allocator.allocate(500_002); // // assertThat(chunk2,is(chunk1)); // assertThat(chunk3,is(chunk0)); // } // // @Test // public void testFree1() { // long[] addresses = new long[6]; // for (int i = 0; i < 6; i++) { // addresses[i] = Allocator.allocate(256*1024); // } // // long TOTAL_AVAILABLEPAGES = allocator_TOTAL_AVAILABLEPAGES(); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages(), // is(TOTAL_AVAILABLEPAGES-2)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(29),//->262144 // is(0L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPFreePages(), // is(0L)); // // Allocator.free(addresses[0]); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(29),//->262144 // is(1L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPFreePages(), // is(0L)); // // Allocator.free(addresses[1]); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(29),//->262144 // is(1L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPFreePages(), // is(0L)); // // Allocator.free(addresses[2]); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(29),//->262144 // is(0L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPFreePages(), // is(1L)); // // Allocator.free(addresses[3]); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(29),//->262144 // is(1L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPFreePages(), // is(1L)); // // Allocator.free(addresses[4]); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(29),//->262144 // is(1L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPFreePages(), // is(1L)); // // Allocator.free(addresses[5]); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(29),//->262144 // is(0L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPFreePages(), // is(2L)); // // } // // // @Test // public void testFree2() { // long[] addresses29 = new long[3]; // for (int i = 0; i < 3; i++) { // addresses29[i] = Allocator.allocate(256*1024); // } // // long[] addresses30 = new long[3]; // for (int i = 0; i < 3; i++) { // addresses30[i] = Allocator.allocate(300*1024); // } // // long TOTAL_AVAILABLEPAGES = allocator_TOTAL_AVAILABLEPAGES(); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfGPAvaiablePages(), // is(TOTAL_AVAILABLEPAGES-3)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(29), // is(0L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(30), // is(1L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPFreePages(), // is(0L)); // // // Allocator.free(addresses29[0]); // Allocator.free(addresses30[0]); // Allocator.free(addresses29[1]); // Allocator.free(addresses30[1]); // Allocator.free(addresses29[2]); // Allocator.free(addresses30[2]); // // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(29), // is(0L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPAvaiablePages(30), // is(0L)); // assertThat( // Allocator.ManagedPoolStats.currentNumOfTLPFreePages(), // is(3L)); // // } }