Hello,

looking in the dlopen man, I see that at least one flag should be present:

<snip>
      One of the following two values must be included in flag:

      RTLD_LAZY
Perform lazy binding. Only resolve symbols as the code that references them is executed. If the symbol is never referenced, then it is never resolved. (Lazy binding is only performed for function references; references to variables are always immediately bound when the library is loaded.)

      RTLD_NOW
If this value is specified, or the environment variable LD_BIND_NOW is set to a non-empty string, all undefined symbols in the library are resolved before dlopen()
             returns. If this cannot be done, an error is returned.
</snip>

They have the value 1 and 2, so 0 is not valid, as I could get. I would prefer to use it for default flags (I will do it as define to be easy to change in the future if needed).

I will apply the patch very soon, but I will introduce the flags in module's exported structure, to be bundled with the other fields, otherwise it may get lost in variable/function declarations and hard to spot.

Cheers,
Daniel


On 11/28/06 11:31, Bastian Friedrich wrote:
Hi,

Am Dienstag, 28. November 2006 10:09 schrieb Daniel-Constantin Mierla:
to optimize a bit, I would keep the default flags in a variable and I
will check the flags forced by a module with those ones, not to
close/open again with same flags.

ACK. See attached patch.

Also, maybe a value (like 0) should be used to signal that the module wants to be loaded with the default flags
and not double-check again.

I used "if (modflags >= 0)" (i.e.: -1 is "default flags"); 0 could potentially be a valid flag.

Thx a lot,
   Bastian

------------------------------------------------------------------------

Index: sr_module.h
===================================================================
RCS file: /cvsroot/openser/sip-server/sr_module.h,v
retrieving revision 1.8
diff -u -r1.8 sr_module.h
--- sr_module.h 23 Nov 2006 21:57:14 -0000      1.8
+++ sr_module.h 28 Nov 2006 09:28:28 -0000
@@ -159,5 +159,10 @@
  *  - returns >0 if ok, 0 to drop message
  */
+struct mod_info_ {
+       int dlopenflags;
+};
+
+typedef struct mod_info_ mod_info_t;
#endif
Index: sr_module.c
===================================================================
RCS file: /cvsroot/openser/sip-server/sr_module.c,v
retrieving revision 1.7
diff -u -r1.7 sr_module.c
--- sr_module.c 23 Nov 2006 21:57:13 -0000      1.7
+++ sr_module.c 28 Nov 2006 09:28:28 -0000
@@ -199,17 +199,40 @@
        char* error;
        struct module_exports* exp;
        struct sr_module* t;
+       mod_info_t *info;
+       int defaultflags;
+       int modflags;
        
 #ifndef RTLD_NOW
 /* for openbsd */
 #define RTLD_NOW DL_LAZY
 #endif
-       handle=dlopen(path, RTLD_NOW); /* resolve all symbols now */
+       defaultflags = RTLD_NOW;
+       handle=dlopen(path, defaultflags); /* resolve all symbols now */
        if (handle==0){
                LOG(L_ERR, "ERROR: load_module: could not open module <%s>: 
%s\n",
                                        path, dlerror() );
                goto error;
        }
+
+       dlerror();
+       if ((info = dlsym(handle, "mod_info"))) {     /* mod_info found */
+               if (!dlerror()) {                       /* ... and no error 
occured */
+                       modflags = info->dlopenflags;
+                       if ((modflags != defaultflags) && (modflags >= 0)) {
+                               dlclose(handle);
+                               DBG("DEBUG:load_module:Reloading module %s with 
flags %d\n",
+                                        path, modflags);
+                               handle = dlopen(path, modflags);
+                               if (handle==0){
+                                       LOG(L_ERR, "ERROR: load_module: could not open 
module <%s>: %s\n",
+                                                               path, dlerror() 
);
+                                       goto error;
+                               }
+                       }
+
+               }
+       }
        
        for(t=modules;t; t=t->next){
                if (t->handle==handle){

_______________________________________________
Devel mailing list
[email protected]
http://openser.org/cgi-bin/mailman/listinfo/devel

Reply via email to