2015-03-10 11:16:03 +01:00
|
|
|
/**
|
|
|
|
* \brief Manage object dependencies
|
|
|
|
* \author Sebastian Sumpf
|
|
|
|
* \date 2015-03-12
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright (C) 2015 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 <linker.h>
|
|
|
|
#include <dynamic.h>
|
|
|
|
#include <init.h>
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Dependency node
|
|
|
|
*/
|
|
|
|
Linker::Dependency::Dependency(char const *path, Root_object *root,
|
|
|
|
Genode::Fifo<Dependency> * const dep,
|
|
|
|
unsigned flags)
|
|
|
|
: obj(load(path, this, flags)), root(root)
|
|
|
|
{
|
|
|
|
dep->enqueue(this);
|
|
|
|
load_needed(dep, flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Linker::Dependency::~Dependency()
|
|
|
|
{
|
|
|
|
if (obj->unload()) {
|
|
|
|
|
|
|
|
if (verbose_loading)
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
Genode::log("Destroy: ", obj->name());
|
2015-03-10 11:16:03 +01:00
|
|
|
|
|
|
|
destroy(Genode::env()->heap(), obj);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool Linker::Dependency::in_dep(char const *file,
|
|
|
|
Genode::Fifo<Dependency> * const dep)
|
|
|
|
{
|
|
|
|
for (Dependency *d = dep->head(); d; d = d->next())
|
|
|
|
if (!Genode::strcmp(file, d->obj->name()))
|
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Linker::Dependency::load_needed(Genode::Fifo<Dependency> * const dep,
|
|
|
|
unsigned flags)
|
|
|
|
{
|
|
|
|
for (Dynamic::Needed *n = obj->dynamic()->needed.head(); n; n = n->next()) {
|
|
|
|
char const *path = n->path(obj->dynamic()->strtab);
|
|
|
|
|
|
|
|
Object *o;
|
|
|
|
if (!in_dep(Linker::file(path), dep))
|
|
|
|
new (Genode::env()->heap()) Dependency(path, root, dep, flags);
|
|
|
|
|
|
|
|
/* re-order initializer list, if needed object has been already added */
|
|
|
|
else if ((o = Init::list()->contains(Linker::file(path))))
|
|
|
|
Init::list()->reorder(o);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Linker::Root_object::Root_object(char const *path, unsigned flags)
|
|
|
|
{
|
|
|
|
new (Genode::env()->heap()) Dependency(path, this, &dep, flags);
|
|
|
|
|
|
|
|
/* provide Genode base library access */
|
2015-02-12 11:26:18 +01:00
|
|
|
new (Genode::env()->heap()) Dependency(linker_name(), this, &dep);
|
2015-03-10 11:16:03 +01:00
|
|
|
|
|
|
|
/* relocate and call constructors */
|
|
|
|
Init::list()->initialize();
|
|
|
|
}
|