Re: module cleanup [1/n]

"Gary V. Vaughan" <[email protected]>
Newsgroups gmane.comp.gnu.m4.patches
Message-ID <[email protected]>
Hi Eric,

First of all: Nice work! :-)

On Sep 6, 2007, at 11:56 PM, Eric Blake wrote:
> While investigating the possibility of tracing builtins regardless  
> of the name
> used to invoke them (or lack thereof, as in builtin(`divnum'))[1],  
> I noticed a
> number of (potential) issues with modules (not all of them fixable  
> in M4):
>
> - Right now, load(nosuchmodule) and unload(nosuchmodule) both exit the
> program.  Maybe they should give a warning, but continue processing  
> input?

Errors should be diagnosed as early as possible, and a script that  
loads a module
must do so for additional builtins.  Better to exit with a failed  
load early, than
to quietly copy text badly due to a missing builtin that causes  
something not to
expand.

Perhaps we could add an options parameter to load() like this?

    load(`nosuchmodule', `nocomplain')

> - The current module interface uses data exports for the builtin  
> and macro
> tables.  Libtool recommends using function exports instead of data  
> exports;
> changing this would be a change in the module interface, but might  
> make porting
> to obscure platforms easier

Agreed.  The module interface has evolved through several iterations  
in previous
alpha releases, and it is clearly marked as experimental in README  
and/or NEWS
IIRC, so further improvements at the expense of backward  
compatibility are quite
acceptable prior to release IMHO.

> - Based on the above point, it would be nice if we made ALL m4- 
> compatible
> modules export a function that advertised what version of m4 module  
> interface
> they comply with.  Absence of the version query function implies  
> interface
> version 1 (ie. the current version), where at least one of the  
> builtin table,
> macro table, init function, or finish function must exist.  Then,  
> we can do a
> better job about supporting new features in new modules, while  
> still being able
> to load old modules

Excellent idea.  Absence of the version query should imply  
unsupported alpha
module interface though.  Lets have version 1 be the version used by  
the first
official release with modules.

> - There is an open issue about freezing module-dependent state,  
> such as the m4
> module saving the current state of the sysval macro, which would  
> require a new
> API - having a module interface versioning scheme would make this  
> nicer to
> implement

ACK.

> - Module ref-counting is screwy.  The current unload code assumes  
> that builtins
> associated with a module must only be unloaded once the module  
> refcount is at
> one and will be dropping to 0.  But that's a bit presumptuous,  
> since the
> libltdl ref-count could include 3rd party loads of the same module  
> that should
> have no impact to our symbol table.

It certainly can't do any harm to be more careful about this.  HEAD  
libltdl does
assume that only one module loading extension point will be  
responsible for loading
of any module.  That is, if a module is written to be loaded by the  
m4 module loader,
then it shouldn't be loaded by a different module system (say the  
libsnprintfv
extension point -- if we reimplemented m4's format builtin using  
libsnprintfv).

> Also, we weren't decreasing the ref-count
> of resident modules, which meant that symbols from such a module  
> weren't always
> being removed from the symbol table at the right time

Nice catch; I missed that one.

> - Speaking of refcounts, the m4modules builtin only shows a module  
> once, even
> if it has been loaded multiple times.  Maybe it is worth adding  
> another builtin
> to the load module that can query the current refcount of a given  
> module name?

I'm loathe to keep adding builtins where we can extend existing  
builtins to get
the same functionality in a clean intuitive way.  m4modules is not  
yet bound to
provide backwards compatibility, so we could simply have it add newly  
loaded modules
to the list each time they are successfully loaded.  Membership tests  
would be
unaffected, and a macro to count occurences could easily work out the  
refcount of
a named module.

> - We aren't very robust to modules that change their mind  
> midstream.  It is
> currently possible for a stateful module to crash m4, by altering  
> the array
> that the exported builtin table points at based on what actions are  
> done via
> module builtins.  Also, I'm not sure how expensive lt_dlsym is, but  
> do know
> that system calls are more expensive than memory checks.  So rather  
> than re-
> query lt_dlsym every time we need to search the module for a  
> particular
> builtin, it would be more robust to copy and cache the builtin  
> table provided
> by the module when it was first loaded, then refer to the cache  
> thereafter

Agreed.

In the case of existing modules, they are preloaded, so lt_dlsym is  
actually
looking at the compiled in cache.  Your point is certainly valid for  
user loaded
modules.

> - If we add symbol caching, then it becomes trivial to store  
> information
> associated with a builtin (back to my original thought of adding  
> the ability to
> trace a builtin regardless of the name it is invoked by); without a  
> cache,
> there is no convenient place to do per-builtin tracking since we can't
> necessarily write into the memory owned by a module

Libltdl has APIs to attach data structures to a loaded module.  That  
may or may
not prove to be the easier place to hang things...

> - We currently expose the libltdl interface to all clients of  
> m4module.h.  That
> is poor interface design

ACK.

> - Error messages from libltdl are not translated

Patches to libtool gratefully accepted :-) (post 2.2!!)

Cheers,
	Gary
-- 
   ())_.              Email me: [email protected]
   ( '/           Read my blog: http://blog.azazil.net
   / )=         ...and my book: http://sources.redhat.com/autobook
`(_~)_      Join my AGLOCO Network: http://www.agloco.com/r/BBBS7912

_______________________________________________
M4-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/m4-patches
PGP.sig (application/pgp-signature, 186 B) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.