genode/repos/base/src/test/new_delete/main.cc
2017-01-13 13:07:07 +01:00

114 lines
2.2 KiB
C++

/*
* \brief Test dynamic memory management in C++
* \author Christian Helmuth
* \date 2014-01-20
*
*/
/*
* Copyright (C) 2012-2014 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#include <base/component.h>
#include <base/heap.h>
#include <base/log.h>
using Genode::log;
using Genode::destroy;
#define L() log(" ", __func__)
struct A { int a; A() { L(); } virtual ~A() { L(); } };
struct B { int b; B() { L(); } virtual ~B() { L(); } };
struct C : A { int c; C() { L(); } virtual ~C() { L(); } };
struct D : B { int d; D() { L(); } virtual ~D() { L(); } };
struct E : C, D
{
int e;
E(bool thro) { L(); if (thro) { log("throw exception"); throw 1; } }
virtual ~E() { L(); }
};
struct Allocator : Genode::Allocator
{
Genode::Heap heap;
Genode::Allocator & a { heap };
Allocator(Genode::Env & env) : heap(env.ram(), env.rm()) { }
virtual ~Allocator() { }
Genode::size_t consumed() const override {
return a.consumed(); }
Genode::size_t overhead(Genode::size_t size) const override {
return a.overhead(size); }
bool need_size_for_free() const override {
return a.need_size_for_free(); }
bool alloc(Genode::size_t size, void **p) override
{
*p = a.alloc(size);
log("Allocator::alloc()");
return *p != 0;
}
void free(void *p, Genode::size_t size) override
{
log("Allocator::free()");
a.free(p, size);
}
};
void Component::construct(Genode::Env &env)
{
Allocator a(env);
/***********************
** Allocator pointer **
***********************/
/* test successful allocation / successful construction */
{
E *e = new (a) E(false);
destroy(a, e);
}
/* test successful allocation / exception in construction */
try {
E *e = new (a) E(true);
destroy(a, e);
} catch (...) { log("exception caught"); }
/*************************
** Allocator reference **
*************************/
/* test successful allocation / successful construction */
{
E *e = new (a) E(false);
destroy(a, e);
}
/* test successful allocation / exception in construction */
try {
E *e = new (a) E(true);
destroy(a, e);
} catch (...) { log("exception caught"); }
log("Test done");
}