On 11/01/2013 04:04 AM, Fan Jinfei wrote:
> 4. Shared lib on ia32 build
=== modified file 'uspace/lib/c/generic/rtld/module.c'
--- uspace/lib/c/generic/rtld/module.c 2012-04-02 15:52:07 +0000
+++ uspace/lib/c/generic/rtld/module.c 2013-10-29 15:25:23 +0000
@@ -106,7 +107,7 @@
soname = p ? (p + 1) : name;
/* Traverse list of all modules. Not extremely fast, but simple */
- list_foreach(runtime_env->modules, cur) {
+ list_foreach(runtime_env->modules, modules_link, module_t, cur) {
DPRINTF("cur = %p\n", cur);
m = list_get_instance(cur, module_t, modules_link);
if (str_cmp(m->dyn.soname, soname) == 0) {
@@ -246,7 +247,7 @@
{
module_t *m;
- list_foreach(runtime_env->modules, cur) {
+ list_foreach(runtime_env->modules, modules_link, module_t, cur) {
m = list_get_instance(cur, module_t, modules_link);
/* Skip rtld, since it has already been processed */
@@ -262,7 +263,7 @@
{
module_t *m;
- list_foreach(runtime_env->modules, cur) {
+ list_foreach(runtime_env->modules, modules_link, module_t, cur) {
m = list_get_instance(cur, module_t, modules_link);
m->bfs_tag = false;
}
This doesn't look right. list_foreach() will declare cur as module_t and
then it will pass it to list_get_instance() to interpret it as link_t *.
I guess you made the following change to make this work, didn't you?
=== modified file 'uspace/lib/c/include/rtld/module.h'
--- uspace/lib/c/include/rtld/module.h 2012-04-02 15:52:07 +0000
+++ uspace/lib/c/include/rtld/module.h 2013-10-29 14:56:48 +0000
@@ -40,6 +40,9 @@
#include <adt/list.h>
typedef struct module {
+ /** Link to list of all modules in runtime environment */
+ link_t modules_link;
+
dyn_info_t dyn;
size_t bias;
@@ -51,8 +54,6 @@
/** True iff relocations have already been processed in this module. */
bool relocated;
- /** Link to list of all modules in runtime environment */
- link_t modules_link;
/** Link to BFS queue. Only used when doing a BFS of the module graph */
link_t queue_link;
Instead, the code can be somewhat simplified, because list_foreach() now
combines the functionality of the old list_foreach() and
list_get_instance(). See the attached patch.
Best,
Jakub
=== modified file 'uspace/lib/c/generic/rtld/module.c'
--- uspace/lib/c/generic/rtld/module.c 2012-04-02 15:52:07 +0000
+++ uspace/lib/c/generic/rtld/module.c 2013-11-01 21:07:18 +0000
@@ -92,7 +92,6 @@
*/
module_t *module_find(const char *name)
{
- module_t *m;
const char *p, *soname;
DPRINTF("module_find('%s')\n", name);
@@ -106,9 +105,8 @@
soname = p ? (p + 1) : name;
/* Traverse list of all modules. Not extremely fast, but simple */
- list_foreach(runtime_env->modules, cur) {
- DPRINTF("cur = %p\n", cur);
- m = list_get_instance(cur, module_t, modules_link);
+ list_foreach(runtime_env->modules, modules_link, module_t, m) {
+ DPRINTF("m = %p\n", m);
if (str_cmp(m->dyn.soname, soname) == 0) {
return m; /* Found */
}
@@ -244,11 +242,7 @@
*/
void modules_process_relocs(module_t *start)
{
- module_t *m;
-
- list_foreach(runtime_env->modules, cur) {
- m = list_get_instance(cur, module_t, modules_link);
-
+ list_foreach(runtime_env->modules, modules_link, module_t, m) {
/* Skip rtld, since it has already been processed */
if (m != &runtime_env->rtld) {
module_process_relocs(m);
@@ -260,10 +254,7 @@
*/
void modules_untag(void)
{
- module_t *m;
-
- list_foreach(runtime_env->modules, cur) {
- m = list_get_instance(cur, module_t, modules_link);
+ list_foreach(runtime_env->modules, modules_link, module_t, m) {
m->bfs_tag = false;
}
}
_______________________________________________
HelenOS-devel mailing list
[email protected]
http://lists.modry.cz/listinfo/helenos-devel