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

Reply via email to