comp.lang.ada
 help / color / mirror / Atom feed
From: ahlan.marriott@gmail.com
Subject: Re: How to kill GNAT DLL initialization?
Date: Wed, 10 Aug 2016 13:18:24 -0700 (PDT)
Date: 2016-08-10T13:18:24-07:00	[thread overview]
Message-ID: <bdc022a5-c2fa-4110-a997-afd4196a4977@googlegroups.com> (raw)
In-Reply-To: <nof82e$1oat$1@gioia.aioe.org>

On Wednesday, 10 August 2016 14:52:33 UTC+2, Dmitry A. Kazakov  wrote:
> As it seems GNAT DLL may not have initialization code invoked in 
> DllMain. This inevitable deadlocks RTS. Removing user library-level 
> tasks does not help. The RTS itself contains library-level tasks. E.g. 
> when asynchronous select is used.
> 
> Now the question is how to kill calls to initialization code from DllMain.
> 
>     for Library_Auto_Init use "false";
> 
> Is not enough. Are there other attributes I missed?
> 
> (Maybe there is a way to remove DllMain from the external symbols list 
> during linking?)
> 
> -- 
> Regards,
> Dmitry A. Kazakov
> http://www.dmitry-kazakov.de

Dear Dmitry,

We produce DLLs written using GNAT that are used by other languages - typically C++
We don't explicitly run any initialisation code, the main procedure is always empty.
(although this is probably a left over from our ObjectAda days)
If something has to be initialised then we put this into a procedure, export it and request that our C++ user calls this before calling any other routine.

Here is a typical Gpr file for one of our Dlls.

-------
project Monitor is

   package Naming is
      for Casing use "mixedcase";
   end Naming;

   for Library_Name use "Monitor";
   for Shared_Library_Prefix use "";

   for Source_Dirs use ("W:\Source\Ada\Interfaces\Monitor",
                        "W:\Source\Ada\Interfaces",
                        "W:\Source\Ada\Shared",
                        "W:\Source\Ada\Open\Shared",
                        "W:\Source\Ada\Open\Shared\Windows");

   for Library_Interface use ("Monitor_Interface");

   for Object_Dir use "objects";

   for Library_Options use ("-LW:\Product\Windows", "resources.o");
   for Library_Dir use "W:\Product\Windows";
   for Library_Ali_Dir use "D:\Binary\Ada\Interfaces\Monitor";
   for Library_Kind use "dynamic";
   for Library_Standalone use "encapsulated";

   package Pretty_Printer is
      for Default_Switches ("ada") use ("-i2", "-M120", "-aL", "-A1", "-A4");
   end Pretty_Printer;

   package Builder is
      for Default_Switches ("ada") use ("-s", "-g");
   end Builder;

   package Compiler is
      for Default_Switches ("ada") use
         ("-O1", "-gnatQ", "-gnata", "-gnato", "-g", "-gnat12",
          "-gnatwcehijkmopruvz.c.n.p.t.w.x", "-gnatykmpM120");
   end Compiler;

   package Binder is
      for Default_Switches ("ada") use ("-E");
   end Binder;

end Monitor;

-------

and the main package.

-------
with Monitor_Interface; --> UD: Drag in Code

procedure Monitor is
begin
  null;
end Monitor;
-------

Monitor_Interface ads exports all the procedures that the DLL provides and the Adb implements them.

Hoping this helps,
MfG
Ahlan

  reply	other threads:[~2016-08-10 20:18 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-10 12:51 How to kill GNAT DLL initialization? Dmitry A. Kazakov
2016-08-10 20:18 ` ahlan.marriott [this message]
2016-08-11  7:31   ` Dmitry A. Kazakov
2016-08-12  7:56     ` ahlan.marriott
2016-08-12 10:10       ` Dmitry A. Kazakov
2016-08-13  8:59         ` ahlan.marriott
2016-08-13 19:05           ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox