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