On 15/04/2021 11:40, Alex Peshkoff via Firebird-devel wrote: > On 4/15/21 2:33 PM, Adriano dos Santos Fernandes wrote: > >>>> I have tested with common/classes/init.cpp and this solved the specific >>>> problem I had with Boost.Test: >>>> >>>> Cleanup global __attribute__ ((init_priority (2000))); >>> As far as I can see from documentation init_priority works only inside >>> simgle file. It might affect global order as side effect but (correct me >>> if I'm wrong) nobody guarantees cross-file order of ctors (and dtors - >>> actually we care about it). >>> >> As I said, documentation is very brief (bad) and I had the same doubts. >> >> But tested with clang, it works across translation units. > > What about gcc? >
Tested with it and same happens. >> >> I had defined objects with init_priority 5000, 5500 and 5400 (in this >> order) in two different .cpp files (one in common library, another in >> yvalve specific code). >> >> Order of construction was: >> >> 5000 (yvalve) >> 5000 (common) >> 5400 (yvalve) >> 5400 (common) >> 5500 (yvalve) >> 5500 (common) > > Just to make sure - if you change 5000 to 6000 will that object move to > the end? > If yes - that's getting really interesting. > Yes. > > Can you send me full test (or patch)? I want ot test on Android. > Attached test. Here is results (init.cpp is showed many times because it's included in many libraries): ---- $ isql t.fdb CtorDtorDebug::CtorDtorDebug - utl.cpp 5000 CtorDtorDebug::CtorDtorDebug - init.cpp 5000 CtorDtorDebug::CtorDtorDebug - utl.cpp 5400 CtorDtorDebug::CtorDtorDebug - init.cpp 5400 CtorDtorDebug::CtorDtorDebug - utl.cpp 5500 CtorDtorDebug::CtorDtorDebug - init.cpp 5500 CtorDtorDebug::CtorDtorDebug - utl.cpp 6000 CtorDtorDebug::CtorDtorDebug - init.cpp 6000 CtorDtorDebug::CtorDtorDebug - init.cpp 5000 CtorDtorDebug::CtorDtorDebug - init.cpp 5400 CtorDtorDebug::CtorDtorDebug - init.cpp 5500 CtorDtorDebug::CtorDtorDebug - init.cpp 6000 CtorDtorDebug::CtorDtorDebug - init.cpp 5000 CtorDtorDebug::CtorDtorDebug - init.cpp 5400 CtorDtorDebug::CtorDtorDebug - init.cpp 5500 CtorDtorDebug::CtorDtorDebug - init.cpp 6000 CtorDtorDebug::CtorDtorDebug - init.cpp 5000 CtorDtorDebug::CtorDtorDebug - init.cpp 5400 CtorDtorDebug::CtorDtorDebug - init.cpp 5500 CtorDtorDebug::CtorDtorDebug - init.cpp 6000 CtorDtorDebug::CtorDtorDebug - init.cpp 5000 CtorDtorDebug::CtorDtorDebug - init.cpp 5400 CtorDtorDebug::CtorDtorDebug - init.cpp 5500 CtorDtorDebug::CtorDtorDebug - init.cpp 6000 Database: t.fdb, User: SYSDBA SQL> SQL> SQL> SQL> CtorDtorDebug::~CtorDtorDebug - init.cpp 6000 CtorDtorDebug::~CtorDtorDebug - init.cpp 5500 CtorDtorDebug::~CtorDtorDebug - init.cpp 5400 CtorDtorDebug::~CtorDtorDebug - init.cpp 5000 CtorDtorDebug::~CtorDtorDebug - init.cpp 6000 CtorDtorDebug::~CtorDtorDebug - init.cpp 5500 CtorDtorDebug::~CtorDtorDebug - init.cpp 5400 CtorDtorDebug::~CtorDtorDebug - init.cpp 5000 CtorDtorDebug::~CtorDtorDebug - init.cpp 6000 CtorDtorDebug::~CtorDtorDebug - init.cpp 5500 CtorDtorDebug::~CtorDtorDebug - init.cpp 5400 CtorDtorDebug::~CtorDtorDebug - init.cpp 5000 CtorDtorDebug::~CtorDtorDebug - init.cpp 6000 CtorDtorDebug::~CtorDtorDebug - init.cpp 5500 CtorDtorDebug::~CtorDtorDebug - init.cpp 5400 CtorDtorDebug::~CtorDtorDebug - init.cpp 5000 CtorDtorDebug::~CtorDtorDebug - init.cpp 6000 CtorDtorDebug::~CtorDtorDebug - utl.cpp 6000 CtorDtorDebug::~CtorDtorDebug - init.cpp 5500 CtorDtorDebug::~CtorDtorDebug - utl.cpp 5500 CtorDtorDebug::~CtorDtorDebug - init.cpp 5400 CtorDtorDebug::~CtorDtorDebug - utl.cpp 5400 CtorDtorDebug::~CtorDtorDebug - init.cpp 5000 CtorDtorDebug::~CtorDtorDebug - utl.cpp 5000 ---- > > It should be given init_priority 0 or 1, that code must execute very-very first. > As default is 65535, I just used some smaller value. We should better probably avoid a too low value to not interfere with things of the CRT. Adriano
diff --git a/src/common/classes/init.cpp b/src/common/classes/init.cpp index c2898554c2..403e2251f2 100644 --- a/src/common/classes/init.cpp +++ b/src/common/classes/init.cpp @@ -366,3 +366,8 @@ namespace Firebird } } } + +static CtorDtorDebug ctorDtorDebug1 __attribute__ ((init_priority (6000))) ("init.cpp 6000"); +static CtorDtorDebug ctorDtorDebug2 __attribute__ ((init_priority (5000))) ("init.cpp 5000"); +static CtorDtorDebug ctorDtorDebug3 __attribute__ ((init_priority (5500))) ("init.cpp 5500"); +static CtorDtorDebug ctorDtorDebug4 __attribute__ ((init_priority (5400))) ("init.cpp 5400"); diff --git a/src/common/classes/init.h b/src/common/classes/init.h index 7bb2952cad..a37a9bb2fe 100644 --- a/src/common/classes/init.h +++ b/src/common/classes/init.h @@ -336,4 +336,20 @@ public: } //namespace Firebird +struct CtorDtorDebug +{ + CtorDtorDebug(const char* aMsg) + : msg(aMsg) + { + printf("CtorDtorDebug::CtorDtorDebug - %s\n", msg); + } + + ~CtorDtorDebug() + { + printf("CtorDtorDebug::~CtorDtorDebug - %s\n", msg); + } + + const char* msg; +}; + #endif // CLASSES_INIT_INSTANCE_H diff --git a/src/yvalve/utl.cpp b/src/yvalve/utl.cpp index 3f09935829..1bea6b4eff 100644 --- a/src/yvalve/utl.cpp +++ b/src/yvalve/utl.cpp @@ -3510,3 +3510,8 @@ namespace Why } } #endif + +static CtorDtorDebug ctorDtorDebug1 __attribute__ ((init_priority (6000))) ("utl.cpp 6000"); +static CtorDtorDebug ctorDtorDebug2 __attribute__ ((init_priority (5000))) ("utl.cpp 5000"); +static CtorDtorDebug ctorDtorDebug3 __attribute__ ((init_priority (5500))) ("utl.cpp 5500"); +static CtorDtorDebug ctorDtorDebug4 __attribute__ ((init_priority (5400))) ("utl.cpp 5400");
Firebird-Devel mailing list, web interface at https://lists.sourceforge.net/lists/listinfo/firebird-devel