[GiNaC-devel] remove_dirac_ONE() and documentation patches
Vladimir V. Kisil
kisilv at maths.leeds.ac.uk
Sun Jun 9 20:20:27 CEST 2019
Dear Alexey,
Many thanks for the detailed advise. In fact I have already
fixed my application by calling a local substitute of
GiNaC::remove_dirac_ONE(). Since scalarisation like x*ONE - > x (or
checking if it is possible at all) is a rather common task, I thought
a user can benefit from non-throwing version in GiNaC. But I am not
insisting by any means.
Shall I write a documentation patch advising a user to make cut&paste
of the GiNaC code of remove_dirac_ONE() if they will meet this type of
problem?
Best wishes,
Vladimir
--
Vladimir V. Kisil http://www.maths.leeds.ac.uk/~kisilv/
Book: Geometry of Mobius Transformations http://goo.gl/EaG2Vu
Software: Geometry of cycles http://moebinv.sourceforge.net/
>>>>> On Sat, 08 Jun 2019 10:25:36 +0400, Alexey Sheplyakov <asheplyakov at yandex.ru> said:
ASh> Hi,
ASh> 07.06.2019, 11:45, "Vladimir V. Kisil"
ASh> <kisilv at maths.leeds.ac.uk>:
>>>>>>> On Wed, 05 Jun 2019 20:51:10 +0100, "Vladimir V. Kisil"
ASh> <kisilv at maths.leeds.ac.uk> said:
>>
VVK> Dear All, I finally managed to check Alexey's proposition to
VVK> wrap the throwing remove_dirac_ONE function. It indeed prevents
VVK> my Windows app from crashing. Thus I attach the respective
VVK> light-weighted patches.
>>
>> Apology to everyone: the previously sent version had a debugging
>> printout. The clean patch is attached now.
ASh> I think the 1st and the 2nd patches are OK and can be applied.
ASh> The one which adds a non-throwing remove_dirac_ONE() is much
ASh> better too, however, I don't think adding non-throwing variant
ASh> of every GiNaC method and function is a good idea. Instead I
ASh> suggest to fix the application itself (more details below).
>> Thanks for further comment. Before making the respective change
>> to the patch I wish to discuss the crash. It is indeed look
>> strange (and took time to debug), but presence of exception
>> within the GiNaC library was not an issue, but calling those
>> methods from another library produced a crash. I do not
>> understand coding well, by my guess would be that a Qt
>> application run each library in a separate thread
ASh> Nope, Qt applications don't (and can't) do that
>> and exceptions are fine within one tread.
ASh> Not only it's not right, it's not even wrong.
ASh> ELF (Linux' binaries/shared libraries files format) and PE/COFF
ASh> (windows' executables/shared libraries format) use completely
ASh> different paradigms for run-time loading of code.
ASh> ELF shared library contains code to be used by the program, and
ASh> also the names of functions and data that it expects to find in
ASh> other shared libraries and/or the program. When the shared
ASh> library A is joined to the program, all references to those
ASh> functions and data in A's code are changed to point to the
ASh> actual locations in other shared libraries and the program
ASh> where the functions and data are placed in memory. This is
ASh> basically a usual link operation.
ASh> On the other hand PE/COFF shared library (DLL) is sort of
ASh> self-contained: access to external functions and data goes
ASh> through a lookup table (of that DLL). So the DLL code does not
ASh> have to be fixed up at runtime to refer to the program’s
ASh> memory; instead, the code already uses the DLL’s lookup table,
ASh> and the lookup table is modified at runtime to point to the
ASh> functions and data.
ASh> The key difference is that each DLL has its own lookup table,
ASh> and ELF has (sort of) a single lookup table for a whole
ASh> program.
ASh> Thus if a program uses two DLLs, A and B, malloc/free functions
ASh> referenced by DLL A can be different from malloc/free functions
ASh> used by DLL B. If such a program ends up allocating memory in
ASh> DLL A and releasing it in DLL B, the result is (typically) a
ASh> crash.
ASh> A similar problem exists with C++ exceptions. The internal data
ASh> used to find the matching catch block and perform stack
ASh> unwinding are highly compiler-specific and may use global
ASh> variables and heap. Thus if all DLLs aren't sharing C++ runtime
ASh> cross-DLL exception (throwing an exception in DLL A and
ASh> catching it in DLL B) is a problem (most likely crash).
ASh> To recap: on windows exceptions are fine
ASh> - within the same DLL - across DLLs sharing the same (C/C++)
ASh> runtime
ASh> Hope this helps, Alexey
ASh> _______________________________________________ GiNaC-devel
ASh> mailing list GiNaC-devel at ginac.de
ASh> https://www.cebix.net/mailman/listinfo/ginac-devel
More information about the GiNaC-devel
mailing list