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

Reply via email to