[GiNaC-devel] Crash during startup
Richard B. Kreckel
kreckel at thep.physik.uni-mainz.de
Fri Jan 7 22:13:03 CET 2005
Hi!
On Fri, 7 Jan 2005, Chris Dams wrote:
> Ah! Now, after some thinking, I think I understand it. _ex0 is initialized
> at the point when utils.o is initialized, which may well be after
> integral::relative_integration_error is intialized.
This appears to be the problem.
> > If that analysis is correct there appears to be a loophole in the
> > initialization order scheme. I wonder how that can be fixed without
> > creating a big mess in utils.cpp...
>
> Well, it makes me wonder why there is such a thing as a library_init.
> After all, it appears that just writing
>
> ex integral::relative_integration_error = 1e-8;
>
> is also allowed. Why is not that done for all static objects, such as
> _ex0?
Because of object sharing when there are more than one ex representing the
same number. That's an efficiency argument.
> The only thing is that other static objects, should not be using
> _ex0, as I did with my .evalf(). As far as I understand library_init was
> introduced to solve this "problem", however is the problem solvable at
> all?
Theoretically, by making sure the library_init ctor constructs it as well.
Maybe using placement new or some such trick.
> After all, _ex0 exists because it is initialized in some *.o file
> and, I think, it should not be initialized in multiple *.o files, because
> that would cause errors for multiple definitions.
It is initialized in utils.o since it is defined in utils.cpp. Note that
it is correctly declare extern in all other translation units.
> Since nobody appears to
> be guaranteeing anything about the order in which the different *.o files
> are intialized, _ex0 should not be used in a static object anywhere, no
> matter what kind of initialization gymnastics you are going to add to
> this.
Huh? Right now the gymnastics is not enough! That doesn't mean that
there is no proper gymnastics.
> > Your patch seems to work, thanks a lot! The patch below seems to fix the
> > problem just as well. By virtue of ex::construct_from_double(double) it
> > should be equivalent to your patch. If you have no objections, I'll
> > commit it.
> >
> > +ex integral::relative_integration_error = 1e-8;
>
> Fine with me!
Committed.
Regards
-richy.
--
Richard B. Kreckel
<http://www.ginac.de/~kreckel/>
More information about the GiNaC-devel
mailing list