76 lines
2.7 KiB
C++
76 lines
2.7 KiB
C++
/*
|
|
Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License, version 2.0,
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is also distributed with certain software (including
|
|
but not limited to OpenSSL) that is licensed under separate terms,
|
|
as designated in a particular file or component or in included license
|
|
documentation. The authors of MySQL hereby grant you an additional
|
|
permission to link the program and your derivative works with the
|
|
separately licensed software that they have included with MySQL.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License, version 2.0, for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
#include "my_config.h"
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
#include <pthread.h>
|
|
|
|
#include "config.h"
|
|
#include "atomics.h"
|
|
#include "ndb_pipeline.h"
|
|
|
|
#include "all_tests.h"
|
|
|
|
#define TEST_ALLOC_BLOCKS 34
|
|
|
|
int run_allocator_test(QueryPlan *, Ndb *, int v) {
|
|
struct request_pipeline *p = get_request_pipeline(0, NULL);
|
|
|
|
memory_pool *p1 = pipeline_create_memory_pool(p);
|
|
int sz = 13;
|
|
uint tot = 0;
|
|
void *v1, *v2;
|
|
for(int i = 0 ; i < TEST_ALLOC_BLOCKS ; i++) {
|
|
v1 = memory_pool_alloc(p1, sz); tot += sz;
|
|
v2 = memory_pool_alloc(p1, sz + 1); tot += sz + 1;
|
|
sz = (int) (sz * 1.25);
|
|
}
|
|
|
|
detail(v, "Total requested: %d granted: %lu \n", tot, p1->size);
|
|
require(p1->size >= tot);
|
|
/* Get total before freeing the pool */
|
|
uint old_total = p1->size + p1->total;
|
|
memory_pool_free(p1);
|
|
/* The new total must equal the old_total */
|
|
require(old_total == p1->total);
|
|
|
|
memory_pool_destroy(p1);
|
|
memory_pool_destroy(p->pool); /* also destroy the pipeline's own pool */
|
|
|
|
for(int i = ALLIGATOR_POWER_SMALLEST ; i < ALLIGATOR_POWER_LARGEST ; i++) {
|
|
int list_size = p->alligator[i].list_size;
|
|
int free_slot = p->alligator[i].free_idx;
|
|
size_t alloc_sz = p->alligator[i].total;
|
|
|
|
detail(v, "Class %d idx %d used %lu \n",
|
|
i, list_size - free_slot, (unsigned long)alloc_sz);
|
|
/* After we destroy the pool, every slab must have 0 allocated blocks */
|
|
require(list_size - free_slot == 0);
|
|
/* But it must have a non-zero size, indicating that it has been used */
|
|
require(alloc_sz > 0);
|
|
}
|
|
pass;
|
|
}
|
|
|